第一行, 任務隊列信息, 同 uptime 命令的執行結果
- 系統時間:15:57:40
- 運行時間:up 6 days, 4:30
- 當前登錄用戶: 3 user
- 負載均衡(uptime) load average: 0.22, 0.25, 0.23
load average 后面的三個數分別是1分鍾、5分鍾、15分鍾的負載情況。load average數據是每隔5秒鍾檢查一次活躍的進程數,然后按特定算法計算出的數值。如果這個數除以邏輯CPU的數量,結果高於5的時候就表明系統在超負荷運轉了
第二行, Tasks — 任務(進程)
- 總進程:234 total, 運行:1 running, 休眠:232 sleeping, 停止: 1 stopped, 僵屍進程: 0 zombie
第三行, cpu狀態信息
- 1.0%us【user space】— 用戶空間占用CPU的百分比。
- 0.6%sy【sysctl】— 內核空間占用CPU的百分比。
- 0.0%ni【】— 改變過優先級的進程占用CPU的百分比
- 98.4%id【idolt】— 空閑CPU百分比
- 0.0%wa【wait】— IO等待占用CPU的百分比
- 0.0%hi【Hardware IRQ】— 硬中斷占用CPU的百分比
- 0.0%si【Software Interrupts】— 軟中斷占用CPU的百分比
第四行, 內存狀態
32780168 total, 279136 free, 20911624 used, 11589408 buff/cache
第五行, swap交換分區信息
2097148 total, 2097148 free, 0 used. 11307284 avail Mem
可用內存=free + buffer + cached
對於內存監控, 在top里我們要時刻監控第五行swap交換分區的used, 如果這個數值在不斷的變化, 說明內核在不斷進行內存和swap的數據交換, 這是真正的內存不夠用了。
第四行中使用中的內存總量(used)指的是現在系統內核控制的內存數,第四行中空閑內存總量(free)是內核還未納入其管控范圍的數量。
納入內核管理的內存不見得都在使用中,還包括過去使用過的現在可以被重復利用的內存,內核並不把這些可被重新使用的內存交還到free中去,因此在linux上free內存會越來越少,但不用為此擔心。
第六行, 空行
第七行以下:各進程(任務)的狀態監控
PID — 進程id
USER — 進程所有者
PR — 進程優先級
NI — nice值。負值表示高優先級,正值表示低優先級
VIRT — 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
RES — 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
SHR — 共享內存大小,單位kb
S 進程狀態,D:不可中斷的睡眠狀態,R:運行,S:睡眠,T:跟蹤/停止,Z:僵屍進程
%CPU 進程使用的CPU占用百分比
%MEM 進程使用的物理內存百分比
TIME+ 進程使用的CPU時間總計
COMMAND — 進程名稱(命令名/命令行)
常用快捷鍵
h 顯示快捷鍵幫助
k 終止一個進程
i 開/關忽略閑置和僵死進程
q 退出程序
r 重新安排一個進程的優先級別
S 切換到累計模式
s 更改刷新間隔時間,單位秒
f,F 從當前顯示中添加或者刪除項目
o,O 改變顯示項目的順序
l 切換顯示平均負載和啟動時間信息
m 切換顯示內存信息
M 根據內存使用大小排序
t 切換顯示進程和CPU狀態信息
c 切換顯示命令名稱和完整命令行
P 根據CPU使用率進行排序 (默認排序)
T 根據時間/累計時間進行排序
w 將當前設置寫入~/.toprc文件中
1 展開多核cpu顯示
top使用方法
使用格式:
top [-] [d] [p] [q] [c] [C] [S] [s] [n]
參數說明:
d:指定每兩次屏幕信息刷新之間的時間間隔。當然用戶可以使用s交互命令來改變之。
p:通過指定監控進程ID來僅僅監控某個進程的狀態。
q:該選項將使top沒有任何延遲的進行刷新。如果調用程序有超級用戶權限,那么top將以盡可能高的優先級運行。
S:指定累計模式。
s:使top命令在安全模式中運行。這將去除交互命令所帶來的潛在危險。
i:使top不顯示任何閑置或者僵死進程。
c:顯示整個命令行而不只是顯示命令名。
生產 CPU 高負載問題排查
1.top -c 將系統資源使用情況實時顯示出來(-c 參數可以完整顯示命令)
2. 輸入大寫 P 將應用按照 CPU 使用率排序
3. top -Hp pid 然后輸入 P 可以按照 CPU 使用率將線程排序
4. 將線程的 ID 轉換為 16 進制(printf "%x\n" PID), 通過 jstack pid >pid.log 生成日志文件,利用剛才的 16 進制進程 ID 去這個線程快照中搜索即可知道消耗 CPU 的線程在干啥了.