闲置后跨服务器首次请求响应缓慢问题求助(Hetzner服务器+Flask应用)
问题根因排查方向
- 优先排查服务端反向解析超时问题:这是对应20s左右超时最常见的诱因,服务器B上的前置Web服务(如Nginx)、SSH服务、iptables规则如果开启了客户端IP反向解析配置,首次连接时会尝试查询服务器A的PTR记录,解析失败就会卡10-20秒,完全符合你描述的耗时特征
- 验证建连阶段耗时占比:在服务器A上执行命令
curl -w "%{time_connect}\n%{time_total}\n" -o /dev/null -s http://服务器B的接口地址,分别测试闲置15分钟、30分钟后的首次请求,如果time_connect(TCP建连耗时)占总耗时的90%以上,可完全确认问题出在TCP建连环节,和业务代码无关 - 检查Hetzner默认连接跟踪配置:Hetzner云服务器默认开启netfilter连接跟踪,长时间闲置的TCP连接会被自动从conntrack表中剔除,首次重建连接时如果出现SYN包被默认安全组丢弃,加上系统默认
tcp_syn_retries=5的重试机制,就会产生10-30秒的延迟
可落地修复方案
永久修复方案
- 关闭所有不必要的反向解析配置:
- 若服务器B用Nginx反向代理Flask,删除配置中所有用域名的规则,统一替换为IP,同时关闭日志域名解析
- 修改服务器B的
/etc/ssh/sshd_config,设置UseDNS no后执行systemctl restart sshd生效
- 调整系统TCP参数优化连接保活:两台服务器都修改
/etc/sysctl.conf,添加以下配置:
保存后执行net.netfilter.nf_conntrack_tcp_timeout_established = 86400 net.ipv4.tcp_keepalive_time = 300 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 5sysctl -p立即生效,该配置会让闲置TCP连接每5分钟发送一次保活探测,避免被连接跟踪表清理 - 业务层优化HTTP连接复用:服务器A请求服务器B时不要每次新建HTTP连接,使用requests的Session对象或HTTP客户端连接池保持长连接复用,从根源避免频繁建连的开销
轻量化临时方案
比定时ping更规范的保活方式:在服务器A上配置1分钟一次的定时任务,请求服务器B的空健康检测接口(如专门写个返回200的/health接口),ICMP的ping无法保活TCP连接,只有HTTP请求才能维持TCP连接的活跃状态,避免被链路层面的规则清理
内容的提问来源于stack exchange,提问作者Forner Yann
相关产品推荐
相关产品推荐

