FlossDoc: 請協力 GPLv3 的中文翻譯工作。

使用 top 監控進程 (process)

FlossDoc,自由中文開源知識庫

Jump to: navigation, search

top 是 Unix/Linux 世界另一個可以顯示系統各進程 (process) 狀態的文字模式工具。和 ps 等不同,top 預設不只是顯示一次進程資訊就結束,而是不斷更新最新情況直至使用者結束程式。更重要,top 如其名重點在列出消耗系統資源最多的十多個進程。

當啟動 top 後會顯示當前包括負載、進程數目、CPU 和 記憶體使用量等系統資訊,並預設會列出 CPU 使用率 (%CPU) 最高的十多個進程 (顯示進程的數目要視乎您畫面的高度)。您可以按不同的鍵改變 top 顯示系統和進程資訊的方式及管理各進程,包括按【M】鍵列出佔用最多記憶體的幾個進程和【I】鍵切換顯示各 CPU 使用率或整體使用率等。常用的 top 命令有:

  • ?h - 顯示說明畫面。
  • q - 離開 top。
  • 【Space】【Enter】 - 更新並重新繪畫整個畫面。
  • M - 進程依記憶體使用率 (%MEM) 由大至小排列。
  • T - 進程依總 CPU 時間 (TIME+) 由大至小排列。
  • I - 在 Solaris 和 Irix 模式切換,改變 CPU 使用率的計算方法。預設一般為 Irix 模式,
  • k - 終止某個進程
  • r - 改變進程 nice 值,影響進程的優先序

目录

畫面資訊

以下是一個典型 GNU/Linux 上 top 的畫面:

top - 16:39:44 up 18:06,  4 users,  load average: 0.06, 0.08, 0.08
Tasks: 145 total,   3 running, 142 sleeping,   0 stopped,   0 zombie
Cpu(s): 10.9%us,  1.9%sy,  0.0%ni, 87.0%id,  0.0%wa,  0.2%hi,  0.0%si,  0.0%st
Mem:   2063588k total,  1381740k used,   681848k free,    28732k buffers
Swap:  3004112k total,     4740k used,  2999372k free,   431004k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 7830 johndoe   20   0  612m 345m  35m R   12 17.1  88:08.30 firefox
 6892 root      20   0  472m 114m  12m S   11  5.7  49:38.39 Xorg
 8642 johndoe   20   0  111m  31m  16m R    1  1.6   0:32.48 gnome-terminal
 7362 johndoe   20   0 32368 4980 3744 S    1  0.2   6:10.90 pulseaudio
 7367 johndoe   20   0  8456 5408 2288 S    1  0.3   0:08.98 gconfd-2
 7486 johndoe   20   0 84784  32m  17m S    1  1.6   0:33.38 gnome-panel
31594 johndoe   20   0  2416 1168  884 R    1  0.1   0:07.02 top
    1 root      20   0  3056 1884  564 S    0  0.1   0:01.52 init
    2 root      15  -5     0    0    0 S    0  0.0   0:00.00 kthreadd
    3 root      RT  -5     0    0    0 S    0  0.0   0:00.06 migration/0
    4 root      15  -5     0    0    0 S    0  0.0   0:01.26 ksoftirqd/0
    5 root      RT  -5     0    0    0 S    0  0.0   0:00.00 watchdog/0

整個 top 畫面主要分成三個區域,由上至下分別為:

  1. 概要區 (Summary Area) - 顯示整個系統的資訊
  2. 訊息/提示列 (Message/Prompt Line) - 顯示各命令的結果訊息或讓使用者輸入命令的參數,平常為一列空行。
  3. 任務區 (Task Area) - 顯示各任務/進程[1]的資料。

概要區 (Summary Area)

第一列顯示現時時間、系統運作時間 (up time)、使用者數目 (users) 和平均負載 (load average)。可以按 l 鍵切換是否顯示。

top - 16:39:44 up 18:06,  4 users,  load average: 0.06, 0.08, 0.08

平均負載的三個數值分別為在平均過去 1 分鐘、5 分鐘和 15 分鐘在可運行或不可中斷狀態的進程數目。平均負載為 1.0 表示一個 CPU 被佔用所有時間。[2]如果電腦有多個 CPU,平均負載的參考值亦會倍數增長。例如一個雙 CPU 隻核的電腦,所有 CPU 所有時間被完全佔用時的平均負載應該為 1.0 x 2 x 2 = 4.0。

第二列顯示任務 (task) 資訊,包括任務總數、運行中 (running)、睡眠中 (sleeping)、停止了 (stopped) 和不能運作 (zombie) 的進程數目。可以按 t 鍵切換是否和下一列 CPU 狀態列一同顯示。

Tasks: 145 total,   3 running, 142 sleeping,   0 stopped,   0 zombie

第三列顯示 CPU 狀態,包括以下資料[3][4][5]

  • us (user): 使用者空間 (user space) 佔用 CPU 百分比。此數值主要受較少 I/O 等系統呼叫的進程所影響。
  • sy (system): 核心空間 (kernel space) 佔用 CPU 百分比。一般在系統要處理大量 IRQ 或任務排程時,此值會較高。
  • ni (nice): nice 值比一般值 0 大 (優先序較低) 的進程佔用 CPU 百分比
  • id (idle): CPU 閒置時間百分比
  • wa (iowait): CPU 等待輸入/輸出的百分比。當些值過高 (如超過 30%),表示系統的儲存或網絡 I/O 效能有問題。
  • hi (H/W Interrupt): CPU 處理硬體中斷時間的百分比。除光碟機不斷檢查是否有光碟外,一般此值不會太高。
  • si (S/W Interrupt): CPU 處理軟體中斷時間的百分比,此值很少機會會太高。
  • st: (Steal): 在如 Xen 等虛擬環境下 CPU 運作虛擬機器時間的百分比。太高表示可能需要停止一些虛擬機器。
Cpu(s): 10.9%us,  1.9%sy,  0.0%ni, 87.0%id,  0.0%wa,  0.2%hi,  0.0%si,  0.0%st

您可以按 t 鍵切換是否和上一列任務資訊一同顯示。在多處理器 (multi-processor) 或多核 (multi-core) 系統上,您亦可以按 1 鍵切換使用一列顯示整體 CPU 使用狀態還是每個 CPU 使用一列顯示其狀態。

第四列和第五列分別顯示記憶體和置換空間 (swap space) 使用率。可以按 m 鍵切換是否顯示。

Mem:   2063588k total,  1381740k used,   681848k free,    28732k buffers
Swap:  3004112k total,     4740k used,  2999372k free,   431004k cache

buffers (緩衝區) 表示被使用作磁碟寫入快取 (write cache) 的記憶體大小。當有磁碟控制卡有時間或系統記憶體不夠時,自然會把 buffers 上的資料清出 (flush) 至磁碟並釋放有關記憶體。過大 buffers (超過幾百 MB) 一般表示儲存子系統有問題,令 buffers 上的資料無法清出。

cache (快取) 則表示被使用作檔案讀取快取 (read cache) 的記憶體大小。同樣在統記憶體不夠時,部份 cache 使用的記憶體會被釋放。當系統正進行大量讀取工作,此值效高是很自然和良好的現像。但如果此值在有大量讀取工作時過低 (少於總記憶體大小的四成),這表示系統到了需要增加記憶體的時候。

對大部份伺服器工作,置換空間 (swap) 被使用一般都會拖慢整個系統。除 Oracle 等本身會盡用置換空間的服務外,一般伺服器在開始使用超過幾 MB 的置換空間時都表示需要進行一些微調工作。

任務區 (Task Area)

任務區會由大至小每列顯示一個耗用系統資料 (預設為 CPU 使用率) 的進程。每個進程預設會顯示以下資料:

  • PID (Process ID) - 進程的識別碼
  • USER (Effective user name) - 進程的有效使用者名稱,決定了進程的使用權限,一般是執行進程的使用者,但 suid 進程則會變成程式檔案的擁有者。
  • PR (priority) - 進程的優選值,數值越小表示進程的優先序越高。
  • NI (nice) - 進程的 nice 值,會影響進程的優選值 (priority),可以為 20 至 -19 任何一個整數,數值越小會令進程的優先序越高。
  • VIRT (Virtual memory) - 進程使用的總虛擬記憶體 (virtual memory) 大小,包括進程的程式碼、資料和共享程式庫再加上被置換 (swap out) 的空間,單位為 KiB。VIRT = SWAP + RES.
  • RES (Resident size) - 進程非被置換的實體記憶體大小,單位為 KiB。RES = CODE + DATA
  • SHR (Shared Mem size) - 進程使用的共享記憶體大小,即可以和其他進程共享的記憶體空間,單位為 KiB。
  • S (Stats) - 進程的狀態,可以為:
    • D (uninterruptible sleep) - 在不可中斷的休眠中 (一般為正在進行輸入/輸出)
    • R (running) - 在運行中或可以被運行 (即在運行序列 run queue)
    • S (sleeping) - 在可以被中斷的休眠中 (一般是正在等待某事件完結)
    • T (traced or stopped) - 已被停止。因工作控制訊號 (job control signal) 或進程在被追踪中。
    • Z (Zombie) - 不能運作的進程,即所謂 zombie 進程。一般因為已終止但未能被其母進程成功接收的進程。
  • %CPU (CPU usage)- 由上次 top 畫面更新資料後進程的 CPU 使用率。為進程佔用的 CPU 時間除以實際時間 (CPU 時間 / 實際時間),以百分比顯示。顯示小數點後一個位。可以按 I 鍵切換 Irix 模式 (一般計算方法) 和 Solaris 模式 (一般的 CPU 使用率再除系統的處理器數目) 改變此欄顯示的數值。
  • %MEM (Memory usage) - 進程佔用實體記憶體大小對系統總實體記憶體大小的比例,以百分比顯示。
  • TIME+ (CPU Time)- 由進程被啟動至今的總 CPU 時間。可以按 S 鍵切換是否開啟累計模式 (Cumulative mode) 改變此欄顯示的數值。
  • COMMAND (Command line or Program name) - 啟動進程的命令,可以按 c 鍵切換只顯示程式名稱或整個連參數的命令行。

您可以按 fo改變顯示那些進程資料和顯示次序,亦可以按 O改用 CPU 使用率以外的其他資料排列雜程

改變進程優先序

PID to renice: 1234
Renice PID 1234 to value: 5

終止進程

PID to kill: 1234
Kill PID 1234 with signal [15]: HUP

改變進程資料排序方法

任務區 (Task Area) 上的進程一般是依每個進程的 CPU 使用率 (%CPU) 由大至小排列,讓您短到佔用 CPU 最多的幾個進程。您可以改用其他進程資料排序,最簡單有以下:

  • M - 進程依記憶體使用率 (%MEM) 由大至小排列。
  • N - 進程依 PID 由大至小排序。
  • T - 進程依總 CPU 時間 (TIME+) 由大至小排列。
  • P - 回復到預設設定 - 依 CPU 使用率 (%CPU) 由大至小排列。

OF 鍵顯示另一個畫面列出所有可以顯示的進程資料,讓您選擇使用那項資料排序。您亦可以直接按 < 改用現時排序欄目在畫面上左邊的欄目排序,而按 > 鍵會改用右邊的欄目排序。 (提示:按 bx 鍵令正排序的欄目反白可以較易看到 </> 鍵的效果。

改變會顯示的進程資料

預設顯示的進程資料外,任務區 (Task Area) 亦可以顯示其他進程資料。

f 鍵顯示另一個畫面列出所有可以顯示的進程資料欄目,包括:

  • a: PID (process ID) - 進程的識別碼
  • b: PPID (Parent process ID) - 進程的母進程識別碼,一般為執行讓進程的進程。
  • c: RUSER (Real user name) - 進程真實擁有者的使用者名稱,即是執行進程的使用者。
  • d: UID (User ID) - 進程的有效使用者識別碼 (effective UID),一般為執行進程的使用者,但 suid 進程則會變成程式檔案的擁有者。
  • e: USER (User name) - 進程的有效使用者名稱,一般為執行進程的使用者,但 suid 進程則會變成程式檔案的擁有者。
  • f: GROUP (Group name) - 進程的有效群組 (effective user group) 名稱,一般為執行進程的群組,但 sgid 進程則會變成程式檔案的所屬群組。
  • g: TTY' (Contorlling TTY) - 進程的操控終端機名稱,作為進程的輸入和輸出。但對一些沒有輸入/輸出的進程 (例如伺服器進程或 X Window 程式),此欄會顯示 '?'。
  • h: PR (Priority) - 進程的優選值,數值越小表示進程的優先序越高。
  • i: NI (Nice value) - 進程的 nice 值,會影響進程的優選值 (priority),可以為 20 至 -19 任何一個整數,數值越小會令進程的優先序越高。
  • j: P (Last used processor) - 進程最後使用的處理器編號。在多處理器或多核系統中,此值會改變得頗密。尤其在 top 運作時,會因需要額外更多 CPU 時間運行 top 而令此值的改變更密。
  • k: %CPU (CPU usage) - 由上次 top 畫面更新資料後的 CPU 使用率。可以使用 I 命令切換 Irix 模式 (一般計算方法) 和 Solaris 模式 (一般的 CPU 使用率再除系統的處理器數目) 改變此欄顯示的數值。
  • l: TIME (CPU Time) - 由進程被啟動至今的總 CPU 時間。可以使用 S 命令切換是否開啟累計模式 (Cumulative mode) 改變此欄顯示的數值。
  • m: TIME+ (CPU Time) - 和 TIME 一樣顯示進程被啟動至今的總 CPU 時間,但顯示小數點後兩個位 (精確度至百分之一秒)。可以使用 S 命令切換是否開啟累計模式 (Cumulative mode) 改變此欄顯示的數值。
  • n: %MEM (Memory usage) - 進程佔用實體記憶體大小對系統總實體記憶體大小的比例,以百分比顯示。
  • o: VIRT (Virtual Image) - 進程使用的總虛擬記憶體 (virtual memory) 大小,包括進程的程式碼、資料和共享程式庫再加上被置換 (swap out) 的空間。VIRT = SWAP + RES
  • p: SWAP (Swapped size) - 進程被置換的虛擬記憶體空間大小。
  • q: RES (Resident size) - 進程非被置換的實體記憶體大小。RES = CODE + DATA
  • r: CODE' (Code size) - 進程的程式碼在實體記憶體佔用空間大小,亦叫作 text resident set (TRS)。
  • s: DATA (Data+Stack size) - 進程佔用實體記憶體中的非程式碼部份大小,亦叫作 data resident set (DRS)。
  • t: SHR (Shared Mem size) - 進程使用的共享記憶體大小,即可以和其他進程共享的記憶體空間。
  • u: nFLT (Page Fault count) - 進程中發生主要記憶頁錯誤 (major page fault) 的次數。此錯誤主要在進程企圖存取一個現時不存在的虛擬記憶頁 (virtual page) 時產生,這表示系統需要由硬碟讀入該記憶頁。
  • v: nDRT (Dirty Pages count) - 進程中在上次被寫入硬碟後曾被更改過的記憶頁數目。
  • w: S (Process Status) - 進程的狀態
  • x: COMMAND (Command line or Program name) - 啟動進程的命令,可以使用 c 命令切換只顯示程式名稱或整個連參數的命令行。
  • y: WCHAN (Wait Channel) - 視乎是否有核心連結表 (kernel link map,即檔案 System.map),此欄目會顯示進程現時睡眠中核心函數 (kernel function) 的名稱或地址。正在運行中的進程則會在此欄顯示一個減號 (-)。留意顯示此欄會令 top 多用 700 KB 的記憶體。
  • z: Flags (Task Flags) - 進程現時的排程旗號,以十六進位顯示。

您可以按欄目左方的字母切換是否顯示該欄目。會顯示的欄目,字母會變成大階並在左方有星號 (*)。不會顯示的欄目亦為小階。

此外,按 o 鍵,可以改變顯示欄目由左至右的次序。按欄目左方字母的小階,會把欄目移向右方。按大階字目,會把欄目移向右方。

改變畫面更新時間

top 預設會每三秒更新畫面和所有資料,但您可以在 top 中按【d】或【s】鍵改變更新畫面時間:

Change delay from 3.0 to: 2

上例表示設定每 2 秒更新畫面。更新時間可以小數點後一個位 (十分之一秒) 的小數,但不能為負數。您亦可以在啟動 top 時加入選項 -d 更新時間 設定更新畫面時間:

top -d 2.5

監察個別使用者的進程

要只監察有效 UID (effective UID) 為個別使用者的進程,可以在 top 按下【u】鍵並輸入要監察使用者的名稱 (user name) 或識別碼 (UID):

Which user (blank for all): johndoe

不輸入任何字完直接按【Enter】會重設為顯示所有進程。您亦可以在啟動 top 時加上選項 -u 使用者

top -u johndoe

同樣,您可以使用使用者名稱或使用者識別碼來指定使用者。以上命令會令 top 只顯示有效 UID 為使用者 johndoe 的進程。

如果要監察真正/有效 UID 為個別使用者的進程,可以在 top 按下大寫【U】鍵並輸入要監察使用者的名稱 (user name) 或識別碼 (UID):

Which user (blank for all): johndoe

您亦可以在啟動 top 時加上大寫 -U 使用者 選項:

top -U johndoe

監察個別進程

要只監察個別進程,可以啟動 top 時加上選項 -p PID

top -p 1234

以上命令會令 top 只顯示 PID 為 1234 的進程。您可以多個 -p 選項或使用逗號隔開多個 PID 來監察多個進程:

top -p 1997,2003,2008,2012,2046

top 在使用 -p 選項時最多只可以同時監察 20 個進程。

命令列表

主要命令:

  • ?h - 顯示說明畫面。
  • q - 離開 top。
  • 【Space】【Enter】 - 更新並重新繪畫整個畫面。
  • ds - 改變畫面更新時間
  • z - 切換單色或彩色顯示模式。
  • B - 切換是否以粗體強調重要資料。
  • c - 切換進程命令欄只顯示命令本身還是連參數顯示整個命令。
  • f - 改變會顯示的進程資料欄目。
  • o - 改變顯示進程的排序方法。
  • M - 進程依記憶體使用率 (%MEM) 由大至小排列。
  • N - 進程依 PID 由大至小排序。
  • P - 進程依 CPU 使用率 (%CPU) 由大至小排列,預設一般使用此方法排列。
  • T - 進程依總 CPU 時間 (TIME+) 由大至小排列。
  • I - 在 Solaris 和 Irix 模式切換,改變 CPU 使用率的計算方法。預設一般為 Irix 模式,
  • u - 監察有效 UID (effective UID) 為個別使用者的進程
  • U - 監察個真正/有效 UID 為別使用者的進程
  • i - 切換只顯示活躍進程 (不顯示閒置進程 idle process) 或所有進程,預設一般顯示所有進程
  • n - 設定顯示最多進程數目,預設一般會盡用畫面的空間顯示最多的進程。
  • = - 解除如 u/U/i/n 等命令或 -p 選項監察進程的過濾,顯示所有進程。
  • x - 切換是否以粗體或反白強調排序的進程資料欄目。
  • y - 切換是否以粗體或反白強調正在運行的進程。
  • b - 切換 x/y 命令強調的資料以粗體還是反白顯示。
  • k - 終止某個進程
  • r - 改變進程 nice 值,影響進程的優先序
  • l - 切換是否顯示系統運作時間 (up time) 和平均負載 (load average)。預設會顯示。
  • m - 切換是否顯示記憶體和置換空間 (swap space) 使用率。預設會顯示。
  • t - 切換是否顯示進程 (task) 和 CPU 狀態。預設會顯示。
  • 1 - 切換以一列顯示所有 CPU 的平均狀態還是每一個 CPU 顯示一列狀態資訊。預設會只顯示一列平均狀態。

參考資料

  1. 任務 (task) 和進程 (process) 在電腦上一般指相同的東西,Linux 內核上更使用一個叫 task_struct 的結構來表示一個進程。
  2. GNU/Linux Manpage: uptime(1) - Tell how long the system has been running.Linux.pngUbuntu.pngDebian.png[SuSE][OpenSuSE] - procps 中 uptime(1) 的說明文件有對平均負載較詳細的說明
  3. GNU/Linux Manpage: proc(5) - process information pseudo-file systemLinux.pngUbuntu.pngDebian.png[SuSE][OpenSuSE] - CPU 狀態其實讀自 /proc/stat,proc(5) 的說明文件有說明各項目的作用
  4. GNU/Linux Manpage: mpstat(1) - Report processors related statisticsLinux.pngUbuntu.pngDebian.png[SuSE][OpenSuSE] - systat 中 mpstat 的說明文件有各 CPU 狀態較詳細的說明
  5. Alistair Ross (2008-09-16). Analysing system performance with 'top'. The Ultimate Linux Newbie Guide.

相關連結

Personal tools