扬中网站建设开发,揭阳市php网站开发找工作,衡水做wap网站费用,天猫网站建设的意义现象#xff1a;MeterSphere更换压力机后#xff0c;压测出现出现HttpHostConnectException 
解决方案#xff1a; 
net.ipv4.tcp_tw_reuse默认是0或者2#xff0c;更改为1 
net.ipv4.tcp_tw_reuse#xff0c;表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连… 
现象MeterSphere更换压力机后压测出现出现HttpHostConnectException 
解决方案 
net.ipv4.tcp_tw_reuse默认是0或者2更改为1 
net.ipv4.tcp_tw_reuse表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接那么当连接被复用了之后延迟或者重发的数据包到达新的连接怎么判断到达的数据是属于复用后的连接还是复用前的连接呢这就需要依赖net.ipv4.tcp_timestamps字段了。复用连接后这条连接的时间被更新为当前的时间当延迟的数据达到延迟数据的时间是小于新连接的时间所以内核可以通过时间判断出延迟的数据可以安全的丢弃掉了。 参考文章jmeter压测过程中TIME_WAIT很多导致请求数上不去问题解决-腾讯云开发者社区-腾讯云 (tencent.com) 
背景介绍 为了摸底项目的性能需要进行性能测试。经过一番调研之后决定使用基于腾讯云TKE的分布式jmeter进行压测好处是有jmeter-suite可用搭建环境方便容器化部署可以方便的增加pod来提升压力。 但是在实际施压的时候发现请求量上不去达不到压测效果。经定位发现容器pod上存在大量TIME_WAIT而实际在传输数据的连接远小于设置的并发线程数 
netstat -n | awk /^tcp/ {state[$NF]} END {for(key in state) print key,\t,state[key]} 
复制 为什么会有TIME_WAIT 这是TCP连接释放的4次挥手的过程 
主动关闭连接的一方调用close()协议层发送FIN包被动关闭的一方收到FIN包后协议层回复ACK然后被动关闭的一方进入CLOSE_WAIT状态主动关闭的一方等待对方关闭则进入FIN_WAIT_2状态此时主动关闭的一方等待被动关闭一方的应用程序调用close操作被动关闭的一方在完成所有数据发送后调用close()操作此时协议层发送FIN包给主动关闭的一方等待对方的ACK被动关闭的一方进入LAST_ACK状态主动关闭的一方收到FIN包协议层回复ACK此时主动关闭连接的一方进入TIME_WAIT状态而被动关闭的一方进入CLOSED状态等待2MSL时间主动关闭的一方结束TIME_WAIT进入CLOSED状态 这个过程可以得到一下几个信息 
ESTABLISHED状态表示正在发送请求的连接即正在施压的请求个数主动关闭连接的一方最终会进入TIME_WAIT状态TIME_WAIT会默认等待2MSL时间后才最终进入CLOSED状态在一个连接没有进入CLOSED状态之前这个连接是不能被重用 
哪些情况会产生这么多TIME_WAIT怎么处理 
线程数确实很多就可能会产生大量的TIME_WAIT 比如并行的线程数上万由于一般是施压方主动断开连接因此会积累大量的TIME_WAIT。建议解决方案 
建议使用分布式压测将线程数分散到多台机器这里可以使用云原生压测平台进行 
jmeter的配置会影响TIME_WAIT的产生 建议开启该配置使用长连接这样会复用连接发送请求 Ramp-up时间秒这个配置表示多长时间把线程全部生成需要根据业务情况做好配置避免一次性生成太多配置直接把施压机器搞垮积累较多TIME_WAITSame user on each iteration在 JMeter 中user 就是线程此选项的意思是说每个迭代都用相同的线程。它的影响就是单个线程多次迭代使用同一个线程因为销毁和创建线程本身就会占用资源可能会影响性能测试结果。建议开启 
Linux本身没有设置回收使用TIME_WAIT状态的连接 如第二节中所述TIME_WAIT状态的连接需要2MSL时间后才能回收端口用于创建新的连接但是实际Linux内核配置支持快速回收TIME_WAIT状态的连接配置可查看 
cat /etc/sysctl.conf 
复制 net.ipv4.tcp_tw_recycle该配置表示快速回收TIME_WAIT连接但在NAT网络下会导致连接失败刚好使用的就是NAT另外Linux 从4.12内核版本开始移除了 tcp_tw_recycle 配置我这里的机器是4.14因此直接注释掉net.ipv4.tcp_tw_reuse表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接那么当连接被复用了之后延迟或者重发的数据包到达新的连接怎么判断到达的数据是属于复用后的连接还是复用前的连接呢这就需要依赖net.ipv4.tcp_timestamps字段了。复用连接后这条连接的时间被更新为当前的时间当延迟的数据达到延迟数据的时间是小于新连接的时间所以内核可以通过时间判断出延迟的数据可以安全的丢弃掉了。net.ipv4.tcp_timestamps在重用连接的情况下该配置能帮助操作系统识别新来的数据是旧连接的还是新连接的 
实验下修改后的修过 使用百度来实验压测实测相同的线程下压出来的QPS大幅提升。