前言
对于Linux用户或用户组打开的进程,Linux系统会对进程可占用的资源进行限制。该限制针对特定Linux用户或用户组,限制范围是该Linux用户或用户组打开的所有进程。
遇到的异常
nginx转发的流量比较大。因此在nginx.conf中,存在如下配置:
worker_rlimit_nofile 131072;
event {
use epoll;
multi_accept on;
worker_connections 65536;
}
运行nginx之后,在error.log日志中有如下异常:
worker process xxx exited on signal 25:setrlimit(RLIMIT_NOFILE 131072)failed(1:operation not permitted)
明确问题
nofile是Linux系统的参数,用于限制用户使用的系统资源。异常提示进程尝试获取一定量的资源,但是权限不够,由此推断是系统允许进程使用的资源小于进程尝试获取的资源。
查看Linux对nginx进程的nofile的限制
#查看Linux系统对nginx进程(master进程和worker进程)的max open files
cat /proc/$(cat /usr/local/nginx/logs/nginx.pid)/limits|grep open.files
得到如下输出:
# soft limits # hard limits
Max open files 1024 1024 files
可以看到Linux系统对于Max open files的hard limits是1024,小于在nginx.conf中设置的值131072。
解决问题:调整Linux对特定用户的nofile的限制
需修改下列两个文件中的其中一个。
/etc/security/limits.conf
该文件的格式如下:
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain> <type> <item> <value>
#
#Where:
#<domain> can be:
# - a user name
# - a group name, with @group syntax
# - the wildcard *, for default entry
# - the wildcard %, can be also used with %group syntax,
# for maxlogin limit
#
#<type> can have the two values:
# - "soft" for enforcing the soft limits
# - "hard" for enforcing hard limits
#
#<item> can be one of the following:
# - core - limits the core file size (KB)
# - data - max data size (KB)
# - fsize - maximum filesize (KB)
# - memlock - max locked-in-memory address space (KB)
# - nofile - max number of open file descriptors
# - rss - max resident set size (KB)
# - stack - max stack size (KB)
# - cpu - max CPU time (MIN)
# - nproc - max number of processes
# - as - address space limit (KB)
# - maxlogins - max number of logins for this user
# - maxsyslogins - max number of logins on the system
# - priority - the priority to run user process with
# - locks - max number of file locks the user can hold
# - sigpending - max number of pending signals
# - msgqueue - max memory used by POSIX message queues (bytes)
# - nice - max nice priority allowed to raise to values: [-20, 19]
# - rtprio - max realtime priority
#
#<domain> <type> <item> <value>
#
#* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
domain:限制范围。可以是用户、用户组或所有用户。
type:可以是soft或者hard。如果进程尝试获取的资源数量超过hard limits,该进程会报错;soft limits是用户进程启动后的默认值(如果不在进程的配置文件中配置)。
item:见文件示例。要在CPU和内存未成为瓶颈时提升nginx性能,要调大启动nginx的用户的nofile和nproc。
value:具体数值。
/etc/security/limits.d/
该目录下可针对特定的item,对用户进行限制。文件内容的格式参照limits.conf,文件名的格式为“IP的最后一位-limits.conf中的item.conf”,例如20-nproc.conf。
重启机器
必须要重启,否则修改不生效!!!
验证修改是否生效
- 重启进程;
- 查看Linux系统对nginx的worker线程的资源限制,来确定修改是否生效。命令如下:
#/usr/local/nginx/logs/nginx.pid是nginx的master的进程号所在的文件
ps --ppid $(cat /usr/local/nginx/logs/nginx.pid) -o %p|sed '1d'|xargs -I{} cat /proc/{}/limits|grep open.files
注意
- /etc/security/limits.d的配置会覆盖/etc/security/limits.conf中的配置。
- 如果只修改上述配置文件,而不重启服务器,修改后的hard limits不生效
- 使用ulimit查到的结果,不论命令是否带有-H,都不可证明修改已生效。
ulimit命令
- 非root用户执行ulimit命令时如果不加“-H”,默认操作(查看和修改)soft limits。任何用户都可修改soft limits,修改后的值立即生效,同一用户再次登录时失效。
- root用户执行ulimit命令时如果不加“-H”,同时修改soft limits和hard limits。
- nofile不可以是unlimited、负数或者超过Linux系统允许的上限(否则只可在单用户模式下,用对应的用户登录服务器)。
- 可用下面两个命令查看当前用户的nofile的soft limits和hard limits
#获取当前用户的nofile的soft limits
ulimit -Sn
#获取当前用户的nofile的hard limits
ulimit -Hn
linux内核对各参数上限的限制(待补全)
nofile:1024*1024(2.6.25内核之前)。如果是2.6.25之后的内核,使用该命令查询:
cat /proc/sys/fs/nr_open
nproc:是该命令返回的结果的一半:
cat /proc/sys/kernel/thread-max
即使设置的值超过了上限,系统也不给超出上限的资源。
标签:limits,max,hard,调大,nofile,nginx,调优,soft From: https://www.cnblogs.com/yezi2023/p/17919790.html