ulimit 用于shell启动进程所占用的资源,是 shell 内建命令。

功能说明:控制shell程序的资源。

补充说明:ulimit为shell内建指令,可用来控制shell执行程序的资源。

 

语法格式ulimit  [-acdfHlmnpsStvw]  [size]

参数:

-a   显示目前资源限制的数量

-c   设定core文件的最大值,单位为区块。

-d    <数据节区大小> 程序数据节区的最大值,单位为KB。

-f     <文件大小> shell所能建立的最大文件,单位为区块。

-H  设定资源的硬性限制,也就是管理员所设下的限制。

-m    <内存大小> 指定可使用内存的上限,单位为KB。

-n     <文件数目> 指定同一时间最多可开启的文件数。

-p     <缓冲区大小> 指定管道缓冲区的大小,单位512字节。

-s     <堆叠大小> 指定堆叠的上限,单位为KB。

-S   设定资源的弹性限制。

-t   指定CPU使用时间的上限,单位为秒。

-u    <程序数目> 用户最多可开启的程序数目。

-v    <虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB。

ulimit -a 来查看所有限制值,系统版本为 CentOS Linux release 7.5.1804 (Core) 

# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15077
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
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) 15077
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

 

应用实例:

Linux下写程序的时候,如果程序比较大,经常会遇到“段错误” (segmentation fault)

这样的问题主要就是由于Linux系统初始的堆栈大小(stack size)太小的缘故,一般为10240KB,即 10MB

一般把stack size设置成 20M,这样就没有段错误了!

1、临时修改栈大小

ulimit   -s 20480

 

2、开机修改栈大小

如果要系统自动记住这个配置,就编辑 /etc/profile 或 /etc/rc.local文件,在 “ulimit -S -c 0 > /dev/null 2>&1”行下,添加“ulimit   -s 20480”,保存重启系统就可以了

vim /etc/profile

添加一行后,重启系统

ulimit   -s 20480

 

3、永久修改栈大小重启系统后依然有效

vim /etc/security/limits.conf

添加红色字体一行后,重启系统

#<domain>      <type>  <item>         <value>
#

#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4

# End of file
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
* soft stack 10240

 

修改最大进程数

Linux对于每个用户,系统限制其最大进程数,例如上面默认最大进程数为

max user processes (-u) 15077

为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数,

下面把某linux用户的最大进程数,临时设为30000个:

ulimit -u 30000

或永久设为 30000个:

vim /etc/security/limits.conf

添加两行后,重启系统

* soft noproc 30000
* hard noproc 30000

说明:

* 表示针对所有用户
root 表示管理员用户
noproc 是代表最大进程数
nofile 是代表最大文件打开数

 

修改最大连接数(最大文件打开数)

对于需要做许多 socket 连接并使它们处于打开状态的 Java 应用程序而言,

最好通过使用 ulimit -n xx 修改每个进程可打开的文件数,缺省值是 1024

ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024

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

数据段长度:ulimit -d unlimited

最大内存大小:ulimit -m unlimited

堆栈大小:ulimit -s unlimited

CPU 时间:ulimit -t unlimited

虚拟内存:ulimit -v unlimited
 

core - 限制内核文件的大小

core文件,当一个程序崩溃时,在进程当前工作目录的core文件中复制了该进程的存储图像。

core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。

core文件是个二进制文件,需要用相应的工具(gdb等)来分析程序崩溃时的内存映像。

 

nofile - 打开文件的最大数目

对于需要做许多套接字连接并使它们处于打开状态的应用程序而言,最好通过使用 ulimit –n,或者通过设置nofile 参数,为用户把文件描述符的数量设置得比默认值高一些

 

ulimit 修改为什么对 root 有效,对普通用户无效呢?

看一下/etc/security/limits.conf,你大概就会明白

vim /etc/security/limits.conf

#<domain>      <type>  <item>         <value>
#

#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4

# End of file
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
* soft stack 10240

其中, root 表示管理员,* 表示普通用户,都已经限制好了

linux 对用户有默认的ulimit限制,而这个文件可以配置用户的硬配置和软配置,硬配置是个上限,超出上限的修改就会出“不允许的操作”这样的错误。

 

 

参考推荐:

linux ulimit 调优

通过ulimit改善系统性能

poor man's profiler