Linux 下 top 命令詳解
top命令用於監控Linux上使用者程序以及系統資源的使用情況,它是網管工具箱中最實用的工具之一。top命令已經預裝到Linux系統中了,它有一定的互動功能,你可以通過它瀏覽程序列表、關閉程序等操作
概述
top命令可以輸出正在執行中的程序列表,並且每隔幾秒鐘自動更新列表中各個程序的狀態
預設情況下,列表是按照CPU的使用率由高到低來排序的,所以可以很輕鬆的觀察到哪個使用者的哪個程序佔用了最多的系統資源,預設排序列是可以修改的,這個在後面的段落中會說到。
我們只需要在終端輸入top
並回車,就進入了命令列模式,輸出下圖所示的總覽資訊以及程序列表,按 Q
或者 Ctrl + Z
退出命令列模式
上圖中,上半部分是系統的總覽資訊,包括:系統資訊、記憶體使用、任務資訊、CPU使用、平均負載、程序列表
系統資訊
如上圖所示,在螢幕的左上角的頂部的紅框部分,顯示了當前時間、系統執行時間(系統已經運行了多久)以及使用者會話數(當前登入了幾個會話)
由圖可知,當前時間是 21:06:40
,系統已經連續運行了3天2小時21分鐘,當前有有兩個會話登入了系統
在終端中輸入 who
並回車, 檢視當前活躍會話,具體輸出如下:
[root@ecs-centos-7 ~]# who root pts/0 2020-08-11 23:45 (112.97.60.180) root pts/1 2020-08-12 00:24 (112.97.60.180)`
記憶體使用
圖中紅框區域是關於系統記憶體使用情況, Mem 和 Swap 分別表示實體記憶體和交換空間
記憶體 | total | free | used | buff/cache |
---|---|---|---|---|
Mem | 總實體記憶體 | 空閒記憶體 | 已經使用的記憶體 | 核心緩衝區以及頁快取 |
Swap | 總的交換空間 | 空閒交換空間 | 已經使用的交換空間 | 空 |
任務資訊
任務區域展示的是系統中程序的統計資訊,下面是各個引數的說明
total: 總的程序數
running: 正在執行的程序數
sleeping: 睡眠中的程序數
stopped: 已經停止的程序數
zombile: 殭屍程序數
上圖中,總共有82個程序,2個正在執行,80個處於睡眠狀態,沒有已經停止的程序,也沒有殭屍程序
CPU使用
CPU百分比部分顯示了在各種任務上花費的CPU時間的百分比
us: CPU再使用者空間中執行程序花費的時間
sy: CPU再核心空間中執行花費的時間
ni: nice值,Linux系統使用 nice值決定程序優先順序,值越大程序優先順序越低,值越小優先順序越高
id:CPU保持空閒的時間
wa: CPU等待IO完成花費的時間
hi: CPU處理硬中斷花費的時間
si: CPU處理軟中斷花費的時間
st: 因CPU在其他虛擬機器上繁忙而無法執行當前任務所浪費的時間
平均負載
上圖中紅框區域是系統平均負載,分別表示一分鐘、五分鐘、十五分鐘的平均負載,負載是系統執行計算工作量的度量
在單核系統中,假如平均負載是 0.6,表示系統處於 60% 負荷的狀態
平均負載是 1,表示系統正處於滿負荷狀態,這個時候如果再增加哪怕一點點的負荷就可以使系統過載
當平均負載達到 2 時,表示其過載超過其負荷的 100%
在多核系統上,CPU核數就是系統負載的上限,比如:一臺 4 核機器上負載上限就是 4
程序列表
下圖中紅框區域是系統中的程序列表
程序列表列說明:
- PID
程序ID,標識每個程序的唯一ID
- USER
程序是由哪個使用者啟動的
- PR、NI
PR欄位從核心的角度顯示程序排程優先順序
NI 欄位是前面介紹的程序nice值,會影響程序的優先順序
- VIRT、RES、SHR、 %MEM
這幾個引數都是和程序記憶體消耗相關
VIRT
是程序記憶體佔用的總大小,包括程式程式碼,程序中儲存資料以及被換出到磁碟中的記憶體頁
RES 是程序佔用的實體記憶體大小
%MEM 是程序佔用實體記憶體的百分比,可以通過下面的公式計算得到
%MEM = 實際的實體記憶體大小 / RES大小
SHR 是程序間共享記憶體的大小
- S
程序狀態,前面 任務資訊 段落提到了程序的幾種狀態,分別是:執行狀態、睡眠狀態、停止狀態、殭屍狀態
- %CPU
程序佔用的CPU百分比
- TIME+
程序從啟動到當前為止佔用CPU的總時間,能精確到0.01秒
- COMMAND
顯示程序名稱
啟動、關閉 top 命令列
在終端中輸入 top
按回車鍵,即可啟動 top 的命令列,
按 Q
鍵或 者Ctrl + Z
鍵可退出命令列模式
還有一種退出方式,在終端中輸入 top -n 5
命令,待進入命令列,更新5次資料之後會自動退出命令列
顯示指定使用者程序
終端中輸入 top -u 使用者名稱
或者 top U 使用者名稱
就可以顯示指定使用者的程序列表,下面的例子是顯示 root 使用者的程序列表, 具體如下所示:
[root@ecs-centos-7 ~]# top -u root
top - 00:36:50 up 4 days, 5:51, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 83 total, 1 running, 82 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 3.1 sy, 0.0 ni, 96.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1881544 total, 1130088 free, 358548 used, 392908 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1370264 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 125372 3764 2580 S 0.0 0.2 0:02.76 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
5 root 20 0 0 0 0 S 0.0 0.0 0:02.77 kworker/u4:0
6 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/0
顯示指定程序ID的程序
終端上輸入 top -p 程序ID
可以顯示指定程序ID的程序,下面的例子顯示程序ID為 1 的程序,具體輸出如下所示:
[root@ecs-centos-7 ~]# top -p 1
top - 00:42:50 up 4 days, 5:57, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1881544 total, 1130460 free, 358172 used, 392912 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1370640 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 125372 3764 2580 S 0.0 0.2 0:02.76 systemd
終端上輸入 top -p 程序ID1,程序ID2,程序ID3
可以顯示 程序ID1,程序ID2,程序ID3 這三個程序,具體輸出如下所示:
[root@ecs-centos-7 ~]# top -p 1,2,4
top - 00:43:50 up 4 days, 5:58, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 3 total, 0 running, 3 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1881544 total, 1130576 free, 358048 used, 392920 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1370760 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 125372 3764 2580 S 0.0 0.2 0:02.76 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
顯示完整命令
有時候需要檢視 COMMAND 列的完整命令, top -c
命令可以達到目的
[root@ecs-centos-7 ~]# top -c
top - 00:54:32 up 4 days, 6:09, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 83 total, 1 running, 82 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1881544 total, 1130072 free, 358532 used, 392940 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1370272 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 125372 3764 2580 S 0.0 0.2 0:02.76 /usr/lib/systemd/systemd --switched-root --system --deserialize +
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kthreadd]
從上面的例子中可以看出,程序ID為1的程序 COMMAND 列顯示了完整的命令
設定重新整理頻率
進入top的命令列模式後,預設是3s左右會重新整理一次,我們可以使用 top -d 重新整理的秒數
來設定重新整理的頻率,比如 top -d 5
命令是設定每5s重新整理一次
多核CPU監控
在top命令列模式下,按鍵盤數字 1 ,可以監控每個邏輯CPU的資訊
上圖中綠色框裡是查詢邏輯CPU的數量,紅色框是每一個邏輯 CPU 資訊
從圖中可知,當前機器有 2 個邏輯CPU,%CPU0 和 %CPU1 分別是兩個邏輯 CPU 的資訊
程序排序
預設是按照 %CPU 列 也即CPU的百分比佔用來排序的,可以通過 Shift + >
或 Shift + <
向右或向左改變排序的列
在上面的動畫中,進入top命令列之後,預設是以 %CPU 列排序的,按一次 Shift + >
鍵右移排序的列,新的排序列變成了 %MEM