linux top命令

jopen 10年前發布 | 24K 次閱讀 Linux

top命令經常用來監控linux的系統狀況,比如cpu、內存的使用等。

top命令執行結果如下圖所示:

linux 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來查看進行對應的線程,如下圖:

linux top命令

 

當系統的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關鍵字,可以清晰看到該線程在執行的一些代碼。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!