天天看點

AIX的SVMON指令詳解(原創)

svmon概述 

svmon 指令用于顯示目前記憶體狀态的資訊,可通過

# lslpp bos.perf.tools 

檢視是否有安裝。因為 svmon 指令在啟用中斷的使用者級别運作,是以顯示的資訊不組成真正的記憶體快照。 在非常繁忙的系統中,svmon收集的資料和真實的資料有所差距,在svmon程序搜集的過程中,vmm(虛存管理器)可能已經發生改動了。

因為svmon使用的全是vmm中的資料,而vmm對記憶體的視圖是基于記憶體段的,是以,了解svmon的輸出,必須先了解段的概念。

段 

段(segment)是一組頁的合集, 用來報告記憶體消耗的基本對象。是以 svmon 所報告的統計資訊是以頁面表示的。 每個段為256m,而每頁為4kb位元組的虛存,每幀為4kb位元組的實存,每個段可同時被多個程序使用,每個段屬于以下五種類型其中的一種:

persistent:存放jfs檔案或目錄

working:程序資料區域和共享記憶體段

client:用于實作虛拟檔案系統如nfs,cd-rom檔案系統和jfs2

mapping:用于實作檔案和記憶體之間的映射關系

real memory mapping:用于對i/o空間的通路 

svmon參數詳解

-a supclassname

将範圍限于 supclassname 類參數的子類(在層報告 -t 中)。參數是超類名。不支援類清單。

注:

因為該标志會影響性能,是以請謹慎使用。

表示統計資訊中隻包含客戶段。預設情況下會分析所有段。

顯示運作指令名 commandnm1 ...commandnmn 的程序的記憶體使用統計資訊。commandnm 是字元串。它是可執行檔案精确的基本名。

對于給定實體,顯示屬于該實體(使用者名或指令名)的程序的記憶體統計資訊。

顯示段 sid1 ...sidn 的記憶體使用統計資訊和每個段所有幀的詳細狀态。指定的段辨別符必須關于主段。

顯示 class 參數的子類的記憶體使用統計資訊(該參數在工作負載類報告-w 和層報告 -t 中)。-w 或 -a 類參數需要是超類名稱。

表示統計資訊中隻包含持久段(檔案)。預設情況下會分析所有段。

顯示幀 frame1...framen 狀态,包含其所屬的段。如果沒有供應幀清單,那麼會顯示所用記憶體的百分比。

表示要顯示的資訊按照在調頁空間上保留或使用的頁面總數的降序排列。這個标志結合段報告改變了排序清單末尾的非工作段。

顯示全局報告。

因為需要花費幾秒來收集某些選項的統計資訊,是以觀察到的時間間隔可能比指定的時間間隔大。

因為該标志會對性能産生潛在的影響(特别是svmon -s ),是以請謹慎使用。

每個顯示的段都會顯示使用段的程序辨別符清單,并且根據報告類型顯示程序所屬的實體名(登入、指令、層或類)。對于特别的段,會顯示标号而不是程序辨別符清單。系統段顯示标志為 system 的段的标号。未使用段此标号将顯示所有的現有程序都未使用的段。例如,與檔案相關的持久段不再使用。共享庫文本顯示包含共享庫文本的段的标号,可能大部分程序都使用該共享庫文本(例如,libc.a )。這将阻止顯示程序的長清單。

段映射源段時,顯示關于源段的資訊并映射段。預設值是隻顯示關于映射段的資訊。

表示統計資訊中隻包含非系統段。預設情況下會分析所有段。

表示将要顯示的資訊按照帶固定記憶體的頁面總數降序排列。

顯示程序 pid1 ...pidn 的記憶體使用統計資訊。pid 是一個十進制的值。如果沒有供應程序辨別符(pid)清單,那麼就會顯示所有活動程序的記憶體使用統計資訊。

根據它們是否處理大頁面而過濾結果。另外,它顯示大頁面路徑成本。

顯示已配置設定的段頁面内的範圍。因為頁面可從兩端開始然後向中間移動而得到配置設定,是以工作段可能具有兩個範圍。

表示統計資訊中隻包含系統段。預設情況下會分析所有段。

顯示段 sid1 ...sidn 的記憶體使用統計資訊。sid 是一個十六進制的值。指定的段辨別符必須關于主段。如果沒有供應段辨別符(sid)清單,那麼就會顯示所有定義的段的記憶體使用統計資訊。

顯示要列印的最高 count 對象的記憶體使用統計資訊

顯示所有層号 tier1...tiern 的類的記憶體使用統計資訊。如果沒有供應層清單,那麼就會顯示所有定義的層的記憶體使用統計資訊。

表示要顯示的資訊按照實記憶體的頁面總數降序排列。如果無下列标志出現,這就是預設的排序标準:-p 、-g 和 -v 。

顯示登入名 logname1 ...lognamen 的記憶體使用統計資訊。logname是一個字元串,它是精确的登入名。如果沒有提供登入辨別符清單,那麼就會顯示所有定義的登入辨別符的記憶體使用統計資訊。

表示要顯示的資訊按照虛拟空間的頁面總數降序排列。這個标志結合段報告改變了排序清單末尾的非工作段。

表示統計資訊中隻包含工作段。預設情況下會分析所有段。

顯示工作負載管理類 clnm1 ...clnmn 的記憶體使用統計資訊。clnm 是一個字元串。它是一個類的精确名稱。對一個子類來說,名稱應該具有superclassname.subclassname 的格式。如果沒有提供類名清單,那麼就會顯示所有定義的類名的記憶體使用統計資訊。

顯示層報告 -t 中對某個層的每個類的段的記憶體使用統計資訊。

顯示在執行 svmon 過程中動态配置設定的最大記憶體大小。

具體使用範例 

1、全局統計資訊

#svmon -g

                  size                  inuse          free             pin            virtual       mmode

memory      3932160     2729499     1202661      818627     1616925      ded

pg space    8388608        8595

               work           pers        clnt       other

pin          675474          0        2801     140352

in use      1616925        0     1112574

pagesize    poolsize       inuse        pgsp         pin            virtual

s    4 kb          -       1966891        8595      209571      854317

m   64 kb         -        47663           0            38066       47663 

其中

inuse-------已使用的

free---------空閑的

pin-----“釘”在記憶體中的記憶體段(筆者認為這不是固定記憶體段)

virtual-----虛拟記憶體段

work------工作記憶體段

pers-------固定記憶體段

other------- mapping和real mapping memory

pagesize-----不同記憶體頁大小的統計情況,s為正常頁面,大小為4k,m為大頁面大小為64k。

pgsp------ 分頁空間的使用情況

注意,在段的描述中,如果paging space使用的節中如果有一橫(-),表明該段未使用交換區,work段可能使用交換區,但persistent段和client段不會使用交換區。

2、列印 1/2 小時中每分鐘的全局統計資訊,請輸入:

#svmon -g -i 60 30

3、要列印出隻考慮工作段的使用者 root 和 steve 的記憶體使用統計資訊,請輸入:

#svmon -u root oracle -w

===============================================================================

user                                 inuse      pin     pgsp  virtual

oracle                              558293    16880        0   558293

     pagesize                inuse        pin       pgsp    virtual

     s    4 kb              515157         80          0     515157

     m   64 kb                2696       1050          0       2696

........................................................................................

system segments             inuse      pin       pgsp    virtual

                                     13129     8552        0      13129

     s    4 kb                 3785       72          0       3785

     m   64 kb                584        530        0        584

    vsid      esid  type  description                 psize  inuse   pin    pgsp   virtual

   20002      0    work  kernel segment              m     584    530     0       584

以上省略一部分輸出。。。。

使用者運作的程序所使用的段分成三個類别:

系統:所有程序共享的段

互斥:屬于oracle 的程序集所使用的段

共享:幾個使用者共享的段。

vsid:表示虛拟段辨別符。表示在虛拟記憶體管理器中的唯一段。

esid: 表示有效的段辨別符。esid隻有在段屬于程序的位址空間時才有效。提供時,它表示程序如何使用段。如果 vsid 段被幾個程序映射,但具有不同的 esid 值, 那麼該字段包含“-”。如果是那樣的話,那麼通過應用于使用該段的每個程序辨別符的 -p 标志,可以獲得精确的 esid 值。因為用于管理打開的檔案或多線程結構的段不是程序的使用者位址空間的一部分,是以也對這些段顯示“-”。

3、 可将使用實存最多的三個程序标出

# svmon -up -t 3|grep -p pid|grep '^.*[0-9] '

5428 x 4681 1584 2656 9156 n n

16274 bin 4594 1588 2273 8824 n y

6458 dtgreet 4660 1580 2144 8712 n n 

輸出的格式順序為 pid command inuse pin pgsp virtual 64-bit mthrd

可以計算出x程式所使用的實存為4681×4096=18763776,約為18mb

4、 可将使用交換區最多的三個程序标出

# svmon -gp -t 3|grep -p pid|grep '^.*[0-9] ' 

第一個程式x所使用的交換區大小約為 2566×4096 =10510336 位元組,大約為10mb空間

5、 每隔三秒顯示使用最多的段 

# svmon -s -t 3 -i 3 

vsid esid type description inuse pin pgsp virtual

4f08 -    clnt 37505 0 - -

11e1 -    clnt 33623 0 - -

8811 -    work kernel pinned heap 12637 6547 8091 19397 

可見,vsid為4f08的段使用最多

6、 看pid為22674的程序所使用的為固定記憶體 

#svmon -pp 22674  

7、要列印出段 700e 8811 和 bed7 的記憶體使用統計資訊,請輸入:

#svmon -s 700e 8811 bed7 1cf8e 

8、列印出指令 login ,ksh的記憶體使用統計資訊, 包括位址範圍,請輸入:

#svmon -c login ksh -r 

9、要列印出隻考慮非系統工作段的所有程序的記憶體使用統計資訊,并且根據虛拟頁面數對該程序排序,請輸入:

#svmon -p -n -w -v

10、根據實記憶體的頁數将系統段排序,并且列印出結果清單中最高的 10 個系統段,請輸入:

#svmon -s -s -u -t 10 

11、隻列印大頁面段,請輸入:

#svmon -s -q

常見問題分析 

svmon -s中inuse的求和結果比svmon -g中的inuse小 

下面的腳本可以用來統計svmon -s中的inuse的相加結果:

==============================================

#!/usr/bin/ksh

svmon -s | cut -c54-62 | awk '/^[-slm]/ {if ($1 ~ /l/)

{count1 =($2*4096+count1)}

else if ($1 ~ /m/)

{count2 =($2*16+count2)}

else {count3 =$2+count3}}

end {printf "the result is as following with 4k as unit size\n16m page count=%d\n64k page count=%d\n4k page count=%d\ntatal page count=%d\n", count1,count2,count3,'count1+count2+count3'}'

========================================================

那麼,産生這種差别的原因是什麼呢?解釋如下:

svmon -s用來顯示系統中所有記憶體段(segment)的記憶體使用資訊。aix上僅存在三種記憶體段,它們是work,client和persistent。是以,統計svmon -s中inuse的和就是将被使用的上述三種記憶體段進行求和。但是,這種統計并沒有将系統上所有的被使用的記憶體頁面統計進來。系統裡存在着一些尚未被vmm管理的記憶體頁面(mapping和real mapping memory),這些頁面已經被使用,但是不屬于上述三種記憶體段,是以在svmon -s中展現不出來。而svmon -g則包含了這些未被管理的頁面。

這些未被vmm管理的記憶體主要是被硬體使用,用來對實體記憶體做一些設定。在aix 5l中,可以通過在kdb執行vmstat來檢視未被管理的記憶體,輸出如下:

vmm memory limits:

total available memory (4k frames) : 00100000 4.0gb

total unmanaged mem (wlm_hw_pages): 0000d639 214.3mb

4k number of frames : 000f29c7 3.8gb

4k frames pinned : 00009fee 160.0mb

4k system pinnable frames remaining: 000b817e 2.9gb

4k user pinnable frames remaining : 000bc0bc 3.0gb

free paging space (in 4k blocks) : 0001fd00 509.0mb

paging space sigdanger level : 00001000 16.0mb

paging space sigkill level : 00000400 4.0mb

其中“unmanaged mem”就代表這類未被vmm管理的記憶體頁面

參考至:http://www.eygle.com/digest/2009/07/ibm_aix_svmon.html

http://www.kuqin.com/aixcmds/aixcmds5/svmon.htm#c013820260joy

http://www-900.ibm.com/cn/support/viewdoc/detail?docid=2811998d15000

作者:czmmiao 原文位址:http://czmmiao.iteye.com/blog/1153499