TIME_WAIT过高问题

netstat -anp | awk '/^tcp/ {++S[$6]} END {for (a in S) print a, S[a]}'

timewait数量有8w

这个项目(php)跟一般网站不同,主要是做一些适配分发,就是有请求过来,就调用其他接口返回。因为是提供给内网机器调用,所以请求的ip都是比较固定的几个。http请求,没有做长连接。

timewait比较高,但是load却很平稳,同时请求的机器却时不时会显示timeout(3秒timeout)

修改/etc/sysctl.conf
增加了
net.ipv4.ip_local_port_range = 9000 65500
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 6
 sysctl -p

其中一台机器,timewait下降到4w。另外一台机器却没有变化……

因为之前用的apache,后来改成用nginx,并没有好转,还是会有超时情况发生。

感觉是要改用长连接了,之前redis因为连接数过高,改为用长连接之后就没事了。但是改动上面的配置为什么一台机有效,另外一台却没有效果也是很奇怪。

下面是找的过程中看的一些文章的想法:

1. 其实timewait高应该没有什么影响,只要CPU还在正常范围就行了

2. 占用端口问题。并不是真正占用了一个端口,基于linux万物皆文件的原理,只是产生了一个文件的handler,所以能提供多少链接的数量,应该跟能打开文件的数量差不多的。意思就是不止是6w多个。但是一个端口对应一个ip的话,好像就只能是6w多个。具体原因忘记了,要翻开文章来看。

3. 用keepalive其实能解决timewait过高的问题,因为请求完不关闭等待下一次请求。但是在我们这个场景是不适用的,因为php的curl请求并不支持长连,即使服务器开了keepalive也没有效果。php实现长连接需装pecl_http扩展 https://pecl.php.net/package/pecl_http / https://mdref.m6w6.name/http (文档)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容