ulimit命令介绍 - linux

半兽人 发表于: 2019-03-15   最后更新时间: 2021-04-01 10:51:54  
{{totalSubscript}} 订阅, 4,155 游览

Linux对于每个用户,系统限制了其最大进程数。为提高性能,可以根据设备资源情况,设置每个linux用户的最大进程数。

参数 描述
ulimited 不限制用户可以使用的资源,但本设置对可打开的最大文件数(max open files)
和可同时运行的最大进程数(max user processes)无效
-a 列出所有当前资源极限
-c 设置core文件的最大值。单位:blocks
-d 设置一个进程的数据段的最大值。单位:kbytes
-f Shell 创建文件的文件大小的最大值,单位:blocks
-h 指定设置某个给定资源的硬极限。如果用户拥有 root 用户权限,可以增大硬极限。任何用户均可减少硬极限
-l 可以锁住的物理内存的最大值
-m 可以使用的常驻内存的最大值,单位:kbytes
-n 每个进程可以同时打开的最大文件数
-p 设置管道的最大值,单位为block,1block=512bytes
-s 指定堆栈的最大值:单位:kbytes
-S 指定为给定的资源设置软极限。软极限可增大到硬极限的值。如果 -H 和 -S 标志均未指定,极限适用于以上二者
-t 指定每个进程所使用的秒数,单位:seconds
-u 可以运行的最大并发进程数
-v Shell可使用的最大的虚拟内存,单位:kbytes
-x

资源描述

可以用ulimit -a来显示当前的各种用户进程限制。

# ulimit -a
core file size          (blocks, -c) 100
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14598
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 2047
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
参数 描述
core file size core文件的最大值为100 blocks,
data seg size 进程的数据段可以任意大
file size 文件可以任意大
pending signals 最多有14598个待处理的信号
max locked memory 一个任务锁住的物理内存的最大值为64kB
max memory size 一个任务的常驻物理内存的最大值
open files 每个进程可以打开最大文件描述符的数量,一个任务最多可以同时打开1024的文件
pipe size 管道的最大空间为4096字节
POSIX message queues POSIX的消息队列的最大值为819200字节
stack size 进程的栈的最大值为8192字节
cpu time 进程使用的CPU时间
max user processes 当前用户同时打开的进程(包括线程)的最大个数为2047
virtual memory 没有限制进程的最大地址空间
file locks 所能锁住的文件的最大个数没有限制

例子1

Java 应用程序,对于需要做许多 socket 连接并使它们处于打开状态的,则需要调整linux当前用户最大打开的个数。

下面我把某个linux用户的最大进程数设为10000个:

ulimit -u 10000

其他建议设置成无限制(unlimited)的一些重要设置是:

  • 数据段长度:ulimit -d unlimited
  • 最大内存大小:ulimit -m unlimited
  • 堆栈大小:ulimit -s unlimited
  • CPU 时间:ulimit -t unlimited
  • 虚拟内存:ulimit -v unlimited

这只是暂时地,永久地,则通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件中, 即特定于 shell 的用户资源文件,如:

  1. 解除 Linux 系统的最大进程数和最大文件打开数限制:

    vi /etc/security/limits.conf
    # 添加如下的行
    * soft noproc 11000
    * hard noproc 11000
    

    上边两行可以用一行代替 * - noproc 11000

    -的意思为softhard全部限制。

    * soft nofile 4100
    * hard nofile 4100
    

    说明:* 代表针对所有用户,noproc 是代表最大进程数,nofile 是代表最大文件打开数

  2. 让 SSH 接受 Login 程式的登入,方便在 ssh 客户端查看 ulimit -a 资源限制:
    a. vi /etc/ssh/sshd_config
    UserLogin的值改为yes,并把#注释去掉
    b. 重启 sshd 服务:
    /etc/init.d/sshd restart

  3. 修改所有 linux 用户的环境变量文件:

    vi /etc/profile
    ulimit -u 10000
    ulimit -n 4096
    ulimit -d unlimited
    ulimit -m unlimited
    ulimit -s unlimited
    ulimit -t unlimited
    ulimit -v unlimited
    

    保存后运行source /etc/profile使其生效

例子2

通过ulimit命令来限制文件的大小,从而导致拷贝命令的失败

# ls temp.txt
ls: temp.txt: 没有那个文件或目录
# ulimit -f 1 #设置创建文件的最大块(一块=512字节)
# cat a.c > temp.txt

文件大小超出限制,文件a.c的大小是5002字节,而我们设定的创建文件的大小是512字节x1块=512字节

例3:Linux下一个进程可以开多少线程

一、ulimit -n可以查看一个进程最多可以打开多少文件描述符数;

二、一个进程最多可以产生多少线程,可用如下的方法:

32位linux系统最大内存地址4G,0-3GB的给用户进程(User Space)使用,3-4GB给内核使用的。

stack size (kbytes,-s)10240表示线程堆栈大小,3G/10M=最大线程数

但实际会比这个数小一点,因为程序本身占内存,还有些管理线程,可以使用ulimit -s来设置stack size,设置的小一点开辟的线程就多。

同时,/usr/include/bits/local_lim.h中的PTHREAD_THREADS_MAX限制了进程的最大线程数,

/proc/sys/kernel/threads-max中限制了系统的最大线程数。

三、最靠谱的方法还是自己写程序测试的结果

#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>
#include<stdio.h>

void* foo(void* param)
{
}

int main()
{
   int i = 0;
   pthread_t thread;
   while (1) {
           if (pthread_create(&thread, NULL, foo, NULL) != 0)
                   break;
           i ++;
   }
   printf("i = %d\n", i);
}

编译命令如下:

g++ main.cpp -o main -lpthread

执行结果:

[root@localhost]# ./main
i = 32747

公司的服务器:

限制数为:2^19
实际测试结果:2^16

更新于 2021-04-01

查看Linux更多相关的文章或提一个关于Linux的问题,也可以与我们一起分享文章