简介
ulimit 是 Linux 的内建命令,用来限制 shell 及 shell 启动的进程所使用的资源。支持硬限制和软限制,硬限制是绝对限制,一旦设置后,非 root 用户就不能提高,而软限制能最多提高到硬限制的值,超过软限制会产生警告。使用 -H
选项指定硬限制,使用 -S
选项指定软限制。
支持多种资源限制,如常用的有:能打开的文件数量,线程栈大小,进程数量等。
使用
查询限制
查询所有限制。打印时如果不指定硬限制或软限制,则打印软限制。
ulimit -a
查询某一个限制或者组合查询多个。
# 查询用户可以打开的最大文件数(软限制)
ulimit -n
# 同 ulimit -n -S
# 查询用户可以打开的最大文件数(硬限制)
ulimit -n -H
限制参数如下所示:
- -c:最大 core 文件大小,单位是 blocks
- -d:进程最大的数据段的大小,单位是 KB
- -e:最大调度优先级
- -f:进程及其子进程能够创建的文件的最大值,单位是 blocks
- -i:待处理信号的最大数量
- -l:可加锁内存的最大数量,单位是 KB
- -m:最大驻留内存大小(许多系统不遵守此限制),单位是 KB
- -n:能打开的文件描述符的最大数量
- -p:管道缓冲区的大小,以 512 byte 为单位
- -q:POSIX 报文队列的最大字节数,单位是 byte
- -r:最大实时调度优先级
- -s:最大线程栈大小,单位是 KB
- -t:最大 CPU 占用时间,单位是秒
- -u:单个用户的最大可用进程数
- -v:进程可用的最大虚拟内存,单位是 KB
- -x:文件锁的最大数量
设置限制
在命令后面加上限制的值即可设置限制,设置时如果不指定硬限制或软限制,则同时设置硬限制和软限制。
# 同时设置硬限制和软限制
ulimit -n 65535
# 设置软限制
ulimit -S -n 65535
# 可以在一个命令中设置多个值
ulimit -d 1000 -m 1000 -v 1000
# 可以使用 unlimited 修改为无限制
ulimit -t unlimited
命令设置只对当前 shell 生效。要想长期对 shell 生效,可以将相关命令加入启动脚本中,或者修改系统配置文件 /etc/security/limits.conf
。
文件内容大致如下所示:
文件为表格形式,格式为
<domain> <type> <item> <value>
- domain 可以为
- 用户名
- 用户组名,使用 @group 语法
- 通配符 * 作为默认值
- 通配符 % 也可与 %group 语法一起使用,表示最大登录限制
- type 可以为
- soft:软限制
- hard:硬限制
- item 可以是下列资源
- core:core 文件大小,单位是 KB
- data:最大数据大小,单位是 KB
- fsize:最大文件大小,单位是 KB
- memlock:可加锁内存,同 -l
- nofile:能打开的文件描述符数量,同 -n
- rss:驻留内存大小,同 -m
- stack:线程栈大小,同 -s
- cpu:CPU 占用时间,同 -t
- nproc:进程数,同 -u
- as:地址空间限制,单位是 KB
- maxlogins:用户最大登陆数量
- maxsyslogins:系统最大登陆数量
- priority:进程运行优先级
- locks:用户可持有的最大文件锁数量,同 -x
- sigpending:待处理信号数量,同 -i
- msgqueue:POSIX 报文队列的最大字节数,同 -q
- nice:最大可提升的优先级,同 -e
- rtprio:最大实时调度优先级,同 -r
- value 为设置的值
修改配置文件后需要重启 shell,可使用 -a 查看是否生效。
案例
Elasticsearch 启动后会同时打开多个数据文件以加速搜索,需要设置 nofile 及 nproc,如果不设置,会产生诸如 “max file descriptors [4096] for elasticsearch process is too low” 这样的错误。需要将 nofile 至少调到 65535,nproc 至少调到 4096。
由于 Linux 下建立 Socket 连接也需要创建文件描述符,因此如果系统有建立了大量连接,也可能因为 nofile 限制过低导致无法建立新的连接,而导致网络请求失败。