詞彙表/CPU、GPU和能源

執行緒

又稱:執行緒數量

簡短回答

執行緒是程序內部一條獨立的執行路徑,一個程序可以在不同的CPU核心上同時執行多個執行緒。「活動監視器」中的「執行緒」欄位會顯示每個程序目前有多少個執行緒。

大多數App都會使用很多執行緒:一個負責繪製介面和處理點按,其他的負責網路請求、檔案存取和背景工作。對大型App來說,幾十個執行緒很正常。

執行緒的數量幾乎說明不了一個App有多忙。大部分執行緒都在等待。要看實際的工作量,「% CPU」是更好的指標。

在哪裡查看執行緒數量

在活動監視器中,按一下「CPU」標籤頁。「執行緒」欄顯示每個程序的執行緒數量,視窗底部則顯示這台Mac上執行緒和程序的總數。

在「終端機」中,ps -M -p <PID>會列出單一程序的執行緒。

執行緒數量持續增加時,什麼時候要注意

執行緒數量在幾個小時內一路攀升、始終沒有趨緩,可能表示某個App有錯誤:不斷開啟執行緒卻從不結束。如果這個App的記憶體也跟著增加或變慢,先重新啟動它是合理的第一步,把問題回報給開發者也會有幫助。

為什麼有些App有好幾百個執行緒

macOS透過Grand Central Dispatch為App提供共用的工作執行緒集區。當App分派出很多小工作,例如解碼影像或讀取檔案時,集區會擴大來處理它們,之後再縮小。光是這一點,就可能讓忙碌的App多出數十個執行緒。

瀏覽器、聊天App和程式碼編輯器常常執行多個程序,每個程序都有自己負責繪製、網路、音訊和工序指令的執行緒。音訊和影片App會讓執行緒隨時待命,播放時才不必等待。把這些加起來,一個大型App有幾百個執行緒並不稀奇。

kernel_task的執行緒數量常常是所有程序中最多的。它包含macOS核心及其驅動程式使用的執行緒,並不代表有問題。

如何查看單一App的執行緒數量

  1. 在活動監視器中選擇該程序並按兩下,或按一下工具列中的「資訊」按鈕。
  2. 檢閱器視窗會列出該程序的「執行緒」,以及「連接埠」和「內容切換」。
  3. 在「終端機」中執行top -l 1 -pid <PID> -stats pid,command,th,把<PID>換成「PID」欄中的程序ID。#TH值會先顯示執行緒總數,斜線後面是正在執行的執行緒數量。
  4. 要依執行緒數量排序所有程序,請執行top -o th -stats pid,command,th,按q離開。

正常與值得擔心的執行緒數量

總數沒那麼重要,重要的是它隨時間變化的方向。

  • 正常:打開視窗、開始下載或開始輸出時數量跳升,工作完成後又降回來。
  • 正常:數量雖高但很穩定,好幾個小時都差不多。
  • 值得擔心:數量一整天都在攀升,從不下降,即使App閒置時也一樣。
  • 值得擔心:執行緒數量攀升的同時,記憶體或「連接埠」的數量也在增加。這種組合通常代表App有洩漏。
  • 值得擔心:一個你沒在使用的App有很多正在執行的執行緒(見top中斜線後面的數字)。它在做你沒有要求的工作。

執行緒與CPU核心

執行緒比核心多是正常的。macOS每秒會在執行緒之間切換核心很多次,而且大部分執行緒本來就在等待。只有正在執行的執行緒才會爭奪核心。

同一時刻能執行的執行緒數量,等於sysctl -n hw.logicalcpu提供的邏輯核心數量。如果準備就緒的執行緒比這個數量多,多出來的就得等待,而正是這種等待讓平均負載升高。

大家常問的問題

活動監視器中的「執行緒」是什麼意思?

它是一個程序正在執行的執行緒數量。執行緒讓一個App能同時做好幾件事,例如一邊繪製視窗,一邊下載檔案。

執行緒數量多是壞事嗎?

通常不是。大型App常有數十甚至數百個執行緒,大部分都閒置著。要留意的是數量不停增加的情況。

執行緒和超過100的「% CPU」有什麼關係?

只有當一個程序同時有一個以上的執行緒在工作,它才能用到一個以上的核心。「% CPU」就是這樣超過100%的。

Mac同一時間能執行多少個執行緒?

同一瞬間每個邏輯核心執行一個。執行sysctl -n hw.logicalcpu可以看到這個數字。執行緒可以再多出成千上萬個,但它們要輪流執行。

結束App會釋放它的執行緒嗎?

會。程序結束時,它所有的執行緒都會隨之結束。要重設增加過多的執行緒數量,重新啟動App是最快的方法。

為什麼kernel_task有這麼多執行緒?

kernel_task就是macOS核心,它的執行緒包括核心及其驅動程式使用的執行緒。它的執行緒數量多是正常的。

相關詞條

想找比活動監視器更好的工具?請參閱Mac上最好用的活動監視器替代方案,或瀏覽詞彙表中的所有詞條。