简介: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 技术学院钉钉圈子,和更多云上人交换对于云平台的那些事。
版权申明: 本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。