DNS 解析慢 200ms:resolv.conf 与 nscd 的 3 类原因
我不会起名字322· 后端 / 算法 / 数据库 技术栈 力扣 Hot100 Go 项目 Redis MySQL文章目录DNS 解析慢 200msresolv.conf 与 nscd 的 3 类原因一、先量化慢在哪一步二、原因 1resolv.conf 里配置了不可达的 nameserver排查修法三、原因 2没有本地 DNS 缓存选择 1nscdname service cache daemon选择 2systemd-resolved选择 3应用内缓存最推荐缓存的代价四、原因 3IPv6 的 AAAA 查询拖慢解法五、还有一类K8s 里的 DNS 放大六、带走物DNS 解析慢 200msresolv.conf 与 nscd 的 3 类原因一、先量化慢在哪一步DNS 慢通常表现为接口耗时多了几百毫秒但服务端日志里处理很快。第一步是确认这个耗时真的是 DNS。用 curl 拆开看curl-wdns%{time_namelookup} connect%{time_connect} tls%{time_appconnect} ttfb%{time_starttransfer} total%{time_total}\n\-o/dev/null-shttps://api.example.com/healthz输出示例dns0.205 connect0.212 tls0.280 ttfb0.310 total0.315dns0.205—— DNS 花了 205ms占总耗时 65%。确诊。如果dns很小但connect大那不是 DNS 的问题别查错方向。二、原因 1resolv.conf里配置了不可达的 nameserver这是最常见的一类而且现象很有特点时快时慢。/etc/resolv.conf通常长这样nameserver 10.0.0.2 nameserver 10.0.0.3 options timeout:2 attempts:2 rotate解析逻辑是串行的先问第一个超时了才问第二个。如果10.0.0.2这台 DNS 服务器不可达或者丢包严重那么每次解析都要先等一个超时问 10.0.0.2 → 超时默认 timeout:5attempts:2所以是 5×210 秒 问 10.0.0.3 → 成功几毫秒为什么是时快时慢因为 glibc 的 resolver 会记住上次成功的 server除非开了rotate所以有时能直接用好的那台有时又要试一次坏的。排查# 逐个测 nameserver 的响应时间cat/etc/resolv.conf|grepnameserver|awk{print $2}|whilereadip;doecho-n$ip: dig$ipapi.example.com noall stats|grepQuery time||echo超时done修法把不可达的 nameserver 删掉最简单调小超时和重试次数options timeout:1 attempts:1 rotate single-request-reopenoption作用timeout:1单次查询超时改成 1 秒默认 5 秒attempts:1每个 server 只试 1 次默认 2 次rotate轮询 server而不是一直用第一个single-request-reopen解决 A 和 AAAA 并发查询在某些防火墙下的丢包问题single-request-reopen值得单独说glibc 默认会同时发 AIPv4和 AAAAIPv6两个查询共用同一个 socket。某些防火墙/NAT 设备对这种行为处理有问题会导致其中一个查询丢包然后等超时重试 → 表现为偶发 5 秒延迟。开启这个选项后改成分开用两个 socket问题消失。三、原因 2没有本地 DNS 缓存每次域名解析都要走一次完整的网络往返。如果你的应用对每个请求都新建连接或者连接池的空闲超时设得太短那么每个请求都会带一次 DNS 查询。请求 → 建连接 → DNS 查询20~200ms→ TCP → TLS → 发数据 ↑ 每次都要解法是加本地缓存三个选择选择 1nscdname service cache daemon# 安装yuminstall-ynscd# 或 apt install nscd# 配置/etc/nscd.confenable-cache hostsyespositive-time-to-live hosts3600# 正向缓存 1 小时negative-time-to-live hosts20# 负向NXDOMAIN缓存 20 秒suggested-size hosts211systemctlenable--nownscd nscd-g# 看命中率注意negative-time-to-live不存在的域名也要缓存否则每次查一个拼错的域名都会打一次网络往返。选择 2systemd-resolved现代发行版的默认方案systemctlenable--nowsystemd-resolved resolvectl statistics# 看缓存命中情况选择 3应用内缓存最推荐对于 Go 服务在应用层面控制最灵活importnetvarresolvernet.Resolver{PreferGo:true,Dial:func(ctx context.Context,network,addressstring)(net.Conn,error){d:net.Dialer{Timeout:2*time.Second}returnd.DialContext(ctx,udp,10.0.0.2:53)},}// 自己在应用层加一层缓存比如用 singleflight TTL或者更实际的做法用连接池 长连接让 DNS 查询次数降到最低这比加缓存更彻底。缓存的代价DNS 缓存会让故障切换变慢如果某个 IP 挂了要等 TTL 过期才会解析到新 IP。所以对内部服务TTL 可以设长几分钟到小时级对依赖 DNS 做故障切换的场景TTL 要短或者用客户端负载均衡服务发现替代 DNS。四、原因 3IPv6 的 AAAA 查询拖慢前面提到过glibc 默认会同时查 A 和 AAAA。如果你的网络不支持 IPv6但应用/系统启用了 IPv6那么 AAAA 查询会一直超时/失败每次解析都要等它。Go 里也有同样的坑Go 的 resolver 默认也会查 AAAA。如果 IPv6 不通就会拖慢。# 看系统是否启用了 IPv6cat/proc/sys/net/ipv6/conf/all/disable_ipv6# 1 禁用解法方案 1推荐修好 IPv6或者明确禁用它。方案 2在/etc/gai.conf里让 IPv4 优先precedence ::ffff:0:0/96 100方案 3Go 特有强制只用 IPv4// 建立连接时指定 tcp4conn,err:net.Dial(tcp4,api.example.com:443)或者在/etc/resolv.conf加options single-request让 A 和 AAAA 串行避免并发问题。五、还有一类K8s 里的 DNS 放大如果慢的是 K8s Pod那大概率不是上面这些而是ndots 放大Pod 里访问 redis.prod1 个点ndots5 → 依次查 redis.prod.default.svc.cluster.local redis.prod.svc.cluster.local redis.prod.cluster.local redis.prod → 4 次查询前 3 次 NXDOMAIN一次解析变成 4 次往返加上并发高时 conntrack 表被 UDP 填满导致丢包 → 偶发 5 秒超时。解法见 CoreDNS 那篇域名写全NodeLocal DNSCache。六、带走物排查顺序# 1. 确认慢的是不是 DNScurl-wdns%{time_namelookup} connect%{time_connect} ttfb%{time_starttransfer}\n-o/dev/null-surl# 2. 逐个测 nameservercat/etc/resolv.conf|grepnameserver|awk{print $2}|whilereadip;doecho-n$ip: ;dig$ipdomainnoall stats|grepQuery time||echoTIMEOUTdone# 3. 看有没有本地缓存systemctl status nscd systemd-resolved2/dev/null nscd-g2/dev/null|grep-A3hosts cache# 4. 看 IPv6 状态cat/proc/sys/net/ipv6/conf/all/disable_ipv6对应修法原因修法nameserver 不可达删掉坏的 /options timeout:1 attempts:1 rotate没有本地缓存nscd / systemd-resolved / 应用内缓存 / 用长连接IPv6 AAAA 拖慢禁用 IPv6 或options single-request/ Go 用tcp4K8s ndots 放大域名写全 NodeLocal DNSCache一句话结论DNS 慢 200ms 时先用curl -w %{time_namelookup}确认是不是 DNS再逐个 ping 一遍resolv.conf里的 nameserver —— 八成是其中有一台不可达每次解析都在等它超时。

相关新闻

DOM 克隆节点:cloneNode 的用法、深拷贝与浅拷贝实战

DOM 克隆节点:cloneNode 的用法、深拷贝与浅拷贝实战

1. 引言在 Web 开发中,我们经常需要复制页面上的某个元素,比如复制一张卡片、一份表单或者一段列表。DOM 提供了 cloneNode() 方法,用来克隆节点。理解它的深拷贝与浅拷贝区别,能帮助我们写出更高效、更安全的代码。2. cloneNode …

2026/10/16 3:08:01 阅读更多 →
Flink SQL中UNION与UNION ALL的本质区别及实时流场景选型指南

Flink SQL中UNION与UNION ALL的本质区别及实时流场景选型指南

1. 为什么Flink SQL里一个“ALL”之差,会让结果集膨胀三倍还多?去年在某电商实时大促监控项目里,我负责把用户行为日志、订单支付流、库存变更流三路数据合并成统一的事件宽表。当时图省事,直接写了SELECT * FROM stream_a UNION …

2026/10/16 3:08:01 阅读更多 →
普通人手写神经网络框架实战:GTX 1050 Ti可训的轻量级开源自研方案

普通人手写神经网络框架实战:GTX 1050 Ti可训的轻量级开源自研方案

1. 这不是“玩具项目”,是普通人真正能上手的神经网络实战路径“个人开源自研神经网络!普通显卡可训练!!”——看到这个标题,我第一反应不是兴奋,而是立刻去翻了下自己三年前压箱底的旧笔记本:G…

2026/10/16 3:08:01 阅读更多 →

最新新闻

移动端H5开发与PC端Web的核心差异及实战指南

移动端H5开发与PC端Web的核心差异及实战指南

移动端 H5 开发这个话题,我最早接触是在功能机向智能手机过渡那段时间。当时大家还在争论“移动端是不是要单独做一套网站”,后来从自适应到响应式再到各种混合开发方案,折腾了这么多年,我发现很多同学其实对“移动端 H5 开发和 P…

2026/10/16 3:53:10 阅读更多 →
C# Winform连接SQL Server:从环境配置到增删改查完整指南

C# Winform连接SQL Server:从环境配置到增删改查完整指南

简介:这是一套面向C#初学者的WinformSQL Server数据库增删改查入门资源,适合刚接触桌面数据库开发、希望掌握本地与网络连接方式的读者。资源以完整VS工程形式提供,包含CrudTest项目源码、SQLQuery1.sql数据库查询脚本、说明文档及编译生成的…

2026/10/16 3:53:10 阅读更多 →
Unity WebGL构建报错unityLinker与IL2CPP排查指南

Unity WebGL构建报错unityLinker与IL2CPP排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:53:10 阅读更多 →
Wireshark实战入门:从抓不到包到定位TCP窗口缩放故障

Wireshark实战入门:从抓不到包到定位TCP窗口缩放故障

1. 为什么今天还要学Wireshark?——从“看不见的网络”到“可触摸的数据流”很多人第一次听说Wireshark,是在某次服务突然卡顿、接口返回超时、或者App连不上服务器的时候。运维同事皱着眉头说:“得抓个包看看”,然后打开一个蓝白…

2026/10/16 3:53:10 阅读更多 →
SpringBoot家具销售管理系统实战:从CRUD到库存并发设计

SpringBoot家具销售管理系统实战:从CRUD到库存并发设计

花了整整两天时间把这类基于SpringBoot的家具销售管理系统从头到尾梳理了一遍。单看标题,很多人会觉得这又是一个普通的CRUD练习项目,但真正把业务模块拆开之后你会发现,家具销售里那些大件、低频、高客单价带来的逻辑细节,它其实…

2026/10/16 3:53:10 阅读更多 →
CTF音频隐写解题指南:从‘啊哒~’看振幅、频谱与相位三重分析

CTF音频隐写解题指南:从‘啊哒~’看振幅、频谱与相位三重分析

1. 从一道CTF杂项题名看起:为什么“啊哒~”不是卖萌,而是信号“BugkuCTF-Misc:啊哒~”——第一次在某高校CTF训练平台看到这个标题时,我下意识点开想看看是不是新出的搞笑彩蛋题。结果发现它被归在Misc(杂项&#xff0…

2026/10/16 3:52:10 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →