理解 htop 與 Linux 程序監控
理解 htop 與 Linux 程序監控
理解 htop 與 Linux 程序監控
htop 是一款適用於 Linux 的互動式程序檢視器,提供系統資源的即時概覽。要正確解讀其資料,必須了解 Linux 核心如何追蹤任務,並透過 /proc 偽檔案系統將資訊公開。
系統開機時間與 /proc 檔案系統
系統開機時間表示自上一次開機以來機器已運行的時長。htop 與 uptime 指令皆從 /proc/uptime 取得此數值。
- 資料來源:
/proc/uptime包含兩個數字:系統已上線的總秒數以及系統閒置的總秒數。 - 多核心系統:在多核心機器上,閒置時間的數值可能會超過總開機時間,因為它是所有 CPU 核心的累積總和。
解析負載平均值
負載平均值代表目前正在執行或等待執行(可執行)的程序數量,加上處於不可中斷睡眠狀態(通常在等待 I/O)的程序數量。
負載 vs. CPU 使用率
負載平均值並非 CPU 使用率的直接百分比。它是一個任務計數。例如,在單核心機器上,負載平均值為 1.0 表示 100% 的利用率;在雙核心機器上,負載平均值為 1.0 則表示 50% 的利用率。
計算方式
負載平均值是 1、5、15 分鐘區間內負載數字的指數衰減移動平均。因為它包含不可中斷睡眠(D 狀態)的程序,即使 CPU 使用率低,系統仍可能顯示高負載,通常表示磁碟或網路 I/O 出現瓶頸。
程序識別與層級結構
程序 ID(PID)
每個程序都會被指派唯一的程序 ID(PID)。核心在 /proc/<pid>/ 中公開每個程序的詳細資訊。例如,/proc/<pid>/cmdline 會顯示啟動該程序的指令,而 /proc/<pid>/exe 則是指向執行檔的符號連結。
程序樹
程序以父子層級結構存在。當 shell(如 bash)啟動程式時,會先使用 fork 系統呼叫複製自身,接著使用 exec 系統呼叫載入新程式。這會形成一棵樹狀結構,可在 htop 中按下 F5 以樹狀方式顯示。
解讀程序狀態
htop 中的 S 欄位顯示程序當前的狀態。了解這些狀態對於診斷系統卡頓或效能問題至關重要。
| 狀態 | 含義 | 說明 |
|---|---|---|
| R | 執行中/可執行 | 程序正在 CPU 上實際執行指令,或位於執行佇列中等待執行。 |
| S | 可中斷睡眠 | 程序正在等待某個事件(例如計時器或網路封包),可被訊號喚醒。 |
| D | 不可中斷睡眠 | 程序正在等待 I/O(通常是磁碟),無法被任何訊號(包括 SIGKILL)中斷。 |
| Z | 殭屍 | 程序已結束,但其父程序尚未透過 wait 系統呼叫讀取其退出代碼。 |
| T | 停止 | 程序被工作控制訊號(例如 Ctrl+Z)或除錯器停止。 |
記憶體使用指標
Linux 使用虛擬記憶體來隔離程序,這使得 htop 中的記憶體數值有時會讓人感到困惑。
- VIRT(Virtual Image):程序可存取的虛擬記憶體總量。包括共享函式庫、已換出的頁面以及記憶體映射檔案。這個數字通常被膨脹,對判斷實際 RAM 使用量幫助最小。
- RES(Resident Size):目前實際佔用的、未被換出的實體記憶體。是判斷程序實際記憶體足跡最可靠的指標。
- SHR(Shared Mem):可能與其他程序共享的記憶體,例如共享函式庫。
- MEM%:程序使用的實體 RAM 百分比,計算方式為
RES / 總 RAM。
程序優先權與 Niceness
Linux 排程器根據優先權決定下一個要執行的程序。
- Niceness(NI):使用者空間的值,範圍從 -20(最高優先權)到 19(最低優先權)。「較友善」的程序會讓出更多 CPU 給其他程序。
- Priority(PRI):核心空間的優先權。其關係大致為
PR = 20 + NI。
社群見解
有經驗的使用者提出了幾項提升 htop 使用效率的最佳化建議:
- 檢視最佳化:關閉使用者執行緒、啟用程序樹狀檢視,可減少雜訊,並提供更好的程序來源脈絡。
- 替代工具:部分使用者推薦
btop,其提供更現代的介面,且包含 GPU 監控與功耗(瓦特)資訊,這是htop所缺乏的。 - 記憶體解讀:社群成員強調虛擬記憶體常會產生誤導,例如記憶體映射檔案會膨脹
VIRT,卻不會實際佔用大量實體 RAM。
"Resident size 是最可靠的指標。其他任何指標都可能被無害的記憶體映射檔案等因素錯誤放大,而這些檔案實際上不會造成任何問題。"
常見系統程序
在標準的 Ubuntu Server 安裝中,htop 通常會顯示以下幾個關鍵守護程序:
- /sbin/init (systemd):開機時啟動的第一個程序(PID 1),是所有其他系統程序的父程序。
- systemd-journald:收集並儲存結構化的日誌資料。
- sshd:管理遠端加密連線的 OpenSSH 守護程序。
- cron:負責定期執行排程任務的守護程序。