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