Linux TCP Tunning

net.ipv4.ip_local_port_range
- 临时端口(ephemeral ports)的范围
- 默认值为
net.ipv4.ip_local_port_range = 32768 60999
- 调大此参数可以一定程度上缓解
TIME_WAIT
,可以修改为 net.ipv4.ip_local_port_range = "4096 60999"
TIME_WAIT
的时间是 2MSL
,无法修改
net.ipv4.tcp_rmem
- 值是3维数组
[min, default, max]
,收包缓冲(receive buffer
)的大小,TCP
会根据此值动态调整收包缓冲的大小
- 默认值是
net.ipv4.tcp_rmem = 4096 87380 6291456
- 第一列表示每个
TCP
socket 的最小收包缓冲,这个值用于系统内存紧张时保证最低限度的连接建立,注意指定过 SO_RCVBUF
的 socket 不受此参数限制。
- 第二列表示每个
TCP
socket 的默认收包缓冲,此数值将会覆盖全局参数 net.core.rmem_default
- 三列表示每个 TCP socket 最大收包缓冲,注意指定过
SO_RCVBUF
的 socket 不受此参数限制。此数值 不覆盖 全局参数 net.core.rmem_max
- 可根据实际情况调整,不是越大越好
net.ipv4.tcp_wmem
- 值是3维数组
[min, default, max]
,发包缓冲(send buffer
)的大小,TCP
会根据此值动态调整发包缓冲的大小
- 默认值是
net.ipv4.tcp_wmem = 4096 16384 4194304
- 第一列表示每个
TCP
socket 的最小发包缓冲,这个值用于系统内存紧张时保证最低限度的连接建立,注意指定过 SO_SNDBUF
的 socket 不受此参数限制。
- 第二列表示每个
TCP
socket 的默认收包缓冲,此数值将会覆盖全局参数 net.core.wmem_default
- 三列表示每个 TCP socket 最大收包缓冲,注意指定过
SO_SNDBUF
的 socket 不受此参数限制。此数值 不覆盖 全局参数 net.core.wmem_max
- 可根据实际情况调整,不是越大越好
net.core.rmem
& net.core.wmem
- 和
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
基本相同,但作用于所有协议
tcp_wmem
和 tcp_rmem
的最大值不能超过该值的最大值
net.ipv4.tcp_tw_reuse
- 依赖 TCP 时间戳
net.ipv4.tcp_timestamps = 1
,是否复用 TIME_WAIT
状态的 socket
- 默认值
net.ipv4.tcp_tw_reuse = 0
- 开启可以复用
TIME_WAIT
状态的连接,官方文档不建议修改
- 官方文档说明:It should not be changed without advice/request of technical experts
net.ipv4.tcp_tw_recycle
- 依赖 TCP 时间戳
net.ipv4.tcp_timestamps = 1
, 是否回收 TIME_WAIT
状态的 socket
- 默认值是
net.ipv4.tcp_tw_recycle = 0
- NAT环境下会有问题,一般不建议开
- Enabling this option is not recommended as the remote IP may not use monotonically increasing timestamps (devices behind NAT, devices with per-connection timestamp offsets)
net.ipv4.fin_timeout
FIN_WAIT2
状态的 socket 存活时间
- 默认值是
net.ipv4.fin_timeout = 60
- 可以修改为
net.ipv4.fin_timeout = 30
FIN_WAIT2
只存在于主动关闭端,HTTP
由服务端关闭 TCP
连接,所以客户端修改此值没用?
net.core.somaxconn
ESTABLISHED
状态,等待 accept
的最大队列长度
- 默认值是
net.core.somaxconn = 128
- 影响服务端,客户端调整意义不大
- 在一个 socket 进行
listen(int sockfd, int backlog)
时需要指定 backlog
值作为参数,如果这个 backlog
值大于 somaxconn
的值,最大队列长度将以 somaxconn
为准,多余的连接请求将被放弃,此时客户端可能收到一个 ECONNREFUSED
或忽略此连接并重传。此 backlog
指的是状态为 ESTABLISHED
但还未被应用程序 accept()
的连接数
net.ipv4.tcp_max_syn_backlog
- 未被
ACK
的 SYN
包的最大队列长度,超过这个数值后,多余的请求会被丢弃
- 默认值是
net.ipv4.tcp_max_syn_backlog = 128
- 影响服务端,客户端调整意义不大
参考文章