TCP连接TIME-WAIT
来源:互联网 发布:薛之谦男装淘宝店网址 编辑:程序博客网 时间:2024/05/16 11:38
用nginx做负载均衡做性能测试的时候,发现nginx会抛出502错误,Cannot assign requested address,目标server端口号被占用光,其实是因为大量http请求短时间内快速连接、释放导致的,因为服务器默认没有开启tcp TIME-WAIT快速回收。
cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000
cat /proc/sys/net/ipv4/tcp_max_syn_backlog 1024
cat /proc/sys/net/ipv4/tcp_syn_retries 5
cat /proc/sys/net/ipv4/tcp_max_tw_buckets 180000
cat /proc/sys/net/ipv4/tcp_tw_recycle 0
cat /proc/sys/net/ipv4/tcp_tw_reuse 0
ip_local_port_range目标服务器支持的tpc端口后范围,可以设置大一点
tcp_max_tw_buckets同时处于TIME-WAIT的tcp最大连接数
tcp_timestamps 是否开启tcp TIME-WAIT时间戳记录,默认开启,1
tcp_tw_recycle是否快速回收,1是开启
通常需要设置
sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_tw_recycle=1
这样nginx发起的大量http请求会被快速回收
但是要注意一点,在nat环境下不能设置net.ipv4.tcp_tw_recycle=1,因为时间戳混乱会造成正常请求被切断
在nat模式下(服务器一般会用到dnat,用户一般会用到snat),nat设备(or服务器)会修改目的ip和源ip,以屏蔽内部信息。试想很多用户snat出来,通过dnat访问网站,在dnat这层,时而会产生时间戳错乱的问题,那么基于tcp的时间戳的tcp_tw_recycle,就会出错
tcp会记录每个连接的时间戳,如果后续时间戳比之前记录的时间戳小,就会认为这是错误的连接,拒绝这个连接。如果tcp_tw_recycle开启,那么这种规则就会被激活(那样才能快速回收连接)。所以在lvs使用nat的情况下,用户请求到lvs,LVS会修改地址数据后将请求转发给后端服务器,但不会修改时间戳(因为nat的机制就是只修改源地址和目的地址)。在后端服务器看来,请求的源地址永远都是LVS的地址,并且端口复用,原本不同客户端的请求经过LVS的转发,就可能会被认为是同一个连接,加之不同客户端的时间可能不一致,所以就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了,具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK,还可以通过下面命令来确认数据包不断被丢弃的现象。就会出现部分用户能连接服务器,部分用户不能连接服务器的情况
- TCP连接TIME-WAIT
- 减少TCP连接中的TIME-WAIT
- TCP连接的TIME-WAIT状态
- 修改Linux内核参数,减少TCP连接中的TIME-WAIT
- 修改Linux内核参数,减少TCP连接中的TIME-WAIT
- Linux内核参数,减少TCP连接中的TIME-WAIT
- 修改Linux内核参数,减少TCP连接中的TIME-WAIT sockets
- 修改Linux内核参数,减少TCP连接中的TIME-WAIT sockets
- 修改Linux内核参数,减少TCP连接中的TIME-WAIT sockets
- 修改Linux内核参数,减少TCP连接中的TIME-WAIT sockets
- 修改Linux内核参数,减少TCP连接中的TIME-WAIT sockets
- 修改Linux内核参数,减少TCP连接中的TIME-WAIT sockets
- 修改Linux内核参数,解决TCP连接中的TIME-WAIT socket
- 修改Linux内核参数,减少TCP连接中的TIME-WAIT sockets
- kernel: TCP: time wait bucket table
- 修改Tcp的Time-Wait的方法
- TCP三次握手和time wait
- tcp三次握手和time wait --- 转
- Redis基础学习
- 在IE浏览器报‘rowspan’为空或者不是对象错误
- 线程 join
- 使用Spring Data操作mongoDB
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...今天
- TCP连接TIME-WAIT
- 简单滑动门js代码
- Sqoop1.4.6安装与使用(二)
- 获取内存中块的信息(VirtualQuery)
- 创建 OpenStack云主机 [六]
- Android应用程序消息处理机制(Looper、Handler)分析
- 使用jspatch进行热修复的实战总结
- 理解性能的奥秘——应用程序中慢,SSMS中快(6)——SQL Server如何编译动态SQL
- iOS中UILabel显示不同的字体和颜色