生产环境跨服务 DNS 偶尔超时 5s?记一次 resolv.conf 单并发排查
最近线上调用链路监控(APM)捕捉到一些奇怪的耗时毛刺:服务访问一个内网域名时,偶尔会出现耗时正好在 5.00 秒左右的请求。
一、为什么恰好是 5 秒?
在 Linux 系统的 /etc/resolv.conf 中,解析器的默认超时时间正好是 5 秒(timeout:5)。
查看 glibc 的底层实现可知,默认情况下 glibc 的 DNS 解析器会通过同一个本地 socket 并发发送 IPv4(A 记录)和 IPv6(AAAA 记录)两条 DNS 查询请求。然而许多老旧防火墙、NAT 网关或特定内核版本的路由器在处理源端口相同的两个并发 UDP 包时,会将其中一个响应包丢弃,导致客户端必须等待 5 秒超时重试。
二、验证与解决
在 /etc/resolv.conf 中加入 single-request-reopen 选项:
/etc/resolv.conf
nameserver 10.0.0.2 options single-request-reopen timeout:2 attempts:3
代码块
参数说明:single-request-reopen 会强制解析器在发送 AAAA 请求前重新开启一个新的 socket,彻底规避端口复用冲突。
在 Kubernetes 环境中,可以在 Pod 的 dnsConfig 中优雅注入:
dnsConfig: options: - name: single-request-reopen - name: ndots value: “2”
代码块
配置下发后,5 秒超时毛刺完全消失,P99 响应时间明显平稳。
- 点赞
- 收藏
- 关注作者
评论(0)