Mac 上的 mDNSResponder 為什麼占這麼多 CPU
mDNSResponder 是 macOS 裡替所有 App 處理 DNS 查詢、並透過 Bonjour 找出區域網路裝置的程序,它是系統正常的一部分,從 /usr/sbin/mDNSResponder 啟動,以自己的 _mdnsresponder 帳號執行,正常的 Mac 上 CPU 都在 0% 附近。它一直很忙的時候,通常是在替別的東西做事,像是瀏覽器、VPN 或吵雜的網路,所以該做的是找出源頭,而不是把這個程序停掉。
它在做什麼
它的手冊頁(man mDNSResponder)說這是一個實作 Multicast DNS 和 DNS Service Discovery 的常駐程式,替其他程序送出 DNS 查詢,並把答案快取起來。所以它才會常常出現在活動監視器和網路工具裡:App 要查位址時,實際去問的就是這個程序。
旁邊還有第二個程序 mDNSResponderHelper,以 root 執行。本頁使用的這台 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 或代理時 CPU 才高 | 它的 DNS 設定或過濾 | 更新它,或檢查它的 DNS 設定 |
| 只有在某個網路 CPU 才高 | Bonjour 裝置很多或行為異常 | 換個網路測試,再重新啟動路由器或可疑的裝置 |
| 網站打不開或顯示舊位址 | DNS 答案過期或錯誤 | 清除 DNS 快取 |
| 它名下的資料用量很高 | 查詢和本機探索 | 看哪個 App 在使用我的網路 |
重新啟動它安全嗎
清除 DNS 快取就是對這個程序送一個訊號,這也是正式支援的清法:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
這只要一下子,需要輸入密碼。重新啟動 Mac 也有同樣的效果。清快取只能解決錯誤或過期的答案,如果它忙是因為某個 App 一直在查,負載還是會回來。
它是惡意軟體嗎
真正的檔案在系統卷宗上的 /usr/sbin/mDNSResponder,macOS 從 /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist 啟動它。要確認正在跑的是哪一個,可以在活動監視器的檢查視窗看路徑,或執行:
ps -axo user,pid,args | grep '[m]DNSResponder'
如果有同名的程序是從別的資料夾執行,例如你的家目錄或 /tmp,就要提高警覺。路徑正確是不錯的佐證,但它不會告訴你是哪個 App 在造成這些查詢。
不要這樣做
- 不要想停用它。System Integrity Protection 保護著這個 launch daemon,而且沒有這個程序,整台 Mac 的名稱查詢都會失效。
- 不要用
kill -9取代-HUP。Apple 存檔的支援文章列的是-HUP這種寫法。 - 不要把資料用量高當成在下載。那些流量是查詢和探索,真正造成它的是其他 App 的活動。
- 不要為了它去裝「網路加速器」或 DNS 清理工具,這兩種都不會告訴你是誰在查。
Mole 能幫上什麼
它忙的時候,Mole 的「狀態」頁會列出 mDNSResponder 和它的 CPU、記憶體,不忙的時候用表格的搜尋也找得到。選單裡的「為什麼在執行?」會顯示執行檔和是誰啟動了它。macOS 不允許 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 執行,由系統的 launch daemon 啟動。從其他資料夾執行的同名副本值得仔細檢查。
mDNSResponder 為什麼要求網路存取或使用資料?
它的工作就是網路查詢和本機探索,所以一直在用網路。它的資料用量反映的是其他 App 的請求,通常很小。