专栏文章 linux 下 TCP 参数优化详解 (1)

飞天小子的性能课堂 · 2020年09月11日 · 最后由 海棠不是朵朵 回复于 2020年09月12日 · 3675 次阅读

TCP 窗口

net.ipv4.tcp_window_scaling = 1 --启用tcp窗口--
net.core.rmem_max=16777216  --最大的TCP数据接收窗口--
net.core.wmem_max=16777216 --最大的TCP数据发送窗口--

syn 报文重发
一般情况下,ACK 报文会在几毫秒内返回。如果客户端迟迟没有收到 ACK,客户端会以翻倍的方式在第 2、4、8、16、32 秒共做 6 次重试,总耗时 127s。可以降低重试次数

net.ipv4.tcp_synack_retries = 2 --第一次握手重发--
net.ipv4.tcp_syn_retries = 2  --第二次握手重发--

半连接队列长度
服务端状态在 SYN_RECV 下,会建立一个 SYN 半连接队列来维护未完成的握手信息,当这个队列溢出后,服务器将无法再建立新连接。可以适当增加队列长度

net.ipv4.tcp_max_syn_backlog = 262144 --半连接队列长度--

绕开半连接队列
如果 SYN 半连接队列已满,可以开启 syncookies 功能,在不使用 SYN 队列的情况下也能建立连接。

net.ipv4.tcp_syncookies = 1。--0表示关闭,1表示开启--

accept 队列
服务器收到 ACK 后表示连接建立成功,此时内核会把连接从半连接队列中移出再移入 accept 队列,等待进程调用 accept 函数时把连接取出来。如果进程不能及时地调用 accept 函数,就会造成 accept 队列溢出

net.core.somaxconn = 16384 --accept队列长度--

RST 复位
accept 队列溢出会导致建立好的 TCP 连接被丢弃。我们可以选择向客户端发送 RST 复位报文,告诉客户端连接已经建立失败。通常会出现下面这两个错误
Connection reset/Connect reset by peer

net.ipv4.tcp_abort_on_overflow=1 --设置为0可以提高连接建立的成功率--

TIME_WAIT
当 TIME_WAIT 的连接数量超过 buckets,新关闭的连接就不再经历 TIME_WAIT 而直接关闭

net.ipv4.tcp_max_tw_buckets = 5000 

收发数据包
这个参数设置为 0,会导致内网中断

echo "1" > /proc/sys/net/ipv4/ip_forward --0禁用,1启用--
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 1 条回复 时间 点赞

tcp_reuse 打开,其他的不要乱搞,没事教人调内核参数,你这作死啊?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册