通过netstat -anlp|wc -l 查看到大量tcp连接;
过滤netstat -anlp|grep WAIT|wc -l 其中的WAIT会话比较多;可通过增加ulimit优化处理能力;
open files 设置的是单进程可打开的最大文件句柄数.

1.查看用户级别的系统配置

ulimit -a
查询用户级别的open file文件符号限制数
ulimit -n

在nginx默认配置中:一个process,1024个连接。在并发时很容易超过此数字,可适当调整此配置及nginx的配置。

查询进程限制数
ulimit -u
一些计算规则

open files 设置的是单进程可打开的最大文件句柄数,即用户可打开的最大文件句柄数是:

(max user processes) * (open files)

当有时发现我们的应用打开了很多文件,或者tcp数很高,但还是能用,原因在于:

没有超过系统最大句柄数限制, 即 (max user processes) * (open files);
没有超过 max user processes 限制;
没有超过单进程最大句柄数设置,即65535;
centos>7属于Systemctl管理的应用,详见下面第3点

则,应用均可正常运行。

# 统计www用户打开的进程数
lsof -u www | awk '{print $2}' | uniq -c | wc -l

#统计www用户打开的占用的所有文件句柄数
 lsof -u www | wc -l

2.修改用户级别的配置

永久生效:

vi /etc/security/limits.conf

在文件内容最后一行,添加如下的行

* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536

说明:* 代表针对所有用户;
noproc 是代表最大进程数;
nofile 是代表最大文件打开数;

另:vi /etc/security/limits.d/-nproc.conf 也可以配置,会覆盖上面的文件配置
修改后退出当前session,重新登录即可看到修改,如果有应用确实受影响,可立即重启服务器生效;

3.使用services的应用【特别注意:systemctl管理】

/etc/security/limits.conf开头说明:

# /etc/security/limits.conf
#
#This file sets the resource limits for the users logged in via PAM.
#It does not affect resource limits of the system services.

在Centos7 & ubuntu 系统中,使用Systemd替代了之前的SysV。/etc/security/limits.conf文件的配置作用域缩小了。

/etc/security/limits.conf的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。
因此登录用户的限制,通过/etc/security/limits.conf与/etc/security/limits.d下的文件设置即可。

对于systemd service的资源设置,则需修改全局配置:
DefaultLimitNOFILE
DefaultLimitNPROC

/etc/systemd/system.conf
/etc/systemd/user.conf
同时也会加载两个对应目录中的所有.conf文件/etc/systemd/system.conf.d/.conf和/etc/systemd/user.conf.d/.conf
system.conf是系统实例使用的,user.conf是用户实例使用的。

vim /etc/systemd/system.conf
DefaultLimitNOFILE=100000
DefaultLimitNPROC=65535
重启系统

通过cat /proc/pid/limits可以看到限制这些服务的大小

4.系统级别的打开文件最大数

max-file:表示系统级别的能够打开的文件句柄的数量。
是对整个系统的限制,并不是针对用户的。此值一般会较大。

cat /proc/sys/fs/file-max
 和
sysctl -a | grep  fs.file-max

echo "fs.file-max = 6553560" >> /etc/sysctl.conf
// 立即生效,此方式永久生效
sysctl -p

容器的限制说明:

docker容器的limit限制,其实依赖于进程docker服务,属于systemctl管理的应用,则所有容器limit最终与docker服务一致;
而docker.service内容中显示infinity不受限制!!
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

临时生效-session有效:

ulimit -n 65536
ulimit -u 65536

退出当前session,会失效;作为临时测试可使用;