萬盛學電腦網

 萬盛學電腦網 >> 電腦基本常識 >> 蘋果Mac系統關機很慢該怎麼解決?

蘋果Mac系統關機很慢該怎麼解決?

   目前來說,造成關機慢的主要原因可以分為OS X系統本身問題和應用軟件問題。這兩個的本質區別在於,前者造成系統退出後屏幕出現“旋轉齒輪”(Spinning Gear,俗稱無限菊花,甚至有人數圈數,稱之20圈菊花等等)並等待很長時間,而後者是在系統退出之前,系統嘗試退出所有當前運行中的程序的過程,說得更具體點就是,launchd本身退出之時(系統問題)或之前(應用軟件問題)。應用軟件問題我們這裡無法給出任何的答案,Apple也無能為力。我們主要是討論系統問題。

  在後面我們給出一個靠譜的解決方案之前,我們來看看對一個系統問題應該如何入手。當我們去分析大家解決問題的思路的時候可以發現,有這樣幾個大致思路,有的從硬件入手,比如重置PRAM和SMC,內存等方法;有的是根據以往的解決大多數問題的思路開始著手,比如建議修復權限、禁止啟動項等就是這個思路;有的是碰機會,比如關Wifi等。其實,他們都有可能,但是都沒有抓住一個基本有效的方法。對於Troubleshooting的手段來說,幾乎所有有經驗的程序開發人員/系統管理人員等都會想到,系統日志logs,檢查系統日志是排除故障的一大利器,尤其是系統級別的。其實早有網友就注意從這方面著手,可惜有點偏了沒有找到重點。

  1、要抓住重點,還要從系統的內部管理來說。OS X系統啟動的基本步驟是這樣的:

  - 通電,Boot-ROM進行初始化。

  - Boot-ROM後處理,此時是黑屏,電源LED燈亮,如果出現任何錯誤,LED燈會有規律閃動。

  - 開始調用EFI:會聽到咚的那一個長音。

  - EFI啟動:會響應用戶鍵盤,比如進入單用戶模式等按鍵。正常情況下,讀取boot.efi正常後,出現銀色的Apple標識。

  - 啟動內核:看到灰色背景和旋轉齒輪。從這裡開始,就可以從Activity Monitor程序中找到各個進程的關系了。

  - 啟動launchd:此時看到藍屏。launchd負責啟動和管理系統的各個服務

  - login窗口出現:

  - 用戶登錄:用戶登錄後,系統也是使用另外一個launchd來為該用戶開啟用戶環境的,之後,用戶的所有動作(除非特殊情況),都在這第二個launchd的管理之下。

  2、現在讓我們開啟在/Applications/Utilities目錄中的Activity Monitor程序,選擇All Process, Hierarchically, 如下圖,就可以看到各個進程之間的關系。核心總是占用任務ID 0的,而第一個launchd總是ID 1,用戶launchd(下圖中的ID 154)是ID 1的進程子進程。

蘋果Mac系統關機很慢該怎麼解決? 三聯

  3、既然啟動是這個過程,那麼退出/關機就是一個反過程。先關閉用戶環境,就是用戶launchd的退出過程;之後是系統退出過程,也就是ID 1的launchd的退出過程。所以,系統關閉慢的原因,應該是ID 1的launchd在關閉各個由他負責關閉的某個/某些服務的退出延遲造成的。當我們了解了這些之後,就可以著手分析了。

  如何找到哪個服務進程退出延遲了呢?這就要看日志了,打開Console程序,在左邊找到/var/log >> com.apple.launchd >> launchd-shutdown.system.log,之後,在右上角的查找中,輸入timeout,就會出現如下圖的畫面,改圖這是我修改之後的截圖,在修改之前,兩個服務的timeout時間, applevents是20 seconds, securityd是15秒。

  4、這就找到了系統關閉奇慢的真正原因了,launchd給各個服務發出SIGKILL信號後,等待所有服務都退出後,才能退出,而由於一些服務退出超時,就造成整個系統關閉放慢。至於,這些服務為什麼/什麼情況下出現退出異常超時以及如何徹底解決之,我們只有讓Apple的系統開發人員處理了,我們無從修復,不過我們可以通過給他設定退出超時時長來改變一下它的行為,這就需要一點對plist文件的知識了,具體的系統(launchd)如何定義和解讀plist文件,我們不進行深入探討,只給出方法,有興趣的可以去developer.apple.com去讀相關的文檔。

  綜上所述,目前來說,比較靠譜的思路就是,給每個造成退出超時的系統服務設定一個比較短的退出超時時間(1或2秒)。

  根據上面找到的兩個服務來說,一個是com.apple.securityd,一個是com.apple.coreservices.appleevents。我們使用下面的命令來對他們進行處理。

  sudo defaults write /System/Library/LaunchDaemons/com.apple.securityd ExitTimeOut -int 2

  sudo defaults write /System/Library/LaunchDaemons/com.apple.coreservices.appleevents ExitTimeOut -int 1

  6、如果系統詢問,請輸入當前管理員密碼,以完成該命令。

copyright © 萬盛學電腦網 all rights reserved