TCP短链接调优
- - 操作系统 - ITeye博客最近在做一个项目,用到HttpClient查询数据,由于服务端强制做成了短链接(大家都知道http1.1默认是带有keepalive机制),导致了请求方TCP状态很多都是TIME_WAITZ状态,端口被全部占用,请求失败. net.ipv4.tcp_tw_reuse = 1 表示开启重用. 允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;.
最近在做一个项目,用到HttpClient查询数据,由于服务端强制做成了短链接(大家都知道http1.1默认是带有keepalive机制),导致了请求方TCP状态很多都是TIME_WAITZ状态,端口被全部占用,请求失败
调优过程:
首先:
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
本以为可以皆大欢喜压测通过,悲惨的是还是提示“地址已在使用”
再次查看了网上一些资料:
net.ipv4.tcp_fin_timeout=20 ,结果问题还是存在
接着查看了TCP参数,发现net.ipv4.tcp_tw_timeout 参数,凭直觉这个应该是TIME_WAIT过期时间,改成20,效果明显,解决问题
总结下:
net.ipv4.tcp_tw_reuse 这个参数启用,必须要应用程序做配置,用户态程序必须手动设置了socket是so_reuseaddr,否则无效果
net.ipv4.tcp_tw_recycle 这个参数主要底层运算还是需要根据TIME_WAIT过期时间,这个不调整,启用这个参数也没有效果
net.ipv4.tcp_tw_timeout 这个顾名思义就是TCP状态中TIME_WAIT的过期时间,默认情况是60秒
net.ipv4.tcp_fin_timeout 这个参数是TCP状态中FIN_WAIT2的过期时间