详解ulimit命令

Last Updated: 2023-09-27 12:06:24 Wednesday

-- TOC --

ulimit为shell内建指令,可用来控制shell及其所派生的进程的相关资源限制。

显示可控的资源限制

$ 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) 7300
max locked memory       (kbytes, -l) 65536
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) 7300
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

上面显示出来的每个options,可分别用来查看某个单独资源配置项的值,也可以用来设置该项资源。

查看或设置单项资源

$ ulimit -c  # 查看coredump的设置
0
$ ulimit -n 4096  # 设置并查看open file数量限制
$ ulimit -n
4096

对各资源项进行简要解释

打开fd数量的限制,网络服务器要支持百万级别并发,这个值必须要修改。

默认是0,就是不产生core dump file!

当系统中的一些程序在遇到某些错误或crash时,系统会自动产生coredump文件,记录crash时刻系统信息,包括内存和寄存器信息,用以程序员日后debug时可以使用。这些错误包括segmentation fault、非法指令、总线错误或用户自己生成的退出信息等等。一般地,现在coredump文件需要用systemd转存后再使用,因为现在Linux发行版本,基本都使用systemd。

我们可以使用ulimit命令对coredump文件的大小进行设定。一般默认情况下,core文件的大小被设置为0,这样系统就不dump出core文件了。这时,使用命令:

$ ulimit -c unlimited

进行设置,就可以把core文件的大小设置为无限大,同时也可以使用数字来替代unlimited,对coredump文件大小的上限制做更精确的设定。

默认的nice值,默认为0。

最大用户进程数。

进程最大stack size,默认8MiB。

设置进程的最大虚拟内存空间大小。默认是没有限制,在64位系统下,几乎无限大。通过此配置项,可以间接限制单个进程占用物理内容的大小。我个人觉得,这个配置项的另一个很有益的作用,就是修改小后,用来测试软件在小内存(内存不足)的情况下的表现。

比如,当Python遇到内存不足的时候,会抛出MemoryError异常:

>>> import sys
>>> a = []
>>> try:
...   for i in range(1000000000):
...     a.append(i)
... except MemoryError:
...   print('OOM')
...   sys.exit(224)
...
OOM

用同样的方法,测试C++代码,很容易就能跑出new抛出的std::bad_alloc异常。

设置配置的永久生效

用ulimit命令所做的修改,只对当前terminal生效!要永久生效,需修改/etc/security/limits.conf文件。

本文链接:https://cs.pynote.net/sf/linux/shell/202203281/

-- EOF --

-- MORE --