Linux上TCP的几个内核参数调优
【转载声明】本文为转载文章,原作者「alchemystarlzy」,版权归原作者所有。 原文链接:https://mp.weixin.qq.com/s/Bf5UtpY8fD5oPwQrJVhDmw
公众号:杨建荣的学习笔记 · 作者:alchemystarlzy · 发布:2022-03-05 23:36:37 · 原文链接
Linux作为一个强大的操作系统,提供了一系列内核参数供我们进行调优。光TCP的调优参数就有50多个。在和线上问题斗智斗勇的过程中,笔者积累了一些在内网环境应该进行调优的参数。在此分享出来,希望对大家有所帮助。
调优清单
好了,在这里先列出调优清单。请记住,这里只是笔者在内网进行TCP内核参数调优的经验,仅供参考。同时,笔者还会在余下的博客里面详细解释了为什么要进行这些调优!
| 序号 | 内核参数 | 值 | 备注 |
|---|---|---|---|
| 1.1 | /proc/sys/inet/ipv4/tcp_max_syn_backlog | 2048 | |
| 1.2 | /proc/sys/net/core/somaxconn | 2048 | |
| 1.3 | /proc/sys/net/ipv4/tcp_abort_on_overflow | 1 | |
| 2.1 | /proc/sys/net/ipv4/tcp_tw_recycle | 0 | NAT环境必须为0 |
| 2.2 | /proc/sys/net/ipv4/tcp_tw_reuse | 1 | |
| 3.1 | /proc/sys/net/ipv4/tcp_syn_retries | 3 | |
| 3.2 | /proc/sys/net/ipv4/tcp_retries2 | 5 | |
| 3.3 | /proc/sys/net/ipv4/tcp_slow_start_after_idle | 0 |
当然了,这里只列出TCP的部分内核参数,更多web性能上的建议,请看
tcp_max_syn_backlog,somaxconn,tcp_abort_on_overflow
tcp_max_syn_backlog,somaxconn,tcp_abort_on_overflow这三个参数是关于
内核TCP连接缓冲队列的设置。如果应用层来不及将已经三次握手建立成功的TCP连接从队列中取出,溢出了这个缓冲队列(全连接队列)之后就会丢弃这个连接。如下图所示:

从而产生一些诡异的现象,这个现象诡异之处就在于,是在TCP第三次握手的时候丢弃连接

就如图中所示,第二次握手的SYNACK发送给client端了。所以就会出现client端认为连接成功,而Server端确已经丢弃了这个连接的现象!由于无法感知到Server已经丢弃了连接。
所以如果没有心跳的话,只有在发出第一个请求后,Server才会发送一个reset端通知这个连接已经被丢弃了,建立连接后第二天再用,也会报错!所以我们要调大Backlog队列!
