TIME_WAIT过高问题

TIME_WAIT过高问题

之前一个项目存在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 (文档)

net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 20000
net.ipv4.tcp_timestamps = 0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值