首页 运维 安全 Ulimit的故障怎么解决

Ulimit的故障怎么解决

May 16, 2023 pm 03:39 PM
ulimit

最近遇到一个非常有趣的问题。其中有一组HAProxy,频繁出现问题。登录上服务器,cpu、内存、网络、io一顿猛查。最终发现有超过6万个连接处于机器的TIME_WAIT状态。

Ulimit的故障怎么解决

TIME_WAIT状态,一般都会出现在HAProxy、Nginx这种代理机器上,主要是由于频繁的主动关闭所造成的。通过修改reuse和回收参数,可以比较快速的解决问题。

网络状态的统计数量,可以使用下面的命令进行统计。

netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}' ESTABLISHED 70 FIN_WAIT2 30 CLOSING 33 TIME_WAIT 65520
登录后复制

Ulimit的故障怎么解决

这本来没什么神奇的,但65535这个数字,实在是太过于敏感。应该是触发了某种上限。

使我们更加感到疑惑的是:为什么TIME_WAIT状态的连接,仅仅达到了65535,服务就不可用了?

到处号称的单机百万连接,是在吹牛皮么?怎么这么经不起折腾?

65535,表示等于2的16次方减一,是一个神奇的数字。把这个小数字暂且搁置,我们先了解一下Linux支持多大的连接容量。

1. Linux能够支持多少连接?

答案是无数个。可是端口只有65535个啊。

为什么端口只有65535个?

TCP和UDP协议在开头分别用16位存储源端口号和目标端口号,这是基于历史原因。很遗憾的是,这个值是short类型的,大小也是2^16-1。

因为历史原因造成的不可改变的标准,就是那么根深蒂固。

那Linux到底能支持多少个连接呢?答案是无数个。

拿nginx来说,我们把它监听在80端口上。这时候A机器去连接Nginx,可以发起多达6w多条长连接。如果B机器去连接Nginx,同样也可以发起6w多条连接。这是由于确定一条连接,是由src和dst来共同决定的。

认为Linux只能接受65535条连接的想法,只能说是犯了非常浅显的想当然主义。

65535个端口,作为压测机可能对你来说太小了一些。但对于服务器来说,已经绰绰有余了。

2. 如何支持百万连接?

从上面可以看到,连接数,是没有限制的。但Linux还有一层防护,那就是文件句柄数。通过lsof命令查看到的那些东西,就是所谓的文件句柄。

先来看一下几个命令的展示。

ulmit,展示了每个进程所能占用的文件句柄数量。

ulimit -n 65535
登录后复制

file-max,展示了操作系统能够占用的文件句柄数量总和,针对的是所有的进程。

cat /proc/sys/fs/file-max 766722
登录后复制

file-nr,展示了当前已经使用的句柄数量和总的句柄数量。可以拿来做监控。

cat /proc/sys/fs/file-nr 1824  0 766722
登录后复制

为了支持百万连接,需要释放操作系统级别的句柄和进程级别的句柄。也就是说,ulimit和file-max的显示,都要大于百万才成。

3. 如何设置?

虽然常用的一种方案是ulimit来设置进程句柄数,但是我非常不推荐使用。只有在同一shell中启动的进程,才会受到ulimit设置的影响,原因没有其他的。如果你打开另一个shell或重启机器,那么ulimit的更改都会消失。就是下面这种方式:

ulimit -n 1000000
登录后复制

正确的方式,是修改/etc/security/limits.conf文件。比如下面的内容。

root soft nofile 1000000 root hard nofile 1000000 * soft nofile 1000000 * hard nofile 1000000
登录后复制

可以看到,我们可以针对于特定的用户,修改其句柄数量。这在安装es等应用时,经常碰到。

es  -  nofile  65535
登录后复制

使用这种方法,仍需要打开一个新的shell才能进行操作。这个命令无论是在修改后的shell中还是在修改之前的shell中,都不会生效。xjjdog曾遇到过多个案例,尽管限制已经被放开,仍发生了问题。

查看进程的内存映射文件可以确定这些更改是否已经生效。例如,在命令“cat /proc/180323/limits”中,将会展示详细信息。

这个数值,也并不是想要设多大就多大的。它的大小上限,是由nr_open决定的。要增加大小,需要在/ect/sysct.conf中更改fs.nr_open的值。

cat /proc/sys/fs/nr_open 1048576
登录后复制

如果想修改file-max参数,建议在/etc/sysctl.conf文件中加入以下内容。足足有6百多万!

fs.file-max = 6553560
登录后复制

当文件数量超出的时候,就会报kernel: VFS: file-max limit 65535 reached的错误。

总结一下。

Ulimit的故障怎么解决

Linux即使放开一个端口,能够接受的连接也是海量的。这些连接的上限,受到单进程文件句柄数量和操作系统文件句柄数量的限制,也就是ulimit和file-max。

为了能够将参数修改持久化,我们倾向于将改动写入到文件里。进程的文件句柄限制,可以放在/etc/security/limits.conf中,它的上限受到fs.nr_open的制约;操作系统的文件句柄限制,可以放到/etc/sysctl.conf文件中。最终,一定要检查/proc/$id/limits文件,确认修改是否生效于进程。

以上是Ulimit的故障怎么解决的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)