linux top命令
top命令經常用來監控linux的系統狀況,比如cpu、內存的使用等。
top命令執行結果如下圖所示:
top前五行統計信息
第一行:
15:48:01 | 表示當前系統時間。 |
up 391 days, 22:56 | 表示系統已經運行了391天22小時56分鐘(在這期間沒有重啟過) |
1 users | 表示當前有1個用戶登錄系統 |
load average: 0.08, 0.13, 0.16 | 這三個數分別是1分鐘內、5分鐘內、15分鐘內容系統的平均負載情況。load average數據是每隔5秒鐘檢查一次活躍的進程數,然后按特定算法計算出的數值。 |
第二行: 進程信息
95 total | 表示共有95個進程 |
1 running | 正在運行中的進程數為1個 |
94 sleeping | 睡眠的進程數為94個 |
0 stopped | 停止的進程數為0個 |
0 zombie | 僵尸進程數為0個 |
第三行:CPU信息
0.7%us | 表示用戶空間占用CPU的百分比為0.7 |
0.1%sy | 表示內核空間占用CPU的百分比為0.1 |
0.0%ni | 表示用戶進程空間內改變過優先級的進程占用CPU百分比為0 |
98.8%id | 表示空閑CPU百分比為98.8 |
0.4%wa | 表示IO等待占用CPU的百分比為0.4 |
0.0%hi | 表示IO等待占用CPU的百分比為0 |
0.0%si | 表示軟中斷(Software Interrupts)占用CPU的百分比 |
0.0%st | ? |
當us值過高時,表示運行的應用消耗大量的CPU。java應用造成us高的原因主要是線程一直處于可運行(Runnable)狀態,通常這些線程在執行無阻塞、循環、正則或純粹的計算等任務造成的;另外一個可能也會造成us高的原因是頻繁GC。
當sy值高時,表示linux花費了更多的時間在進行java線程切換。 java應用造成這種現象的主要原因是啟動的線程比較多,且這些線程多數處于不斷的阻塞(例如鎖等待,IO等待狀態)和執行狀態的變化過程中,這就導致了 操作系統要不斷地切換執行的線程,產生大量的線程上下文切換。
(上面紅色的結論來自:http://blog.csdn.net/axman/article/details/7104819)
第四行:內存信息
5242880k total | 物理內存總量 |
4656748k used | 使用中的內存總量 |
586132k free | 空閑內存總量 |
262660k buffers | 用作內核緩存的內存量 |
第五行:swap交換分區信息
2097144k total | 交換區總量 |
989520k used | 使用的交換區總量 |
1107624k free | 空閑交換區總量 |
471860k cached | 緩沖的交換區總量 |
top第七行開始為各進程狀態監控
默認情況下僅顯示比較重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。各列的含義如下:
PID | 進程PID |
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時間總計,單位1/100秒 |
COMMAND | 進程名稱(命令名/命令行) |
可以用快捷鍵更改顯示內容:
(1)更改顯示內容:通過 f鍵可以選擇顯示的內容。
按 f 鍵之后會顯示列的列表,按 a-z 即可顯示或隱藏對應的列,最后按回車鍵確定。
(2)按o鍵可以改變列的顯示順序。
按小寫的 a-z 可以將相應的列向右移動,而大寫的 A-Z 可以將相應的列向左移動。最后按回車鍵確定。
按大寫的 F 或 O 鍵,然后按 a-z 可以將進程按照相應的列進行排序。而大寫的 R 鍵可以將當前的排序倒轉。
(3) shift + m 根據內存占用從大到小排列;shift + p 根據cpu占用從大到小排列
設置完按回車返回界面。
上面展示的是進程的情況,還可以通過命令:top -p PID -H來查看進行對應的線程,如下圖:
當系統的load比較高時,可以通過如下步驟排查:
1、使用命令:top,找出哪個進程的cpu使用率比較高,記錄對應的進程PID1;
2、使用命令:top -p PID1 -H,查看該進程下的所有線程,找出哪些線程的cpu使用率比較高,記錄對應的線程PID2
3、新開終端,使用命令:jstack PID2 > jstack.lg 將這一時刻的線程棧,保存到文件jstack.log。注意:輸出線程棧和保存top命令快照盡量同時進行,因為線程隨時在變化,對應的PID2可能很快變為無效。
4、由于jstack.log文件記錄的線程ID是16進制,需要將top命令展示的線程號轉換為16進制,以15100為例,在linux下輸入命令:printf 0x%x 15100,得到15100的十六進制為0x3afc
5、在jstack.log中搜索0x3afc關鍵字,可以清晰看到該線程在執行的一些代碼。