十几年前,硬件资源有限,为了保障服务器稳定地运行,使用
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
。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iZhJzNlZ2MyQTYhJGM5kzYzUTN1gjY2IGM4QWNkZmMl9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
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干货等着你!