修改系统参数

vim /etc/sysctl.conf
然后执行/sbin/sysctl -p让参数生效

    # 表示开启 SYN cookies。当出现 SYN 等待队列溢出时,启用 cookies 来处理,可防范少量 SYN 攻击,默认为 0,表示关闭;
    net.ipv4.tcp_syncookies = 1

    # 表示开启重用。允许将 TIME-WAIT sockets 重新用于新的 TCP 连接,默认为 0,表示关闭;
    net.ipv4.tcp_tw_reuse = 1

    # 表示开启 TCP 连接中 TIME-WAIT sockets 的快速回收,默认为 0,表示关闭;
    net.ipv4.tcp_tw_recycle = 1

    # 修改系統默认的 TIMEOUT 时间
    net.ipv4.tcp_fin_timeout = 1

tcp_tw_reuse和tcp_tw_recycle的区别

官方文档的解释:

tcp_tw_recycle - BOOLEAN
Enable fast recycling TIME-WAIT sockets. Default value is 0.
It should not be changed without advice/request of technical
experts.
tcp_tw_reuse - BOOLEAN
Allow to reuse TIME-WAIT sockets for new connections when it is
safe from protocol viewpoint. Default value is 0.
It should not be changed without advice/request of technical
experts.
说实话,没看出什么区别。

net.ipv4.tcp_tw_recycle = {0|1} 是否启用timewait快速回收;注意:开启此功能在NAT环境下可能会出现严重的问题:因为TCP有一种行为,它可以缓存每个连接最新的时间戳,后续请求中如果时间戳小于缓存中的时间戳,即被视为无效并丢弃相应的请求报文;Linux是否启用这种行为取决于tcp_timestamp和tcp_tw_recycle,而前一个参数默认是启用的,所以启用后面的参数就会激活此功能; 因此,如果是NAT环境,安全起见,应该禁用tcp_tw_recycle。另一种解决方案:把tcp_timestamps设置为0,tcp_tw_recycle设置为1并不会如想象中奏效,因为一旦关闭了tcp_timestamps,那么即便打开了tcp_tw_recycle,后面的参数也没有效果。此时降低net.ipv4.tcp_max_tw_buckets的值就可以显著降低tw连接的数量了。

net.ipv4.tcp_tw_reuse = {0|1} 是否开启tw重用,即是否允许将TIME-WAIT sockets 用于新的TCP连接。

所以,线上服务开启tcp_tw_reuse,对外服务尽量不要开启tcp_tw_recycle。

tcp_fin_timeout

发现线上nginx总是报错 connection 不够用,ss -t -a查看了一下,大部分连接卡在了 FIN_WAIT_2 状态,应该是服务器端主动关闭连接后,客户端没有调用close导致的。暂时采取措施是将 tcp_fin_timeout 的值由之前的30s改为1s,尽快结束 FIN_WAIT_2 状态的连接。

posted @ 2017-05-26 11:11  我的娃会叫爸爸啦  阅读(682)  评论(0编辑  收藏  举报