问题

公司用浏览器访问线上服务一会失败一会成功,通过ssh连接服务器排查时发现ssh也是这样;

检查

抓包后发现建立连接的请求已经到了服务器,但它没有响应;

纠结了好久,后来在腾讯云技术支持及查了相关资料后发现是开启了net.ipv4.tcp_tw_recycle导致的,将其设为0即可解决;

原因

收集了几个与TIME_WAIT相关的内核参数:

net.ipv4.tcp_timestamps     默认开启(1),数据包加时间戳,需要两端都开启,可以防止高速率宽带时引起的序号回绕(序号不够用重新开始了),可以精确计算出RTT(往返时延)
net.ipv4.tcp_tw_reuse      默认关闭(0),允许TIME_WAIT的socket在超过1秒后重用,作用于发起连接的client端
net.ipv4.tcp_tw_recycle     默认关闭(0),允许快速回收处于TIME_WAIT的socket,作用于接受连接的server端
net.ipv4.ip_local_port_range  默认(32768 61000),可用的端口范围
net.ipv4.tcp_max_tw_buckets   默认(180000),允许处于TIME_WAIT状态socket的最大数量

若TIME_WAIT过多,可以开启reuse和recycle来快速回收,值得注意的一点是,reuse和recycle需要timestamps开启才会生效,当然timestamps一般都是开启的;

上面问题的原因是,当多个client通过nat方式联网时(一个局域网)它们的源ip相同但发出的时间戳很可能是乱的,而开启了recycle的server端就会丢弃这些混乱的数据包,于是现象就是有时能连上有时不行;

至于reuse,开启可能导致端口重用后还会收到上个socket延迟到达的数据,这个一般问题不大,应用程序都会校验;

虽然reuse在client端配置有效,而recycle在server端,但现在很多机器都是接受连接后再去连接别人,所以视情况而定吧。

总结

官方文档是不建议开启reuse和recycle的,因为违反了tcp协议,所以临时开启来解决异常情况后应及时关闭;

若TIME_WAIT过多导致系统很慢(Linux对其优化很好,且现在不缺这点内存,所以一般不会),可以降低tcp_max_tw_buckets,阿里云和腾讯云分别默认设置为了5000、65536;

若端口不足可以考虑加大 ip_local_port_range,最大不超过:1024  65535;

TIME_WAIT过多长远的解决方式还是通过程序开发方面:

1. 代码中及时正确的调用socket的close;

2. 让client端主动断开连接,而不是server端;

3. 尽量使用长连接,而不是短连接;

over

与TIME_WAIT相关的几个内核参数的更多相关文章

  1. 与TIME_WAIT相关的几个内核参数修改测试讨论结论

    以下来结论自tcpcopy & gryphon讨论群 经过试验测试得出,不保证肯定正确.   net.ipv4.tcp_tw_recycle net.ipv4.tcp_tw_reuse net ...

  2. netstat -na 查看有大量TIME_WAIT解决办法(修改内核参数)

    # netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c      16 CLOSING     130 ESTABLISHED     298 FIN_WA ...

  3. Linux 内核参数 优化

    Linux 内核参数 优化 目录 Linux 内核参数 优化 1.编辑内核配置文件 2.参数及简单说明 3.客户端的典型状态转移参数 4.TCP重传参数 5.实现Nginx高并发的内核参数优化 生效配 ...

  4. LINUX内核参数网络相关

    有助于提高网络性能和吞吐量的参数 net.core.somaxconn = 128 已完成连接队列(completed connection queue) (1)三次握手已经完成,但还未被应用层接收( ...

  5. 发现大量的TIME_WAIT解决办法 -- 修改内核参数

    今天早上一上班,有同事就反映公司好几个网站都打不开,登陆数据库 服务器(windows),发现很卡,于是重启了下服务器,进入系统后,没过一会问题依旧,查看了下系统进程,发现mysql占用率达到99%, ...

  6. Linux 内核参数 和 Oracle相关参数调整

    Linux 内核参数 和 Oracle相关参数调整 分类: Oracle Basic Knowledge2009-10-14 12:23 9648人阅读 评论(0) 收藏 举报 oraclelinux ...

  7. linux下TCP/IP及内核参数优化调优(转)

    Linux下TCP/IP及内核参数优化有多种方式,参数配置得当可以大大提高系统的性能,也可以根据特定场景进行专门的优化,如TIME_WAIT过高,DDOS攻击等等. 如下配置是写在sysctl.con ...

  8. Linux内核参数配置

    Linux在系统运行时修改内核参数(/proc/sys与/etc/sysctl.conf),而不需要重新引导系统,这个功能是通过/proc虚拟文件系统实现的. 在/proc/sys目录下存放着大多数的 ...

  9. linux 内核参数优化

    Sysctl命令及linux内核参数调整   一.Sysctl命令用来配置与显示在/proc/sys目录中的内核参数.如果想使参数长期保存,可以通过编辑/etc/sysctl.conf文件来实现.   ...

随机推荐

  1. Android多种样式的进度条

    原创 2016年04月26日 16:46:35 标签: android / clip / 进度条 / 8473 编辑 删除 ---- The mark of the immature man is t ...

  2. C++ 编译发现 error C2146: syntax error : missing ';' before identifier 'm_ctrlserver'

    解决这个问题的根源是重复包含了头文件

  3. PDF在线解除密码的方法是什么

    大家在网上下载一些关于PDF文件的时候通常会发现有的PDF文件是有密码的,有密码的文件通常是不可以被转换的,这个时候我们就需要将其密码解除掉,这样后期不仅方便阅读也方便了PDF文件的转换. 操作工具: ...

  4. eclipese pyDEV安装----可以直接运行python文件

    重点: 1.Eclipse中手动安装pydev插件 2.开始写代码 1.下载匹配eclipse的pyDev版本: https://sourceforge.net/projects/pydev/file ...

  5. Lambda查询

    使用EF查询数据库,之前使用Linq表达式,现在改成另一个种方法查询:Lambda表达式 TestEntities db=new TestEntities(); ).FirstOrDefault(); ...

  6. 是否能设计一种DNN的特定网络结构来改善DNN,使得其学习起来更加高效

    小结: 1. 是否能设计一种DNN的特定网络结构来改善DNN,使得其学习起来更加高效 https://mp.weixin.qq.com/s/lF_WLAn6JyQqf10076hsjA Deep &a ...

  7. Docker 私有仓库建立(加密和用户验证)

    (一)生成证书1.mkdir /certs2.cd /certs 3.生成自签名证书 sudo openssl req -newkey rsa:2048 -new -nodes -x509 -days ...

  8. 2019-04-27 Python之有关文件的学习

    一.文件 1.简介 二.文件的相关操作 1.打开文件 例如:  f = open("F:\\text.txt", 'r') 只读模式,不可写入 2.读取文件 例如: f.readl ...

  9. Random-Forest-Python

    1. 近期目标,实现随机森林进行点云分类 1)学习阶段: [干货]Kaggle 数据挖掘比赛经验分享 Kaggle Machine Learning Competition: Predicting T ...

  10. 数据仓库建模对比: 比较表格和多维解决方案 (Comparing tabular and multidimensional solutions)

    笔记记下来,划重点: https://docs.microsoft.com/zh-cn/sql/analysis-services/comparing-tabular-and-multidimensi ...