生产环境跨服务 DNS 偶尔超时 5s?记一次 resolv.conf 单并发排查

举报
yd_218612773 发表于 2026/11/09 17:18:30 2026/11/09
【摘要】 最近线上调用链路监控(APM)捕捉到一些奇怪的耗时毛刺:服务访问一个内网域名时,偶尔会出现耗时正好在 5.00 秒左右的请求。 一、为什么恰好是 5 秒?在 Linux 系统的 /etc/resolv.conf 中,解析器的默认超时时间正好是 5 秒(timeout:5)。查看 glibc 的底层实现可知,默认情况下 glibc 的 DNS 解析器会通过同一个本地 socket 并发发送 I...

最近线上调用链路监控(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 响应时间明显平稳。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。