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
对各资源项进行简要解释
open file (-n)
打开fd数量的限制,网络服务器要支持百万级别并发,这个值必须要修改。
core file size (-c)
默认是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文件大小的上限制做更精确的设定。
scheduling priority (-e)
默认的nice值,默认为0。
max user processes (-u)
最大用户进程数。
stack size (-s)
进程最大stack size,默认8MiB。
virtual memory (-v)
设置进程的最大虚拟内存空间大小。默认是没有限制,在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 --