Mac 怎么清除 DNS 缓存
Mac 清除 DNS 缓存,从应用程序 › 实用工具打开终端,运行下面这一行:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
按提示输入登录 Mac 的密码,成功时不会有任何输出;重启 Mac 也能清掉缓存,Apple 关于 DNS 缓存的文章里就写着,可以重新启动 Mac 来更新缓存的信息。
这篇 Apple 文章已经归档,不再更新,里面最新的一条是给 OS X Yosemite 10.10.4 及更高版本的 sudo killall -HUP mDNSResponder,dscacheutil -flushcache 则是它列给 Snow Leopard 的命令。Apple 之后没有发过新版说明,所以上面那一行两条都跑:killall 那半句是 Apple 给当前系统列的做法,dscacheutil -flushcache 按它的手册页(man dscacheutil)是清空目录服务缓存,手册还说只该在极端情况下用,DNS 记录过期正好算一种。Mole Mac 不做清除 DNS 缓存这件事,这是终端里的操作。
DNS 缓存是什么
App 要连 example.com 时,macOS 得先把名字换成 IP 地址,在 Mac 上,这一步交给 mDNSResponder,它的手册页(man mDNSResponder)说,它替其他进程发 DNS 查询,并保存一份答复的缓存。
有了缓存,重复查同一个名字就省掉一来一回,每条答复按域名 DNS 记录允许的时长保留,到期再重新查。大多数时候这一切没人察觉,出问题是在缓存里的答案还没到期就已经过时了:网站搬到了新服务器,你换了 DNS 服务器,或者某次查询失败了,这个失败结果还在被反复使用。
killall -HUP mDNSResponder 里的 -HUP 是选 killall 发哪个信号,不加的话 killall 默认发 TERM(man killall),Apple 列出的重置 DNS 缓存的写法就是 HUP 这一种,所以别省掉这个参数,也别换成 -9。
什么时候清 DNS 缓存有用
| 情况 | 为什么有用 |
|---|---|
| 网站或服务器换了地址,你的 Mac 还连到旧地址 | 缓存里的答案还没过期 |
| 你在网络设置里换了 DNS 服务器 | 之前那台服务器给的答案还留在缓存里 |
改了 /etc/hosts,却没生效 |
hosts 手册页说这个文件由 mDNSResponder 读取,它手里可能还是之前的答案 |
| 一分钟前某个网站解析失败,别的设备能打开,这台 Mac 还是失败 | 失败的查询结果可能被缓存了 |
什么时候清了也没用
清缓存只清 Mac 自己解析器里的缓存,下面几种常见情况跟它无关:
- 代理:流量走 HTTP 或 SOCKS 代理时,名字常常由代理自己解析,用
scutil --proxy可以看当前的系统代理配置。 - VPN:VPN 可能装上自己的 DNS 服务器,或者只把部分域名交给它们解析,
scutil --dns会列出所有在用的解析器,带域名的补充解析器只负责那个域名,公司内网域名打不开时,要查的是 VPN 的 DNS。 - 浏览器自己的缓存:浏览器可能留着自己的短期 DNS 结果,还会复用已经打开的连接,清完之后把浏览器彻底退出再打开,光刷新标签页不够。
- 上游缓存:路由器和 DNS 服务商也会缓存答案,清 Mac 的缓存没法让它们早点去取新记录。
- 网站本身挂了,或者在你的网络里被拦了,换一个网络的其他设备也打不开,原因就不在这台 Mac 的 DNS 上。
如果只是网页加载慢、不是打不开,DNS 缓存很少是瓶颈,更可能的原因见Mac WiFi 卡顿和哪个 App 在用 Mac 的网络。
看看 Mac 实际解析出了什么
用系统解析器查,得到的是 App 拿到的那个答案:
dscacheutil -q host -a name example.com
dscacheutil 手册页说,-q 通过标准调用发起查询,结果要么来自缓存,要么现取。
再直接问 DNS 服务器:
dig example.com
dig 不经过 macOS 的解析器,它的手册页说它用 /etc/resolv.conf 里列的服务器,而 macOS 上这个文件开头就写着,系统里大多数进程做 DNS 解析时并不读它。所以 dig 给出新地址、dscacheutil 还是旧地址,差别就出在 Mac 的缓存或解析器配置上,清一次缓存应该就好;两边都是旧地址,说明上游的记录还没变过来。
看 Mac 正在用哪些 DNS 服务器:
scutil --dns
手动设置的服务器在系统设置 › 网络里,选中一个网络服务,点详细信息,再点 DNS(Apple)。
怪缓存之前,先看 /etc/hosts
/etc/hosts 里写了的名字会绕过 DNS,开发工具、广告拦截工具和一些老教程会往里加几行,然后就忘在那里了,查看它:
cat /etc/hosts
正常的文件只有几行 localhost 和以 # 开头的注释,如果里面出现了那个出问题的域名,它为什么解析成那样就清楚了。只改那一行,用 sudo 运行编辑器,改之前留一份原文件,改完再清一次缓存,localhost 那几行别删。
确认结果
- 运行清缓存的命令。
- 对出问题的域名再跑一次
dscacheutil -q host -a name example.com,看地址对不对。 - 把出问题的浏览器或 App 退出再打开。
- 还不行,就对照
dig、scutil --dns和scutil --proxy,看到底是哪一层在回答。
不要这样做
- 不要定时清 DNS 缓存,也别把它当提速技巧,缓存热着查询更快,清空后头几次反而更慢。
- 不要删
/etc/hosts,也不要改它的权限。 - 用着 VPN 或管理描述文件的公司、学校 Mac,不要自己换 DNS 服务器,先问管理的人,内网名字可能就解析不了了。
- 不要为了「测试 DNS」去改代理或 VPN 设置,先弄清是哪一层在回答。
常见问题
Mac 怎么清除 DNS 缓存?
在终端运行 sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder,输入密码就行,重启 Mac 也能清掉。
现在的 macOS 清 DNS 缓存用什么命令?
Apple 已归档的文章给 OS X 10.10.4 及更高版本列的是 sudo killall -HUP mDNSResponder,之后没有发新的说明,前面再加一句 sudo dscacheutil -flushcache 是常见写法,清掉的只是缓存数据。
清 Mac 的 DNS 缓存会顺带清浏览器缓存吗?
不会,它只清 macOS 解析器的缓存,浏览器要退出再打开,才不会继续用它自己的 DNS 结果和已经打开的连接。
清完缓存,网站为什么还是去旧地址?
查一下 /etc/hosts、代理或 VPN,再看 dig 有没有拿到新地址,上游的 DNS 记录还没变的话,本地怎么清都没用。
Mole 能清 DNS 缓存吗?
不能,Mole Mac 没有清除 DNS 缓存的功能,用上面的终端命令,或者重启 Mac。