meminfo vmstat procrank top等詳解

whatnamecaniuse發表於2014-10-29


http://blog.csdn.net/arnoldlu/article/details/8443794


meminfo

命令:cat /proc/meminfo

例項:

MemTotal:         234312 kB

MemFree:            3448 kB

Buffers:              92 kB

Cached:            18052 kB

SwapCached:        25556 kB

Active:            50564 kB

Inactive:          50236 kB

Active(anon):      41924 kB

Inactive(anon):    41968 kB

Active(file):       8640 kB

Inactive(file):     8268 kB

Unevictable:        1164 kB

Mlocked:           17028 kB

HighTotal:             0 kB

HighFree:              0 kB

LowTotal:         234312 kB

LowFree:            3448 kB

SwapTotal:        196604 kB

SwapFree:         114384 kB

Dirty:                 0 kB

Writeback:             0 kB

AnonPages:         83900 kB

Mapped:            53944 kB

Shmem:                44 kB

Slab:              17540 kB

SReclaimable:       5828 kB

SUnreclaim:        11712 kB

KernelStack:        4184 kB

PageTables:         5304 kB

NFS_Unstable:          0 kB

Bounce:                0 kB

WritebackTmp:          0 kB

CommitLimit:      313760 kB

Committed_AS:    2792956 kB

VmallocTotal:     778240 kB

VmallocUsed:      115160 kB

VmallocChunk:     405852 kB

 

解釋:

MemTotal: 所有可用RAM大小 (即實體記憶體減去一些預留位和核心的二進位制程式碼大小)

    MemFree: LowFree與HighFree的總和

    Buffers: 用來給塊裝置做的緩衝大小(只記錄檔案系統的metadata以及 tracking in-flight pages,就是說 buffers是用來儲存,目錄裡面有什麼內容,許可權等等。)

    Cached: 用來給檔案做緩衝大小(直接用來記憶我們開啟的檔案). 它不包括SwapCached

    SwapCached: 已經被交換出來的記憶體,但仍然被存放在swapfile中。用來在需要的時候很快的被替換而不需要再次開啟I/O埠。

    Active: 最近經常被使用的記憶體,除非非常必要否則不會被移作他用.

    Inactive: 最近不經常被使用的記憶體,非常用可能被用於其他途徑.

    HighTotal:
    HighFree: 高位記憶體是指所有在860MB以上的記憶體空間,該區域主要用於使用者空間的程式或者是快取頁面。核心必須使用不同的手法使用該段記憶體,因此它比低位記憶體要慢一些。

    LowTotal:
    LowFree: 低位可以達到高位記憶體一樣的作用,而且它還能夠被核心用來記錄一些自己的資料結構。
                   Among many other things, it is where everything from the Slab is
                   allocated.  Bad things happen when you're out of lowmem.

    SwapTotal: 交換空間的總和

    SwapFree: 從RAM中被替換出暫時存在磁碟上的空間大小

    Dirty: 等待被寫回到磁碟的記憶體大小。

    Writeback: 正在被寫回到磁碟的記憶體大小。

    Mapped: 影射檔案的大小。

    Slab: 核心資料結構快取

    VmallocTotal: vmalloc記憶體大小

    VmallocUsed: 已經被使用的虛擬記憶體大小。

    VmallocChunk: largest contigious block of vmalloc area which is free

    CommitLimit: Based on the overcommit ratio('vm.overcommit_ratio'),
              this is the total amount of  memory currently available to
              be allocated on the system. This limit is only adhered to
              if strict overcommit accounting is enabled (mode 2 in
              'vm.overcommit_memory').
              The CommitLimit is calculated with the following formula:
              CommitLimit = ('vm.overcommit_ratio' * Physical RAM) + Swap
              For example, on a system with 1G of physical RAM and 7G
              of swap with a `vm.overcommit_ratio` of 30 it would
              yield a CommitLimit of 7.3G.
              For more details, see the memory overcommit documentation
              in vm/overcommit-accounting.
            
Committed_AS: The amount of memory presently allocated on
the system.
The committed memory is a sum of all of the memory which
              has been allocated by processes, even if it has not been
              "used" by them as of yet. A process which malloc()'s 1G
              of memory, but only touches 300M of it will only show up
              as using 300M of memory even if it has the address space
              allocated for the entire 1G. This 1G is memory which has
              been "committed" to by the VM and can be used at any time
              by the allocating application. With strict overcommit
              enabled on the system (mode 2 in 'vm.overcommit_memory'),
              allocations which would exceed the CommitLimit (detailed
              above) will not be permitted. This is useful if one needs
              to guarantee that processes will not fail due to lack of
              memory once that memory has been successfully allocated.

    VmallocTotal: 可以vmalloc虛擬記憶體大小

    VmallocUsed: 已經被使用的虛擬記憶體大小。

    VmallocChunk: largest contigious block of vmalloc area which is free

提示:

使用adb shell cat /proc/meminfo 命令,檢視剩餘的空間還有多少,通常的系統剩餘空間是: MemFree + cached

      如下看到的系統剩餘空間是:5616K + 158632K
        cat proc/meminfo
          MemTotal:         483724 kB
          MemFree:            5616 kB
          Buffers:            2732 kB
          Cached:           158632 kB
          SwapCached:            0 kB
          Active:           277336 kB
          Inactive:          83232 kB
         Active(anon):     197452 kB
       需要注意的是,在setting->apps->running app裡面看到的剩餘空間是上述MemFree + cached + background running app memory - SECOND_SERVER_MEM,具體的計算方法參考:RunningProcessView.java(/alps/package/apps/settings/src/com/android/setting/applications)裡面的void refreshUi(boolean dataChanged)函式
 
vmstat
[root@localhost ~]# vmstat -n 3       (每個3秒重新整理一次) 
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b   swpd   free   buff cache   si   so    bi    bo   in    cs us sy id wa
1 0    144 186164 105252 2386848    0    0    18   166   83     2 48 21 31 0 
2 0    144 189620 105252 2386848    0    0     0   177 1039 1210 34 10 56 0 
0 0    144 214324 105252 2386848    0    0     0    10 1071   670 32 5 63 0 
0 0    144 202212 105252 2386848    0    0     0   189 1035   558 20 3 77 0 
2 0    144 158772 105252 2386848    0    0     0   203 1065 2832 70 14 15 0
vmstat所帶引數請用man vmstat檢視
Procs 
r: 等待執行的程式數 b: 處在非中斷睡眠狀態的程式數 w: 被交換出去的可執行的程式數。此數由 linux 計算得出,但 linux 並不耗盡交換空間 
Memory 
swpd: 虛擬記憶體使用情況,單位:KB
free: 空閒的記憶體,單位KB
buff: 被用來做為快取的記憶體數,單位:KB
Swap 
si: 從磁碟交換到記憶體的交換頁數量,單位:KB/秒
so: 從記憶體交換到磁碟的交換頁數量,單位:KB/秒
IO 
bi: 傳送到塊裝置的塊數,單位:塊/秒
bo: 從塊裝置接收到的塊數,單位:塊/秒
System 
in: 每秒的中斷數,包括時鐘中斷
cs: 每秒的環境(上下文)切換次數
CPU 
按 CPU 的總使用百分比來顯示 
us: CPU 使用時間
sy: CPU 系統使用時間
id: 閒置時間
準測
r,b≈0,
如果fre,將會出現連續不斷的頁面排程,將導致系統效能問題。
對於page列,re,pi,po,cy維持於比較穩定的狀態,PI率不超過5,如果有pagin發生,那麼關聯頁面必須先進行pageout
在記憶體相對緊張的環境下pagein會強制對不同的頁面進行steal操作。如果系統正在讀一個大批的永久頁面,你也許可以看到po和pi列
會出現不一致的增長,這種情景並不一定表明系統負載過重,但是有必要對應用程式的資料訪問模式進行見檢查。在穩定的情況下,掃描率和重置率幾乎相等,在
多個程式處理使用不同的頁面的情況下,頁面會更加不穩定和雜亂,這時掃描率可能會比重置率高出。
faults列,in,sy,cs會不斷跳躍,這裡沒有明確的限制,唯一的就是這些值最少大於100
cpu列,us,sys,id和wa也是不確定的,最理想的狀態是使cpu處於100%工作狀態,單這隻適合單使用者的情況下。
如果在多使用者環境中us+sys》80,程式就會在執行佇列中花費等待時間,響應時間和吞吐量就會下降。wa>40表明磁碟io沒有也許存在不合理的平衡,或者對磁碟操作比較頻繁,
vmstat各項:
procs: 
r-->在執行佇列中等待的程式數 
b-->在等待io的程式數 
w-->可以進入執行佇列但被替換的程式 
memoy 
swap-->現時可用的交換記憶體(k表示) 
free-->空閒的記憶體(k表示) 
pages 
re--》回收的頁面 
mf--》非嚴重錯誤的頁面 
pi--》進入頁面數(k表示) 
po--》出頁面數(k表示) 
fr--》空餘的頁面數(k表示) 
de--》提前讀入的頁面中的未命中數 
sr--》通過時鐘演算法掃描的頁面 
disk 顯示每秒的磁碟操作。 s表示scsi盤,0表示盤號 
fault 顯示每秒的中斷數 
in--》裝置中斷 
sy--》系統中斷 
cy--》cpu交換 
cpu 表示cpu的使用狀態 
cs--》使用者程式使用的時間 
sy--》系統程式使用的時間 
id--》cpu空閒的時間 
如果 r經常大於 4 ,且id經常少於40,表示cpu的負荷很重。 
如果pi,po 長期不等於0,表示記憶體不足。 
如果disk 經常不等於0, 且在 b中的佇列 大於3, 表示 io效能不好。
Linux在具有高穩定性、可靠性的同時,具有很好的可伸縮性和擴充套件性,能夠針對不同的應用和硬體環境調整,優化出滿足當前應用需要的最佳效能。因此企業在維護Linux系統、進行系統調優時,瞭解系統效能分析工具是至關重要的。
  在Linux下有很多系統效能分析工具,比較常見的有top、free、ps、time、timex、uptime等。下文將介紹幾個較為重要的效能分析工具vmstat、iostat和sar及其使用。 
  用vmstat監視記憶體使用情況 
  vmstat是Virtual Meomory Statistics(虛擬記憶體統計)的縮寫,可對作業系統的虛擬記憶體、程式、CPU活動進行監視。它是對系統的整體情況進行統計,不足之處是無法對某個程式進行深入分析。 
  vmstat的語法如下: 

  vmstat [-V] [-n] [delay [count]]
  其中,-V表示列印出版本資訊;-n表示在週期性迴圈輸出時,輸出的頭部資訊僅顯示一次;delay是兩次輸出之間的延遲時間;count是指按照這個時間間隔統計的次數。對於vmstat輸出各欄位的含義,可執行man vmstat檢視
procrank
 
使用adb shell procrank 命令(僅ENG版本可用),檢視有哪些app佔用記憶體過多,請以PSS欄位為參考,重點關注自己安裝的一些APK以及PSS值比較大的process
     adb shell procrank
       PID      Vss      Rss      Pss      Uss  cmdline
       476   65312K   65284K   38499K   35560K  com.android.launcher
      268   54916K   54880K   30001K   27000K  system_server
      110   32196K   28988K   18924K   12432K  /system/bin/surfaceflinger
      347   42400K   42320K   15445K   10704K  com.android.systemui

對於尚明中佔用比較異常的process,可以透過 adb shell showmap [pid](僅ENG版本可用)檢視具體使用情況。以system_server 為例,先adb shell ps system_server得到pid:
    adb shell ps system_server
         USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
        system    268   111   406736 54876 ffffffff 400e9c70 S system_server
  
    再  adb shell showmap 268檢視各個.so以及 heap,stack的使用情況,做初步的判斷(同樣以PSS欄位參考)
     adb shell showmap 268
       virtual                     shared   shared  private  private
         size      RSS      PSS    clean    dirty    clean    dirty    # object
    -------- -------- -------- -------- -------- -------- -------- ---- ------------------------------
         72       20       20        0        0       20        0    1 /data/dalvik-cache/system@app@SettingsProvider.apk@classes.dex
         352      148      103       32       16       48       52   18 /data/dalvik-cache/system@framework@android.policy.jar@classes.dex
        1348       28        8       20        0        8        0    1 /data/dalvik-cache/system@framework@apache-xml.jar@classes.dex
         956       60       13       52        0        8        0    1 /data/dalvik-cache/system@framework@bouncycastle.jar@classes.dex
         24        8        0        8        0        0        0    1 /data/dalvik-cache/system@framework@core-junit.jar@classes.dex
        3292     1056      126     1012        0       44        0    1 /data/dalvik-cache/system@framework@core.jar@classes.dex

 

top

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

top - 01:06:48 up  1:22,  1 user,  load average: 0.06, 0.60,  0.48
            Tasks:  29 total,   1 running,  28 sleeping,   0 stopped,   0  zombie
            Cpu(s):  0.3% us,  1.0% sy,  0.0% ni, 98.7% id,  0.0% wa,  0.0%  hi,  0.0% si
            Mem:    191272k total,   173656k used,    17616k free,    22052k  buffers
            Swap:   192772k total,        0k used,   192772k free,   123988k  cached
            
            PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM     TIME+  COMMAND
            1379 root      16   0  7976 2456 1980 S  0.7  1.3   0:11.03  sshd
            14704 root      16   0  2128  980  796 R  0.7  0.5   0:02.72 top
            1 root      16   0  1992  632  544 S  0.0  0.3   0:00.90 init
            2 root       34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
            3 root       RT   0     0    0    0 S  0.0  0.0   0:00.00  watchdog/0

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

第二、三行為程式和CPU的資訊。當有多個CPU時,這些內容可能會超過兩行。內容如下:
Tasks: 29 total 程式總數
1 running 正在執行的程式數
28 sleeping 睡眠的程式數
0 stopped 停止的程式數
0 zombie 殭屍程式數
Cpu(s): 0.3% us 使用者空間佔用CPU百分比
1.0% sy 核心空間佔用CPU百分比
0.0% ni 使用者程式空間內改變過優先順序的程式佔用CPU百分比
98.7% id 空閒CPU百分比
0.0% wa 等待輸入輸出的CPU時間百分比
0.0% hi  
0.0% si  

最後兩行為記憶體資訊。內容如下:
Mem: 191272k total 實體記憶體總量
173656k used 使用的實體記憶體總量
17616k free 空閒記憶體總量
22052k buffers 用作核心快取的記憶體量
Swap: 192772k total 交換區總量
0k used 使用的交換區總量
192772k free 空閒交換區總量
123988k cached 緩衝的交換區總量。
            記憶體中的內容被換出到交換區,而後又被換入到記憶體,但使用過的交換區尚未被覆蓋,
            該數值即為這些內容已存在於記憶體中的交換區的大小。
            相應的記憶體再次被換出時可不必再對交換區寫入。

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

預設情況下僅顯示比較重要的  PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND  列。可以通過下面的快捷鍵來更改顯示內容。
更改顯示內容通過 鍵可以選擇顯示的內容。按 f 鍵之後會顯示列的列表,按 a-z  即可顯示或隱藏對應的列,最後按Enter鍵確定。
按 o 鍵可以改變列的顯示順序。按小寫的 a-z 可以將相應的列向右移動,而大寫的 A-Z  可以將相應的列向左移動。最後按Enter鍵確定。
按大寫的 F 或 O 鍵,然後按 a-z 可以將程式按照相應的列進行排序。而大寫的  R 鍵可以將當前的排序倒轉。