成长值: 255 签到天数: 4710 天 [LV.Master]伴坛终老
|
发表于 2017/6/21 00:32
|
显示全部楼层
|阅读模式
|Google Chrome 59.0.3071.104 |Windows 10
Linux 内核优化并发开启tcp快速回收TIME_WAIT
- netstat -an|grep TIME_WAIT |wc -l
复制代码
查看有多少
[root@MyCloudServer ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 255166
FIN_WAIT1 12170
ESTABLISHED 43591
FIN_WAIT2 27756
SYN_RECV 866
CLOSING 111
LAST_ACK 84
[root@MyCloudServer ~]#
vi /etc/sysctl.conf
增加net.ipv4.tcp_tw_recycle = 1
表示开启TCP连接中TIME_WAIT sockets的快速回收,默认为0,表示关闭。实在吃不消不得已才开启,毕竟可能会引起timed_out连接失败的问题甚至tcp长连接突然访问中断导致断流。
net.ipv4.tcp_tw_reuse = 1
Tcp TIME_WAIT 端口重用,推荐打开,默认为0,表示关闭,打开后允许将TIME_WAIT sockets重新用于新的TCP连接。
net.ipv4.tcp_fin_timeout = 10
修改系統默认的 TIMEOUT 时间,默认为60,这个参数决定了它保持在FIN_WAIT2状态的时间。
net.ipv4.tcp_keepalive_time = 30
表示当keepalive启用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为30秒。
net.ipv4.ip_local_port_range = 1025 64511
表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1025到64511。
net.ipv4.tcp_max_syn_backlog = 8192
表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接(SYN_RECV)的网络连接数。使用ss命令查看第四列观察发送队列情况,如果当前已启用syncookie,那么设置max_syn_backlog值无效化
通过dmesg可以确认是否有该情况发生 dmesg | grep "TCP: drop open request from",可以用命令 netstat -ant|grep SYN_RECV|wc -l 查看具体大小,大多数情况下这个值应该是0或很小,因为半连接状态从第一次握手完成时进入,第三次握手完成后退出,正常的网络环境中这个过程发生很快,如果这个值较大,服务器极有可能受到了SYN Flood攻击。
另外,上述行为受到内核参数tcp_syncookies的影响,若启用syncookie机制,当半连接队列溢出时,并不会直接丢弃SYN包,而是回复带有syncookie的SYC+ACK包,设计的目的是防范SYN Flood造成正常请求服务不可用。
net.ipv4.tcp_max_tw_buckets = 5000
表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息/var/log/messages(TCP: time wait bucket table overflow)。默认为180000,改为5000。
net.ipv4.tcp_syn_retries = 1
对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5
net.ipv4.tcp_window_scaling = 0
TCP窗口自动调节,如果TCP窗口最大超过65535(64K),必须设置该数值为1,否则访问速度会严重下降,默认值1,设置0关闭。
net.ipv4.tcp_sack = 0
有选择的应答,默认1,设置0关闭。
懒人一键吧
- echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
- echo "net.ipv4.tcp_fin_timeout = 10" >> /etc/sysctl.conf
- echo "net.ipv4.tcp_max_tw_buckets = 5000" >> /etc/sysctl.conf
- echo "net.ipv4.tcp_keepalive_time = 30" >> /etc/sysctl.conf
- echo "net.ipv4.ip_local_port_range = 1025 64511" >> /etc/sysctl.conf
- echo "net.ipv4.tcp_max_syn_backlog = 8192" >> /etc/sysctl.conf
复制代码
然后执行 /sbin/sysctl -p 让参数生效
[root@MyCloudServer ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 3919
FIN_WAIT1 2555
FIN_WAIT2 297
ESTABLISHED 42244
SYN_RECV 614
CLOSING 172
LAST_ACK 117
[root@MyCloudServer ~]#
一个高并发丢包的案例一
https://bbs.itzmx.com/thread-88435-1-1.html
一个高并发丢包的案例二
https://bbs.itzmx.com/thread-100689-1-1.html
|
|