为什么你需要手动看DNS缓存

DNS缓存是系统临时存储的域名解析记录,它能让重复访问的网站加载更快。但当网站IP地址变更、你修改了hosts文件,或者网络出现异常时,缓存里的旧数据反而会阻碍正常访问。很多运维同事遇到网站打不开、解析错误的情况,第一反应就是检查DNS缓存。Linux不像Windows那样有ipconfig /displaydns的直观命令,所以了解怎么查就得靠其他手段。

不同Linux发行版缓存工具不一样

linux系统缓存查看_linux 查看dns缓存_linuxdns缓存查看

你要知道,Linux本身没有统一的“查看DNS缓存”命令,因为缓存机制取决于你系统里跑的是哪个DNS服务。最常见的两个是systemd-resolved和dnsmasq。

如果你用的是Ubuntu 18.04之后的桌面版,大概率用的是systemd-resolved。这时候用resolvectl命令就能看到详细缓存。直接敲resolvectl statistics,它会显示当前缓存大小、命中次数、未命中次数。想看具体某个域名的缓存记录,就跑resolvectl query ,它会告诉你当前缓存的IP地址和TTL剩余时间。

对于CentOS、Fedora或者安装dnsmasq的系统,情况又不一样。dnsmasq默认不提供直接查看缓存的命令,但你可以通过发送SIGUSR1信号让它在系统日志里打印缓存内容。用killall -USR1 dnsmasq之后,再去看/var/log/messages或者journalctl -u dnsmasq,就能找到缓存记录。这个操作需要root权限linux 查看dns缓存,而且日志内容比较长,适合仔细排查的时候用。

没有独立缓存服务时用什么方法

很多服务器为了轻量化,根本就没装systemd-resolved或dnsmasq,直接用的是glibc的nss-dns来解析。这种情况下,系统缓存其实存在于内核的socket层,但Linux没有提供现成的用户态命令来读它。你只能绕个弯子来判断。

一个实用的土办法是:用dignslookup连续查两次同一个域名,看第二次的查询时间。如果第二次明显变短,说明有缓存起作用。比如第一次查百度花了50ms,第二次只要1ms,那就证明系统某个环节缓存了结果。但这个方法只能让你“感觉到”有缓存,看不到具体条目。

如果你想更直接一点,可以装nscd(Name Service Cache Daemon)。这是专门做名字缓存的服务,安装后用nscd -g就能看统计信息linux 查看dns缓存,比如缓存了多少个hosts条目、命中率多少。想看具体缓存了哪些域名,可以用strings /var/db/nscd/hosts,但这会输出一堆二进制数据长春linux培训,需要你手动过滤。注意nscd在一些新系统里已经被systemd-resolved取代了,不是默认开启的。

排查缓存问题时的常见坑

查缓存时最容易翻车的点是搞混了“本地缓存”和“上游DNS缓存”。比如你用dig @8.8.8.8直接查谷歌的DNS,这跳过了你本机的所有缓存,得到的是公网权威结果。而用resolvectl query查到的,是你本机systemd-resolved里存的缓存。如果你发现dig返回的结果和实际访问的不一样,很可能是本机缓存捣乱。

linux系统缓存查看_linux 查看dns缓存_linuxdns缓存查看

另一个坑是TTL时间。缓存的每条记录都有生存时间,Linux默认尊重这个值,但你可以通过修改dnsmasq或systemd-resolved的配置文件来强制设置最小TTL。有些运维为了减少DNS查询量,会把TTL设成几个小时,这时候就算上游改了IP,你的机器也得等缓存过期才能拿到新记录。碰到这种问题,直接重启DNS服务是清缓存最快的方法:systemctl restart systemd-resolved 或者 systemctl restart dnsmasq

还有一个细节值得注意:ping命令本身不缓存DNS结果,它每次都是新查。所以你用ping测试域名解析并不准确,应该用hostdig配合缓存服务来诊断。

清缓存比看缓存更常用

linuxdns缓存查看_linux 查看dns缓存_linux系统缓存查看

很多时候你查缓存的目的就是为了清掉它。Linux清缓存的方法取决于你用的是什么服务。systemd-resolved用resolvectl flush-caches,dnsmasq用killall -HUP dnsmasq,nscd用nscd -i hosts。如果你实在分不清系统跑的是哪个,最暴力的方式就是重启网络服务或重启机器,但这在生产环境里不现实。

建议你在排查问题时linux内核,养成先看缓存再决定是否清缓存的习惯。比如resolvectl statistics里的缓存大小突然从几百条变成0,那就可能是服务崩溃了,而不是配置问题。理解缓存状态,能帮你更快定位到底是网络不通、DNS配置错误,还是单纯缓存没刷新。

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复