Linux:top指令
學習自:(99+ 封私信 / 81 條消息) TOP命令參數詳解---10分鐘學會top用法 - 知乎
0、常用
本節為top常用參數總結,初學者請從第一節開始看。
1)前五行

分別代表
①top-服務器啟動至今的一些信息:當前時間、運行時間、當前用戶、系統負載(1 5 15分鐘內的平均值)
②Tasks:當前整體進程運行情況
③%CPU:當前各任務占用CPU百分比,總和為100%:
us:用戶進程占用
sy:系統內核占用(資源調度之類的)
ni:優先級調整占用
id:空閑
wa:等待磁盤IO
④KiB Mem:當前各任務占用內存,單位默認為KiB(寫在該行最前了),如果要切換單位可以按E:
total:內存總量
free:空閑內存
used:已用內存
buff/cache:緩存(比內存更接近CPU的一塊存儲)
⑤KiB Swap:Swap內存使用情況
total:Swap區總量
free:空閑Swap區
used:已用Swap區
avail Mem:預估可用內存
2)第7行:詳細進程信息
PR:優先級,反映被調度的優先度,該值越小優先度越高
NI:NICE值,PR=NI+20
VIRT:VIRTUAL,虛擬內存,進程理論上可用的內存上限
RES:駐留內存,當前已使用的物理內存大小(不含Swap)
SHR:共享內存,是RES的一部分,RES-SHR為獨占內存
S:進程狀態:
R:Running
S:Sleeping,休眠等待某個事件,可主動被信號中斷
D:Disk Sleeping,休眠等待某個事件,必須該事件完成后才會恢復
Z:Zombie,僵尸進程,進程已終止,但父進程還未回收其資源——PID仍存在
T:Stopped,收到了暫停信號SIGSTOP后暫停,可通過恢復信號SIGCONT恢復
t:Traced,被調試器跟蹤
%CPU:進程CPU使用率,如果為多線程則為所有線程使用率之和(可通過H切換為多線程顯示模式,不過一般不直接在整體top里邊用,而是用top -H pid的形式專門顯示某個進程的所有線程)
%MEM:進程物理內存占用系統總內存百分比
TIME+:進程累計使用CPU時間
COMMAND:啟動進程的命令或程序(可通過c切換為完整指令模式)
3)常見用法
#指定刷新時間,每秒刷新一次:-d top -d 1 #刷新2次:-n top -n 2 #輸出到文件(通常配合-n):-b #如果不限制-n,則會每3s打一次一直持續 top -n 1 -b > /tmp/log.txt #指定進程:-p或--pid top -p 21478 top -p $(pgrep nginx) #指定用戶:-u user或-U UID top -u root top -U 1000 #精細到線程級(通常配合-p查看某個進程的線程):-H top -Hp 1000 #指定單位(默認KiB):-E top -E m top -E g #指定排序依據的字段:-o top -o %CPU
4)交互式命令
M、P、T:按MEM、CPU、TIME+進行排序
u:篩選出某個用戶的進程信息
1:顯示多核CPU每個核的情況
E:切換顯示單位
H:精細到線程級別
k:終止進程
f:進入布局自定義模式
q:退出
1、說明
top指令可以提供一個不斷更新的當前系統進程、負荷信息。
2、輸出

輸出內容可以分為兩部分:
前五行:系統整體的統計信息
從第八行開始:具體進程信息
1)第一行
top - 16:20:38 up 12 days, 5:24, 2 users, load average: 0.04, 0.03, 0.05
說明:
top:當前時間
up:機器運行時間
users:當前登錄用戶數
load average:系統負載,即任務隊列的平均長度。三個數值分別為 1 5 15分鐘到現在的平均值
任務隊列是指CPU正在處理、等待CPU處理的進程之和。
load average升高可能代表①系統正在進行CPU密集型計算;②由于I/O問題導致隊列堵塞。
一個CPU在一個時間片內只能運行一個進程,CPU核數的多少直接影響該機器在同時間內能運行的進程數。正常情況下Load Average不超過這臺機器的總核數就基本沒啥問題。
2)第二行
Tasks: 127 total, 1 running, 126 sleeping, 0 stopped, 0 zombie
說明
Tasks:當前進程總數(以下四類加起來)
running:正在運行的進程數
sleeping:正在休眠的進程數
stopped:停止的進程數
zombie:僵尸進程數
running越多,服務器壓力越大。
3)第三行
%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0si, 0.0 st
說明
各種任務占用的CPU百分比,它們的總和為100。
指標 |
含義(均為該任務項占用CPU百分比) |
例子 |
| us | user,用戶空間 |
shell程序、編譯器、各種應用、WEB服務器、桌面應用。 以上這些應用如果不是處于idle狀態,那么絕大多數時間都是處于用戶態。 |
| sy | system,內核空間 |
進程運行時的資源由Linux內核調度,該項反映了Linux用于資源調度的時間。 對于OS設計而言,消耗在內核態的時間應該越小越好。 實踐中,有一種典型情況會使sy變大,那就是大量的IO操作,因此在調查IO相關問題時需要著重關注它。 |
| ni | nice,用戶空間中進程調整優先級 |
用戶態進程具有優先級,通過nice值進行調整。 nice值調整會消耗CPU時間,如果系統中沒有進程被調整過nice值,那么ni就為0。 |
| id | idle,空閑CPU | |
| wa | waiting,等待輸入輸出 |
由于磁盤IO的速度與CPU的處理速度不在一個量級,因此經常會出現CPU在啟動磁盤讀寫操作后,需要等待讀寫操作結果返回的情況。 在此之前CPU只能處于空閑狀態,Linux在計算系統平均負載時會把CPU等待IO操作時間也計入其中,因此當我們看到系統平均負載過高時,可以通過wa來判斷系統性能瓶頸是不是由過多IO引發的。 |
| hi | hardirq,硬中斷 |
硬中斷:硬盤、網卡等硬件設備給CPU發出的中斷消息。 CPU收到中斷消息后需要進行處理(消耗CPU時間)。 |
| si | softirq,軟中斷 |
軟中斷:由程序發出的中斷。 CPU同樣也要處理。 |
| st | steal time,僅用于虛擬機,被Host搶占的CPU |
4)第四行
KiB Mem : 1863012 total, 1286408 free, 216532 used, 360072 buff/cache
KiB:指明了該行數字的單位,均為KiB,即1024B。之所以不用KB,是因為KB有可能在表示1024還是1000上有混淆,而KiB特指210=1024B。
說明
total:物理內存總量
free:空閑內存量
used:已使用內存量
buff/cache:用作buffer/cache(緩存)的內存量。
5)第五行
KiB Swap: 5242876 total, 7999484 free, 0 used. 1468240 avail Mem
本行為交換區(Swap)內存的相關信息,Swap區是硬盤上劃分出的一塊特殊區域,也叫虛擬內存,但由于本質是硬盤,所以讀寫速度慢。
當內存不足時,內核會將不常用的內存數據“換出”到Swap中,避免程序崩潰,但頻繁的換入換出會嚴重拖慢系統速度(因為CPU讀寫硬盤的速度遠低于CPU讀寫內存的速度)。
說明
total:Swap區內存總量
free:空閑Swap區內存量
used:已使用Swap區內存量(從內存中交換到硬盤中的數據量)
avail Mem:預估可用內存,即內存free + 可回收的buff/cache + Swap free
第四行、第五行對比來看,可以用于判斷系統內存是否充足,如果內存used過高且Swap used持續增長,通常說明內存資源緊張,需要排查內存占用過高的進程。
6)進程信息
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 21829 root 20 0 0 0 0 S 0.7 0.6 129:53.91 java 22559 root 20 0 158920 5628 4268 S 0.3 9.2 139:42.81 java 22598 root 20 0 162112 2208 1540 S 0.3 0.1 0:04.68 fluentd
說明
| 指標 | 含義 | 說明 |
| PID |
Process ID。 進程ID |
|
| USER | 用戶所屬用戶 | |
| PR |
Priority。 進程優先級。 |
數值越小,優先級越高,越容易被CPU調度。 帶RT標記的進程為“實時進程”,優先級通常高于普通進程。 |
| NI |
Nice。 謙讓值。 |
用于調整進程優先度的“謙讓度”,簡介影響PR值。 針對非實時進程,關系為PR=NI+20 |
| VIRT |
Virtual Memory 虛擬內存使用量 |
虛擬內存:該進程理論上可以訪問的內存范圍。 包括: 1、進程實際使用的物理內存(RES) 2、未使用的Swap空間內存 3、共享庫中未加載到物理內存中的部分 4、已被分配但未使用的內存(例如程序預留內存) |
| RES |
Resident Set Size 駐留內存 |
進程當前使用的物理內存(RAM)大小(KiB),不含Swap。 說明: 1、僅計算實際加載到物理內存中的部分(不含未使用的虛擬內存); 2、包含和其他進程共享的內存(如共享庫) |
| SHR |
Shared Memory 共享內存 |
進程使用的共享內存大小(KiB)。 包括: 1、與其他進程共享的庫(如系統動態鏈接庫libc.so) 2、通過shm等機制創建的進程間共享內存。 SHR是Res的一部分,非共享內存(獨占內存)=RES-SHR |
| S |
Process State 進程狀態 |
使用單個字母表示: R:Running,就緒、運行 S:Sleeping,休眠(等待某個事件,如IO) D:Disk Sleeping,深度休眠(不可被信號中斷,通常為等待磁盤IO) Z:Zombie,僵尸進程(進程已終止,但父進程還未回收其資源——PID仍存在) T:Stopped,暫停(如收到了SIGSTOP信號,可以通過SIGCONT恢復) t:Traced,被調試器跟蹤 |
| %CPU | 進程CPU使用率 |
該進程在最近一次刷新(默認3s)內占用的CPU百分比(一個CPU最高為100%,n核系統上限為n×100%)。 若某進程為多線程,默認計算所有線程CPU使用率總和(可按H切換為顯示單個線程)。 |
| %MEM | 進程物理內存占系統總內存百分比 |
計算公式為:(RES/系統總物理內存)×100%。 反映了進程占用物理內存的比例。 |
| TIME+ | 進程累計使用CPU時間(包括用戶態、內核態) |
精確到0.01s。 |
| COMMAND | 啟動進程的命令或程序 |
默認顯示命令的簡化名稱(如bash、nginx) 按c可以切換為完整命令行(包含參數,如nginx -c /etc/...) |
以上為默認情況下顯示的一些比較重要的指標,還有一些隱藏參數(下圖未加*前綴的部分,按f進入下圖):

3、top命令使用
1)調整顯示內容
通過f鍵可以編輯顯示內容,按f后進入下圖:

說明:
①白色高亮的%CPU代表進程信息是按照%CPU這一列來排序的,如果要修改排序列,可以先通過上下鍵移動到該指標,按s選中排序列(選中之后首行的sort field is xxx會發生變化),之后按q生效;
②如果要改變顯示順序,可以先通過上下鍵移動到該指標處,再按右鍵(鍵盤→鍵,不是鼠標右鍵),此時會將該指標整體高亮,之后按上下鍵就可以移動該指標的布局位置了,如果要退出排序模式,可以按左鍵(即←)。
③顯示的列前帶有星號(*),如果要控制該列是否顯示,可以通過空格或d鍵來控制該列是否顯示。
④按q退出布局設置模式,回到top顯示頁面。
⑤默認排序方式是降序,如果要改為升序,可以在回到顯示頁面后,按R進行逆序
2)參數
雖然單一個top默認輸出的內容大多數情況下足以滿足我們問題排查所需,但top也允許我們通過參數更加精細化地控制輸出。
參數 |
含義 |
說明 |
| 1、基礎顯示控制 | ||
|
-d 秒數 |
指定刷新間隔(默認3s) |
每秒刷新1次 top -d 1 |
| -b | 批處理模式(Batch Mode),用于將輸出重定向到文件、腳本 |
將一次top結果輸出到文件 top -b -n 1 > top.log |
| -n 次數 | 指定刷新次數后退出 | |
| -c | 顯示完整的command,而非簡化的命令 | 顯示nginx -c /usr/nginx/cof/nginx.conf而非nginx |
| -s | Secure Mode,安全模式,禁止使用交互式命令(如k終止進程),防止誤操作。 | |
| 2、過濾(用戶、進程) | ||
| -u 用戶 | 只顯示指定用戶的進程 |
僅顯示root用戶的進程 top -u root |
| -p PID | 只顯示指定PID的進程(可指定多個PID,用逗號分隔) |
顯示PID為1、100、200的進程 top -p 1,100,200 top -p $(pgrep nginx) |
| -U UID |
按照UID過濾進程(區別于-u,前者只接收用戶名) 顯示UID為1000的用戶進程 |
顯示UID為1000的用戶進程 top -U 1000 |
| --pid PID | 同-p |
顯示所有的nginx進程 top --pid $(pgrep nginx |
| -i | 不顯示idle和zombie進程 | |
| -1 | 顯示所有CPU核心的使用率(將多核系統的%CPU列拆分為多個CPU列) | |
| 3、線程、內存相關 | ||
| -H | 按線程級CPU使用率排序,用于定位具體哪個線程占用資源過高 | |
| -S | 累積模式,顯示進程及其所有子進程的累積CPU時間 | |
| -E 單位 |
切換內存單位(默認KiB),可選的單位有k、m、g |
top -E m:以MB為單位顯示內存 top -E g:以GB為單位 |
| -o 字段 | 指定顯示的內容按照哪個字段進行排序(降序) |
按照CPU使用率降序排序 top -o %CPU |
|
4、交互式命令(非參數,而是進入top之后使用) 以下大小寫是明確的,比如在小寫模式下按p,會生成一個unknown command |
||
| M | 按內存使用率(%MEM)排序 | |
| P | 按CPU使用率(%CPU)排序 | |
| T | 按累積CPU時間(TIME+)排序 | |
| 1 | 同-1,顯示多核CPU的每個核的情況 | |
| u | 同-u,顯示某個用戶的用戶進程 | |
| E | 同-E,切換單位,默認是KB,按一下切換為MB,在按一下切換為GB | |
| H | 同-H,切換進程/線程顯示模式 | |
| k | 終止進程 | 先按k進入kill交互,輸入PID并回車,之后輸入信號編號(如9為強制終止) |
| f | 自定義顯示字段 | 見前文 |
| q | 退出top | |
3)例子
①監控所有的nginx進程,每秒刷新一次
top -p $(pgrep nginx) -d 1
②顯示某進程下的所有線程
top -H -p <PID>
③輸出到文件:-b
每5s刷新一次,共刷新10次,輸出到文件
top -b -n 10 -d 5 > top_stats.logs
④顯示用戶的所有進程,按內存使用率排序
top -u miduser -o %MEM

浙公網安備 33010602011771號