top指令是Linux下使用相當頻繁的一個指令,可是有一天突然發現,原來自己對他還是知之甚少(尤其是記憶體狀态這塊兒),是以照着man文檔和參閱了一些資料,整理如下
執行方式
top -hv | -bcHisSM -d delay -n iterations -p pid [,pid...]
其中:h 輸出幫助資訊;v輸出版本資訊,這些指令行選項多數可以通過互動式指令改變top輸出,進入top以後按‘h’可現實互動式的指令清單,如下圖
<a href="http://s3.51cto.com/wyfs02/M02/58/85/wKiom1SzZ57DAZ8zAAIMI5bMfpk497.jpg" target="_blank"></a>
-b: ‘批量模式’,用來将輸出重定向到指定檔案,一般配合-n 指定輸出幾次統計資訊,使用模式
top -n 3 -b > /tmp/top.tmp
-c: 顯示産生程序的完成指令
-H: 線程切換模式,所有獨立的線程都會被顯示在結果中(以線程為粒度),不加此參數的話,top會以程序為粒度來顯示資訊
-i: 不顯示idled或zombied程序
-s: 安全模式
-S: 累計模式,顯示該程序以及他的所有子程序(包括已死的)總共占用的cpu時間
-M: 記憶體統計相關--顯示記憶體機關(k/M/G)并且顯示浮點值(帶小數點)的值,如下圖
-d: 指定重新整理時間,預設重新整理時間是3s
-n: 執行狀态重新整理的次數
-p: 指定pid 多個pid以‘逗号’分開,隻顯示指定pid程序的狀态
字段解釋:
PID、PPID(父pid)、USER、GROUP、TTY這些字段都是字面意思,就不多說了。着重說一下cpu和記憶體相關字段的意思
top預設輸出如下
<a href="http://s3.51cto.com/wyfs02/M01/58/7D/wKioL1SzOByiLxo3AACYGexJq40473.jpg" target="_blank"></a>
我們選擇顯示更多的cpu和記憶體相關的項目,
<a href="http://s3.51cto.com/wyfs02/M00/58/81/wKiom1SzOWPhFxpGAAHM_CfpwKU646.jpg" target="_blank"></a>
增加顯示項目之後,top輸出如下
<a href="http://s3.51cto.com/wyfs02/M02/58/7D/wKioL1SzOzvy_XQMAADpPyFGq5U994.jpg" target="_blank"></a>
我們以上圖輸出介紹個字段cpu和記憶體相關字段含義:
VIRT -- (kb)任務使用的虛拟記憶體總量,包含所有交換到記憶體的code、data和shared libraries plus pages. VIRT = SWAP + RES.隻要程序申請了記憶體,都會計入此值。;例如程序想核心申請了100M記憶體,此值增加100M,而不管核心實際配置設定給了多少
RES -- (kb)常駐記憶體數量,即此任務使用的非交換分區的記憶體(即實體記憶體)
SHR -- (kb)任務所使用的共享記憶體的數量,他隻簡單的反映了可能與其他程序共享的記憶體
SHR是RES中”映射至檔案”的實體記憶體總和。包括:
程式的代碼段。
動态庫的代碼段。
通過mmap做的檔案映射。
通過mmap做的匿名映射,但指明了MAP_SHARED屬性。
注:RES要和SHR結合者看,核心把實體記憶體分為了兩部分,一部分是映射至檔案的,一部分是沒有映射至檔案的即匿名記憶體,完全和共不共享沒有關系!
但file_rss為什麼叫做shared呢?應該是一種訓示性表述,表示這部分記憶體可能是共享的。但并不代表真正共享了。那麼到底哪些計入file_rss?通過查閱相關代碼,發現(可能有遺漏):
1、程式的代碼段。
2、動态庫的代碼段。
3、通過mmap做的檔案映射。
4、通過mmap做的匿名映射,但指明了MAP_SHARED屬性。
5、通過shmget申請的共享記憶體
注:如何精确的計算程序占用的記憶體
我們注意到在描述程序資訊的proc/<pid>内,有一個smaps檔案,裡面展示了所有記憶體段的資訊,其中有Shared_Clean Shared_Dirty Private_Clean Private_Dirty:幾個字段。
統計smaps檔案内所有段的Shared_*值的總和就是程序準确的共享記憶體數量!
統計smaps檔案内所有段的Private_*值的總和就是程序準确的獨占記憶體數量!
S -- 程序狀态
%CPU -- 自上次重新整理以來該程序占用的總cpu時間的百分比.在一個true SMP environment(真正的對稱多處理器環境)下,如果’Irix mode’關閉(預設為打開狀态),top将運作在’Solaris mode’,此模式下一個任務的cpu使用率将會被除以CPU數量之後顯示。通過 I 指令可以互動式關閉/打開此模式
%MEM -- 任務使用實體記憶體的百分比
TIME+ -- (ms)和time類似,以毫秒為機關顯示
P -- 上一次用到的cpu,在‘多cpu環境下’顯示該程序上一次使用的cpu節點
SWAP -- (kb)任務的總虛拟記憶體鏡像被換到交換分區的部分。看到一篇部落格說:這裡應該是改程序使用過的swap的量
另:top彙總部分swap資訊裡面cached的部分表示的是曾經換入swap後又被換出,但是swap裡的内容還未被覆寫的部分
Swap: 32767992k total, 986504k used, 31781488k free, 2740516k cached
TIME -- (s)任務自啟動以來占用的CPU總時間。如果’Cumulative mode’(累計模式,預設關閉)打開,将顯示此簡稱以及此程序的子程序(包括已死的)總共占有的cpu時間。累計模式可以通過指令行和互動式兩種模式打開
CODE -- (kb)用來‘執行程式代碼’的實體記憶體/存放程序代碼的實體記憶體
DATA -- (kb)Data+Stack size。程序占用實體記憶體中的非程式碼部份的大小
COMMAND -- 啟動程序的指令
本文轉自kai404 51CTO部落格,原文連結:http://blog.51cto.com/kaifly/1602457,如需轉載請自行聯系原作者