之前有笔记记录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/<PID>/limits
查看某个进程的打开文件描述符列表
ls -l /proc/<PID>/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