简介:Linux零碎TCP内核参数优化总结

日常运维工作中,会遇到很多TCP相干的问题,网上有很多文章介绍须要优化哪些TCP内核参数,然而并没有很具体阐明优化的根据、实用的场景是什么,如果咱们不理解各个参数理论的作用,照搬网上的配置到生产环境,很有可能会事与愿违,本文从建设连贯、数据传输、断开连接三个阶段对波及到的相干TCP内核参数做出阐明并给出优化倡议。

图1:TCP连贯状态变迁图

1. 建设连贯阶段

  • net.ipv4.tcp\_syn\_retries
    管制三次握手第一步客户端发送syn得不到服务端响应时重传syn的次数,如果是内网环境,两头链路少,网络稳固,服务端无响应很可能是服务端利用出了问题,重传屡次的意义不大,还会加大服务端压力,能够调低重传次数,让客户端尽快去尝试连贯其余服务端。
  • net.ipv4.tcp\_syncookies
    开启SYN Cookies,默认开启,倡议放弃默认值,能够晋升SYN Flood攻打的防护能力。
  • net.ipv4.tcp\_synack\_retries
    管制三次握手第二步服务端发送syn+ack得不到客户端响应时重传syn+ack的次数,如果是内网环境,两头链路少,网络稳固,客户端无响应很可能是客户端出了问题,重传屡次的意义不大,能够调低重传次数。
  • net.ipv4.tcp\_max\_syn\_backlog
    管制半连贯队列大小,所谓半连贯是指还没有实现TCP三次握手的连贯。服务端收到了客户端的SYN包后,就会把这个连贯放到半连贯队列中,而后再向客户端发送SYN+ACK,为了应答新建连接数暴增的场景,倡议调大,半连贯队列溢出察看办法:netstat -s | grep "SYNs to LISTEN"
  • net.core.somaxconn
    全连贯队列=min(somaxconn,backlog),所谓全连贯,是指服务端曾经收到客户端三次握手第三步的ACK,而后就会把这个连贯放到全连贯队列中,全连贯队列中的连贯还须要被 accept()零碎调用取走,服务端利用才能够开始解决客户端的申请,倡议适当调大,全连贯队列溢出察看办法:netstat -s | grep "listen queue"
  • net.ipv4.tcp\_abort\_on\_overflow
    当全连贯队列满了之后,新的连贯就会被抛弃掉。服务端在抛弃新连贯时,默认行为是间接抛弃不去告诉客户端,有的时候须要发送reset来告诉客户端,这样客户端就不会再次重试,至于是否须要给客户端发送reset,是由tcp\_abort\_on\_overflow参数管制,默认为0,即不发送reset给客户端,如非非凡需要,倡议放弃默认值。

2. 数据传输阶段

  • net.ipv4.tcp\_wmem
    tcp发送缓冲区大小,蕴含min、default、max三个值,内核会管制发送缓冲区在min-max之间动静调整,可依据理论业务场景和服务器配置适当调大,如果设置了socket的SO\_SNDBUF,动静调整性能生效,个别不倡议设置。
  • net.core.wmem\_max
    socket发送缓冲区的最大值,须要设置net.core.wmem\_max的值大于等于 net.ipv4.tcp\_wmem的max值。
  • net.ipv4.tcp\_mem
    零碎中所有tcp连贯最多可耗费的内存,有三个值,当TCP总内存小于第1个值时,不须要内核进行主动调节,在第1和第2个值之间时,内核开始调节缓冲区的大小,大于第3个值时,内核不再为TCP调配新内存,此时无奈新建连贯,须要留神的是,三个值的单位都是内存页,也就是4KB。
  • net.ipv4.tcp\_rmem
    tcp接收缓冲区大小,蕴含min、default、max三个值,内核会管制接收缓冲区在min-max之间动静调整,可依据理论业务场景和服务器配置适当调大,如果设置了socket的 SO\_RECVBUF或者敞开了net.ipv4.tcp\_moderate\_rcvbuf,动静调整性能生效。
  • net.core.rmem\_max
    socket接收缓冲区的最大值,须要设置net.core.rmem\_max的值大于等于net.ipv4.tcp\_rmem 的max值。
  • net.ipv4.tcp\_moderate\_rcvbuf
    接收缓冲区动静调整性能,默认关上,倡议放弃默认配置。
  • net.ipv4.tcp\_window\_scaling
    裁减滑动窗口,tcp头部中,窗口字段只有2个字节,最多只能达到2的16次方,即65535字节大小的窗口,关上此开关能够裁减窗口大小,默认关上,倡议放弃默认配置。
  • net.ipv4.tcp\_keepalive\_probes
    keepalive探测失败后告诉利用前的重试次数,倡议适当调低。
  • net.ipv4.tcp\_keepalive\_intvl
    keepalive探测包的发送间隔时间,倡议适当调低。
  • net.ipv4.tcp\_keepalive\_time
    最初一次数据包到keepalive探测包的间隔时间,倡议适当调低。
  • net.ipv4.tcp\_available\_congestion\_control
    查看内核反对的拥塞控制算法。
  • net.ipv4.tcp\_congestion\_control
    配置拥塞控制算法,默认cubic,内核4.9版本后反对BBR,弱网络条件下倡议配置成BBR。

3. 断开连接阶段

  • net.ipv4.tcp\_fin\_timeout
    是从Fin\_WAIT\_2到TIME\_WAIT的超时工夫,长时间收不到对端FIN包,大概率是对端机器有问题,不能及时调用close()敞开连贯,倡议调低,防止等待时间太长,资源开销过大。
  • net.ipv4.tcp\_max\_tw\_buckets
    零碎TIME\_WAIT连贯的最大数量,依据理论业务须要调整,超过最大值后dmesg会有报错TCP: time wait bucket table overflow。
  • net.ipv4.tcp\_tw\_reuse
    容许TIME\_WAIT状态的连贯占用的端口用到新建连贯中,客户端可开启。
  • net.ipv4.tcp\_tw\_recycle
    开启后,TIME\_WAIT状态的连贯无需期待2MSL工夫就可用于新建连贯,在NAT环境下,开启tcp\_tw\_recycle参数会触发PAWS机制导致丢包,倡议不开启,事实上,内核在4.1版本后就把这个参数删除了。

咱们是阿里云智能寰球技术服务-SRE团队,咱们致力成为一个以技术为根底、面向服务、保障业务零碎高可用的工程师团队;提供业余、体系化的SRE服务,帮忙广大客户更好地应用云、基于云构建更加稳固牢靠的业务零碎,晋升业务稳定性。咱们冀望可能分享更多帮忙企业客户上云、用好云,让客户云上业务运行更加稳固牢靠的技术,您可用钉钉扫描下方二维码,退出阿里云SRE技术学院钉钉圈子,和更多云上人交换对于云平台的那些事。

版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。