linux最大进程数和最大打开文件数

之前有笔记记录linux内核参数的介绍和一些优化方法https://sulao.cn/post/494.html,这次的笔记其实还是基于原来的笔记,针对于最大进程数和最大打开文件数的优化,这两个参数的优化在我们日常的优化中比较常见,我们来看看详细介绍

1.最大打开文件数的优化

当在当前系统下提供tcp服务时,在并发持续很高的时候容易产生too many open files错误,这时查看netstat可以发现很多TIME_WAIT状态的链接,这说明大量链接处于半开状态,已经完成了请求响应,并且进入了TCP关闭的四步握手

按照TCP协议要求,在这里需要等待一段时间(两个MSL时间)才能完全释放该链接。每一个TCP链接对应一个文件句柄(即算作一个打开的文件),这就导致进程打开的TCP链接很容易超过允许的最大文件打开数。这时,就需要按照业务要求增加允许的最大打开文件数来增加系统容量。对于Linux来讲,最大打开文件数的设置有两个地方。

1)内核层面

查看方法

cat /proc/sys/fs/file-max

或者

sysctl fs.file-max

如果需要修改系统允许的打开文件数量就修改/etc/sysctl.conf文件,配置fs.file-max的值,如果属性不存在就添加,配置完成后使其生效

sysctl -p

2)用户层面的优化

临时修改方法为

ulimit -n 1024000

永久生效需要修改limits.conf文件

vi /etc/security/limits.conf

*  soft nofile 2048
*  hard nofile 2048

或者

* - nofile 2048 #这个是同时设置soft和hard的值

*代表针对所有用户
noproc是代表最大进程数
nofile是代表最大文件打开数
添加格式:

[username | @groupname] type resource limit

[username | @groupname]:设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。
type:有soft,hard和-,soft指的是当前系统生效的设置值。hard表明系统中所能设定的最大值。soft的限制不能比hard限制高。用-就表明同时设置了soft和hard的值

然后我们还可以使用下面方法查看进程打开的文件

cat /proc//limits

查看某个进程的打开文件描述符列表

ls -l /proc//fd

2.linux最大进程数

ulimit -a
max user processes    (-u) #系统限制某用户下最多可以运行多少进程过线程

这些值代表的含义

root 账号下 ulimit -u 出现到 max user processes 的值 默认是  # cat /proc/sys/kernel/threads-max 的值 / 2,即系统线程数的一半

普通账号下 ulimit -u 出现的 max user processes 的值 默认是 /etc/security/limits.d/20-nproc.conf (centos6 是 90-nproc.conf) 文件中的

我们可以在/etc/security/limits.conf 文件里添加如下内容来达到修改最大进程数的值

vi /etc/security/limits.conf
* soft nproc 65535      #打开进程数
* hard nproc 65535     #打开进程数

修改这里,普通用户 max user processes 值是不生效的,需要修改 /etc/security/limits.d/20-nproc.conf 文件中的值。

如果使用 * 号让全局用户生效是受文件 /etc/security/limits.d/20-nproc.conf 中 nproc 值大小制约的,而如果仅仅是针对某个用户,那么就不受该文件 nproc 值大小的影响。

修改 /etc/security/limits.d/20-nproc.conf 

因为普通用户受这个文件里的值影响

修改为:

*          soft    nproc     65535

其实上面的 max user processes 65535 的值也只是表象,普通用户最大进程数无法达到 65535 ,因为用户的 max user processes 的值,最后是受全局的 kernel.pid_max 的值限制的。也就是说 kernel.pid_max=1024,那么你用户的 max user processes 的值是127426,用户能打开的最大进程数还是1024

查看全局pid_max的方法

cat /proc/sys/kernel/pid_max

或者

sysctl kernel.pid_max

修改这个值方法:

echo 65535 > /proc/sys/kernel/pid_max

上面只是临时生效,重启机器后会失效,永久生效的修改方式如下

vi /etc/sysctl.conf
kernel.pid_max = 65535
sysctl -p


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/760.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。