十几年前,硬件资源有限,为了保障服务器稳定地运行,使用ulimit
命令限制进程对资源的使用。但现在硬件性能已经大大提升,ulimit的默认值让服务器难以发挥最佳性能。例如,高负载的Web服务器、数据库服务器都需要对可使用的文件描述符的最大数量
和用户最大可用进程数
进行调整以发挥最佳性能。
ulimit命令选项及含义
参数名 | 对应选项 | 含义 |
---|---|---|
-a | 显示当前系统所有的limit资源信息,ulimit -a | |
core file size | -c | 内核core文件的大小限制,单位为blocks |
file size | -f | 进程可以创建文件的最大值,单位为blocks |
data seg size | -d | 进程最大数据段的大小,单位为KB |
max memory size | -m | 进程可使用内存大小,单位为KB |
open files | -n | 用户可使用的文件描述符的最大数量 |
stack size | -s | 最大堆栈大小,单位为KB |
pipe size | -p | 管道缓冲区大小,单位为KB |
max user processes | -u | 用户最大可用进程数 |
virtual memory | -v | 进程最大可用虚拟内存,单位为KB |
cpu time | -t | 最大CPU占用时间,单位为秒 |
max locked memory | -l | 最大加锁内存大小,单位为KB |
ulimit的多种使用方式
-
将命令加入用户环境变量中
修改用户主目录下的
.bashrc
或.bash_profile
,在其中加入ulimit -u 7154
来限制用户最大可用进程数。 -
将命令加入启动应用程序的bash脚本中
如在Tomcat启动脚本startup.sh中加入
ulimit -n 65535
来限制用户可以使用的文件描述符的最大数量。 -
在终端命令行执行ulimit命令
直接在终端命令行执行ulimit进行资源限制仅在当前终端生效,不影响其他终端,且在关闭终端后,设置失效。
-
统一在
/etc/security/limits.conf
文件中配置,使用规则如下:
#格式:<domain> <type> <item> <value>
#domain:表示用户或组的名字,还可以使用*作为通配符,表示所有用户。
#type:表示限制类型,soft表示软资源限制,设置后可以超过软资源限制,但是不能超过硬资源限制;hard表示硬资源限制,一旦设置不能超过限制。
#item:表示需要限定的资源名称,常用的有nofile(用户可用文件描述符最大数量)、CPU(占用CPU时间)、statck(最大堆栈大小)、noproc(用户最大可用进程数)等。
#value:表示限制资源的具体值。
#举例:
* soft noproc 65535
* hard noproc 65535
* soft nofile 65535
* hard nofile 65535
ulimit使用注意事项
修改完配置文件后要退出SSH终端,重新登录会话才能生效。
除了limits.conf
还有一个/etc/security/limits.d
目录,系统会默认优先读取并使用这个目录下的配置文件,再读取limits.conf
的配置,如果有重复的配置,以/etc/security/limits.d
目录下的配置文件为准。
正在运行的应用不会读取新添加的ulimit资源限制,在应用重启后资源限制才生效。
ulimit修改可使用文件描述符最大数量
不能超过1048576(1024*1024),如果要提高整个数量需要修改内核参数/etc/sys/fs/nr_open
。
limits.conf文件中的配置对systemctl启动的服务是不生效的。
对于systemd管理的服务,全局配置需要修改/etc/systemd/system.conf
或/etc/systemd/user.conf
:
#在配置文件中添加如下内容,修改配置后,重启系统生效
DefaultLimitNOFILE=655360
DefaultLimitNPROC=655360
如果只修改单个服务的资源限制,以Nginx为例,需编辑/usr/lib/systemd/system/nginx.service
:
#找到[Service段],添加如下配置
[Service]
LimitNOFILE=655360
LimitNPROC=655360
#运行如下命令,配置立即生效
systemctl daemon-reload
systemctl restart nginx.service
欢迎大家关注我,更多Linux干货等着你!