【轉】linux-命令top詳解

yoylee_web發表於2019-01-24

在工作中遇到了記憶體洩漏的問題,通過top監控了一下,發現top一些地方還不知道什麼含義,故 整理了一下格式 轉載此博文,以便記錄。原博文地址:http://www.cnblogs.com/sunshuhai/p/6250514.html

簡介

top命令是Linux下常用的效能分析工具,能夠實時顯示系統中各個程式的資源佔用狀況,類似於Windows的工作管理員。

top顯示系統當前的程式和其他狀況,是一個動態顯示過程,即可以通過使用者按鍵來不斷重新整理當前狀態.如果在前臺執行該命令,它將獨佔前臺,直到使用者終止該程式為止. 比較準確的說,top命令提供了實時的對系統處理器的狀態監視.

它將顯示系統中CPU最“敏感”的任務列表.該命令可以按CPU使用.記憶體使用和執行時間對任務進行排序;而且該命令的很多特性都可以通過互動式命令或者在個人定製檔案中進行設定.

引數含義

先看一下一個典型的顯示資料:

top - 10:37:11 up 350 days, 22:20,  4 users,  load average: 0.00, 0.00, 0.00
Tasks: 223 total,   1 running, 221 sleeping,   0 stopped,   1 zombie
Cpu(s):  0.7%us,  0.4%sy,  0.0%ni, 98.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  32878476k total, 31019132k used,  1859344k free,   281380k buffers
Swap: 17919996k total,    61036k used, 17858960k free, 11448704k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                  
227181 work      20   0 6852m 497m 7684 S  2.0  1.5 371:33.85 java                                                                                      
558088 work      20   0 13.7g 885m 6500 S  2.0  2.8   1420:46 java                                                                                      
296894 work      20   0 7760m 2.2g 7084 S  1.0  6.9 433:30.07 java                                                                                      
713142 work      20   0 10.1g 1.4g 7896 S  1.0  4.3 757:02.65 java                                                                                      
714160 work      20   0 13.4g 1.1g 6888 S  1.0  3.4 140:21.91 java                                                                                      
731259 root      20   0 5202m 250m  11m S  1.0  0.8 110:06.56 java                                                                                      
1044002 work      20   0 13.6g 318m 7632 S  1.0  1.0 209:48.36 java                                                                                      
     1 root      20   0 19356  520  312 S  0.0  0.0   6:11.10 init                                                                                      
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd 

統計資訊區前五行是系統整體的統計資訊。

  • 第一行是任務佇列資訊,同 uptime 命令的執行結果。其內容如下:01:06:48 當前時間up 1:22 系統執行時間,格式為時:分1 user 當前登入使用者數load average: 0.06, 0.60, 0.48 系統負載,即任務佇列的平均長度。三個數值分別為 1分鐘、5分鐘、15分鐘前到現在的平均值。

  • 第二、三行為程式和CPU的資訊。當有多個CPU時,這些內容可能會超過兩行。內容如下:

    • Tasks:
      • total : 程式總數
      • running: 正在執行的程式數
      • sleeping :睡眠的程式數
      • stopped: 停止的程式數
      • zombie: 殭屍程式數
    • Cpu(s):
      • us :使用者空間佔用CPU百分比
      • sy :核心空間佔用CPU百分比
      • ni: 使用者程式空間內改變過優先順序的程式佔用CPU百分比
      • id: 空閒CPU百分比
      • wa: 等待輸入輸出的CPU時間百分比
      • hi:硬體CPU中斷佔用百分比
      • si:軟中斷佔用百分比
      • st:虛擬機器佔用百分比
  • 最後兩行為記憶體資訊。內容如下:

    • Mem:

      • total :實體記憶體總量
      • used:使用的實體記憶體總量
      • free:空閒記憶體總量
      • buffers:用作核心快取的記憶體量
    • Swap:

      • total :交換區總量
      • used:使用的交換區總量
      • free :空閒交換區總量
      • cached :緩衝的交換區總量,記憶體中的內容被換出到交換區,而後又被換入到記憶體,但使用過的交換區尚未被覆蓋,該數值即為這些內容已存在於記憶體中的交換區的大小,相應的記憶體再次被換出時可不必再對交換區寫入。

怎麼看記憶體有多少空閒呢?
totalfree = free1859344k+ buffers281380k+ cached11448704k

程式資訊區統計資訊區域的下方顯示了各個程式的詳細資訊。首先來認識一下各列的含義。

列名 含義
PID 程式id
PPID 父程式id
RUSER Real user name
UID 程式所有者的使用者id
USER 程式所有者的使用者名稱
GROUP 程式所有者的組名
TTY 啟動程式的終端名。不是從終端啟動的程式則顯示為 ?
PR 優先順序
NI nice值。負值表示高優先順序,正值表示低優先順序
P 最後使用的CPU,僅在多CPU環境下有意義
%CPU 上次更新到現在的CPU時間佔用百分
TIME 程式使用的CPU時間總計,單位秒
TIME+ 程式使用的CPU時間總計,單位1/100秒
%MEM 程式使用的實體記憶體百分比
VIRT 程式使用的虛擬記憶體總量,單位
SWAP 程式使用的虛擬記憶體中,被換出的大小,單位kb。
RES 程式使用的、未被換出的實體記憶體大小,單位kb。
CODE 可執行程式碼佔用的實體記憶體大小,單位kb
DATA 可執行程式碼以外的部分(資料段+棧)佔用的實體記憶體大小,單位kb
SHR 共享記憶體大小,單位kb
nFLT 頁面錯誤次數
nDRT 最後一次寫入到現在,被修改過的頁面數。
S 程式狀態(D=不可中斷的睡眠狀態,R=執行,S=睡眠,T=跟蹤/停止,Z=殭屍程式)
COMMAND 命令名/命令列
WCHAN 若該程式在睡眠,則顯示睡眠中的系統函式名
Flags 任務標誌,參考 sched.h

預設情況下僅顯示比較重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。

可以通過下面的快捷鍵來更改顯示內容。 更改顯示內容通過 f 鍵可以選擇顯示的內容。按 f 鍵之後會顯示列的列表,按 a-z 即可顯示或隱藏對應的列,最後按Enter鍵確定。

按 o 鍵可以改變列的顯示順序。按小寫的 a-z 可以將相應的列向右移動,而大寫的 A-Z 可以將相應的列向左移動。最後按Enter鍵確定。

按大寫的 F 或 O 鍵,然後按 a-z 可以將程式按照相應的列進行排序。而大寫的 R 鍵可以將當前的排序倒轉。

命令使用

top使用格式top [-] [d] [p] [q] [c] [C] [S] [s] [n]引數說明

  • d :指定每兩次螢幕資訊重新整理之間的時間間隔。當然使用者可以使用s互動命令來改變之。
  • p :通過指定監控程式ID來僅僅監控某個程式的狀態。
  • q :該選項將使top沒有任何延遲的進行重新整理。如果呼叫程式有超級使用者許可權,那麼top將以儘可能高的優先順序執行。
  • S :指定累計模式
  • s :使top命令在安全模式中執行。這將去除互動命令所帶來的潛在危險。
  • i :使top不顯示任何閒置或者僵死程式。
  • c :顯示整個命令列而不只是顯示命令名

其他實用命令

下面介紹在top命令執行過程中可以使用的一些互動命令
從使用角度來看,熟練的掌握這些命令比掌握選項還重要一些。這些命令都是單字母的,如果在命令列選項中使用了s選項,則可能其中一些命令會被遮蔽掉。

  • Ctrl+L :擦除並且重寫螢幕。
  • h或者?: 顯示幫助畫面,給出一些簡短的命令總結說明。
  • k: 終止一個程式。系統將提示使用者輸入需要終止的程式PID,以及需要傳送給該程式什麼樣的訊號。一般的終止程式可以使用15訊號;如果不能正常結束那就使用訊號9強制結束該程式。預設值是訊號15。在安全模式中此命令被遮蔽。
  • i :忽略閒置和僵死程式。這是一個開關式命令。
  • q :退出程式。
  • r :重新安排一個程式的優先順序別。系統提示使用者輸入需要改變的程式PID以及需要設定的程式優先順序值。輸入一個正值將使優先順序降低,反之則可以使該程式擁有更高的優先權。預設值是10。
  • S :切換到累計模式。
  • s :改變兩次重新整理之間的延遲時間。系統將提示使用者輸入新的時間,單位為s。如果有小數,就換算成m s。輸入0值則系統將不斷重新整理,預設值是5 s。需要注意的是如果設定太小的時間,很可能會引起不斷重新整理,從而根本來不及看清顯示的情況,而且系統負載也會大大增加。
  • f或者F :從當前顯示中新增或者刪除專案。
  • o或者O :改變顯示專案的順序。
  • l :切換顯示平均負載和啟動時間資訊。
  • m :切換顯示記憶體資訊。
  • t :切換顯示程式和CPU狀態資訊。
  • c :切換顯示命令名稱和完整命令列。
  • M :根據駐留記憶體大小進行排序。
  • P :根據CPU使用百分比大小進行排序。
  • T :根據時間/累計時間進行排序。
  • W :將當前設定寫入~/.toprc檔案中。這是寫top配置檔案的推薦方法。

常用操作

  • top //每隔5秒顯式所有程式的資源佔用情況
  • top -d 2 //每隔2秒顯式所有程式的資源佔用情況
  • top -c //每隔5秒顯式程式的資源佔用情況,並顯示程式的命令列引數(預設只有程式名)
  • top -p 12345 -p 6789 //每隔5秒顯示pid是12345和pid是6789的兩個程式的資源佔用情況
  • top -d 2 -c -p 123456 //每隔2秒顯示pid是12345的程式的資源使用情況,並顯式該程式啟動的命令列引數

其他

top中load average詳解

load average 定義linux系統中的Load對當前CPU工作量的度量。簡單的說是程式佇列的長度。

Load Average 就是一段時間 (1 分鐘、5分鐘、15分鐘) 內平均 Load 。通過系統命令"w"檢視當前load average情況
在這裡插入圖片描述
上邊0.31,0.30,0.31表示:

  • 第一位0.31:表示最近1分鐘平均負載
  • 第二位0.30:表示最近5分鐘平均負載
  • 第三位0.31:表示最近15分鐘平均負載

注:linux系統是5秒鐘進行一次Load取樣

load average值的含義

1) 單核處理器假設我們的系統是單CPU單核心的,把它比喻成是一條單向馬路,把CPU任務比作汽車。當車不多的時候,load <1;當車佔滿整個馬路的時候 load=1;當馬路都站滿了,而且馬路外還堆滿了汽車的時候,load>1
2) 多核處理器我們經常會發現伺服器Load > 1但是執行仍然不錯,那是因為伺服器是多核處理器(Multi-core)。

假設我們伺服器CPU是2核,那麼將意味我們擁有2條馬路,我們的Load = 2時,所有馬路都跑滿車輛。

注:檢視cpu 核數命令: grep 'model name' /proc/cpuinfo | wc -l 

什麼樣的Load average值要提高警惕
(單核情況下,如果多核可以乘其倍數)

  • load < 1: 此時是不錯的狀態,如果進來更多的汽車,你的馬路仍然可以應付。
  • load = 1: 你的馬路即將擁堵,而且沒有更多的資源額外的任務,趕緊看看發生了什麼吧。
  • load > 5: 非常嚴重擁堵,我們的馬路非常繁忙,每輛車都無法很快的執行 

三種Load值,應該看哪個

通常我們先看15分鐘load,如果load很高,再看1分鐘和5分鐘負載,檢視是否有下降趨勢。

1分鐘負載值 > 1,那麼我們不用擔心,但是如果15分鐘負載都超過1,我們要趕緊看看發生了什麼事情。

所以我們要根據實際情況檢視這三個值。