Mac 上的 mDNSResponder 为什么占这么多 CPU
mDNSResponder 是 macOS 里替所有 App 查 DNS、再通过 Bonjour 找局域网设备的进程,它是系统的正常部分,从 /usr/sbin/mDNSResponder 运行,用的是自己的 _mdnsresponder 账户,健康的 Mac 上 CPU 接近 0%。它一直很忙时,通常是在替别的东西干活,比如浏览器、VPN 或者设备很多的网络,要找的是这个来源,不是把进程停掉。
它是干什么的
手册页(man mDNSResponder)说它是实现多播 DNS 和 DNS 服务发现的守护进程,替其他进程发起 DNS 查询,并把结果缓存下来,所以这个名字经常出现在活动监视器和网络工具里,App 要查地址,实际去问的就是它。
旁边还有一个以 root 运行的 mDNSResponderHelper,写这篇时用的这台 Mac,空闲时两个进程是这样的:
_mdnsresponder 0.0% CPU /usr/sbin/mDNSResponder
root 0.0% CPU /usr/sbin/mDNSResponderHelper
找到是谁在推高它
打开活动监视器的“CPU”标签页,看一分钟 mDNSResponder,短暂的尖峰是正常的,一直很高就一次只改一件事:
- 退出浏览器和会开很多连接的 App,看数字是否在一分钟内回落。
- 关掉 VPN、代理或 DNS 过滤工具,它们会改变每次查询的路线。
- 换一个网络,比如手机热点,负载消失的话,原因就在原来的网络上。
- 想看网络里有哪些服务在广播,运行下面这条几秒钟,再按
Ctrl + C停止:
dns-sd -B _services._dns-sd._udp local
列表很长而且一直在变,说明这个网络里的 Bonjour 设备很多。
| 看到的情况 | 可能的原因 | 怎么试 |
|---|---|---|
| 打开浏览器或 App 时短暂升高 | 正常查询 | 不用管 |
| 只有开着 VPN 或代理时才高 | 它的 DNS 设置或过滤规则 | 更新它,或者检查它的 DNS 设置 |
| 只在某个网络里才高 | Bonjour 设备很多或者有设备异常 | 换网络对比,再重启路由器或可疑设备 |
| 网站打不开或者还是旧地址 | DNS 结果过期或不对 | 清除 DNS 缓存 |
| 它名下的流量很高 | 查询和局域网发现 | 看 哪个 App 在用网络 |
可以重启它吗
清 DNS 缓存就是给这个进程发一个信号,这是清缓存的正规做法:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
一下就好,需要输入密码,重启 Mac 也能达到同样效果。这只对错误或过期的结果有用,如果是 App 一直在问,负载还会回来。
它是恶意软件吗
真正的文件在系统卷的 /usr/sbin/mDNSResponder,由 /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist 启动,可以在活动监视器的检查器里看路径,或者运行:
ps -axo user,pid,args | grep '[m]DNSResponder'
如果同名进程从别的文件夹运行,比如个人文件夹或 /tmp,就要留心了。路径正确是不错的证据,但它说明不了是哪个 App 在发起查询。
不要这样做
- 不要想办法禁用它,这个启动守护程序受系统完整性保护,没有它整台 Mac 的域名查询都会失效。
- 不要用
kill -9代替-HUP,苹果已归档的支持文章列的就是-HUP这种写法。 - 不要把高流量当成在下载东西,那是查询和局域网发现,真正的来源是其他 App 的活动。
- 不要因为它去装“网络加速”或 DNS 清理工具,它们都告诉不了你是谁在问。
Mole 能做什么
在 Mole 的“状态”里,mDNSResponder 忙的时候会列出 CPU 和内存,不忙时用表格的搜索也能找到。菜单里的“为什么在运行?”会列出可执行文件和由谁启动,这个进程属于系统账户,Mole 读不到它的端口,所以不会显示端口。它是系统网络服务,所以 Mole 不提供停止它的办法。Mole Mac 不清 DNS 缓存,也不改 DNS 和网络设置,这件事用上面的终端命令。点菜单栏的网络速率打开的“网络”列表里也可能出现它,方便区分查询和 App 真正的流量。
常见问题
Mac 上的 mDNSResponder 是什么?
它是替 App 做 DNS 查询、通过 Bonjour 找局域网设备的系统进程,从 /usr/sbin/mDNSResponder 运行。
mDNSResponder 为什么占这么多 CPU?
通常是有东西让它做大量查询或发现,比如某个 App、VPN、DNS 过滤工具或者设备很多的网络,一次改一件事,看数字有没有变。
可以退出或禁用 mDNSResponder 吗?
不要禁用,整台 Mac 的域名查询都靠它,想清掉错误结果,用带 -HUP 的命令清 DNS 缓存。
mDNSResponder 是病毒吗?
真正的进程从 /usr/sbin 运行,由系统启动守护程序启动,从其他文件夹运行的副本才需要仔细看。
mDNSResponder 为什么要联网、还用流量?
它的工作就是网络查询和局域网发现,所以一直在用网络,流量多少取决于其他 App 在问什么,通常很小。