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