執行緒
又稱:執行緒數量
簡短回答
執行緒是程序內部一條獨立的執行路徑,一個程序可以在不同的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的執行緒數量
- 在活動監視器中選擇該程序並按兩下,或按一下工具列中的「資訊」按鈕。
- 檢閱器視窗會列出該程序的「執行緒」,以及「連接埠」和「內容切換」。
- 在「終端機」中執行
top -l 1 -pid <PID> -stats pid,command,th,把<PID>換成「PID」欄中的程序ID。#TH值會先顯示執行緒總數,斜線後面是正在執行的執行緒數量。 - 要依執行緒數量排序所有程序,請執行
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上最好用的活動監視器替代方案,或瀏覽詞彙表中的所有詞條。