2团
Published on 2024-09-10 / 10 Visits
0
0

TCP内核参数在日常项目中的实践总结

1. 数据重传次数

以本人的阿里云主机为例,查询重传次数,具体如下:

# sysctl -a |grep -E "tcp_retries|keepalive"
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 15

本章节重点关注net.ipv4.tcp_retries2参数,其控制数据传输阶段的重试次数。

1.1 net.ipv4.tcp_retries2

  • 含义:指定TCP连接在放弃尝试建立连接之前发送所有重试包(包括SYN和数据包)的总次数。

  • 工作原理net.ipv4.tcp_retries2参数控制了TCP连接在放弃尝试建立连接之前,发送所有重试包(包括SYN和数据包)的总次数。这不仅包括初始的SYN包,还包括在连接建立后发送的所有数据包的重试次数。

在日常项目中,如果应用没有配置合理的超时时间(SocketTimeout),当需要访问的主机发生异常情况(例如MySQL主机下线等),会导致应用不断进行数据重传尝试(大致时间周期为924秒)。

1.2 调整建议

  • 尽量显式设置ConnectTimeout以及SocketTimeout(例如JDBC URL、HTTP Client等);

    • 需要注意对于数据分析类业务,可能会有较长的响应时间,超时时间应该酌情设置。

  • 主机上调整tcp_retries2至较小的数值,尤其是在内网环境(网络情况较好)。

# 临时设置
sudo sysctl -w net.ipv4.tcp_retries2=8

# 永久设置
echo "net.ipv4.tcp_retries2 = 8" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

1.3 参考文章

长连接黑洞重现和分析


Comment