svmon概述
svmon 命令用于顯示當(dāng)前內(nèi)存狀態(tài)的信息,可通過(guò)
# lslpp bos.perf.tools
查看是否有安裝。因?yàn)?svmon 命令在啟用中斷的用戶(hù)級(jí)別運(yùn)行,所以顯示的信息不組成真正的內(nèi)存快照。 在非常繁忙的系統(tǒng)中,svmon收集的數(shù)據(jù)和真實(shí)的數(shù)據(jù)有所差距,在svmon進(jìn)程搜集的過(guò)程中,VMM(虛存管理器)可能已經(jīng)發(fā)生改動(dòng)了。
因?yàn)閟vmon使用的全是VMM中的數(shù)據(jù),而VMM對(duì)內(nèi)存的視圖是基于內(nèi)存段的,所以,理解svmon的輸出,必須先理解段的概念。
段
段(segment)是一組頁(yè)的合集, 用來(lái)報(bào)告內(nèi)存消耗的基本對(duì)象。因此 svmon 所報(bào)告的統(tǒng)計(jì)信息是以頁(yè)面表示的。 每個(gè)段為256M,而每頁(yè)為4KB字節(jié)的虛存,每幀為4KB字節(jié)的實(shí)存,每個(gè)段可同時(shí)被多個(gè)進(jìn)程使用,每個(gè)段屬于以下五種類(lèi)型其中的一種:
persistent:存放JFS文件或目錄
working:進(jìn)程數(shù)據(jù)區(qū)域和共享內(nèi)存段
client:用于實(shí)現(xiàn)虛擬文件系統(tǒng)如NFS,CD-ROM文件系統(tǒng)和JFS2
mapping:用于實(shí)現(xiàn)文件和內(nèi)存之間的映射關(guān)系
real memory mapping:用于對(duì)I/O空間的訪問(wèn)
svmon參數(shù)詳解
| -a SupClassName |
將范圍限于 SupClassName 類(lèi)參數(shù)的子類(lèi)(在層報(bào)告 -T 中)。參數(shù)是超類(lèi)名。不支持類(lèi)列表。 |
| -b |
顯示所有顯示幀的引用和修改位的狀態(tài)(詳細(xì)報(bào)告 -D )。顯示時(shí),重新設(shè)置幀的引用位。使用 -i 標(biāo)志時(shí),會(huì)檢測(cè)在每個(gè)間隔間存取的幀。
注:
因?yàn)樵摌?biāo)志會(huì)影響性能,所以請(qǐng)謹(jǐn)慎使用。 |
| -c |
表示統(tǒng)計(jì)信息中只包含客戶(hù)段。缺省情況下會(huì)分析所有段。 |
| -C Command1 ...CommandN |
顯示運(yùn)行命令名 Commandnm1 ...CommandnmN 的進(jìn)程的內(nèi)存使用統(tǒng)計(jì)信息。Commandnm 是字符串。它是可執(zhí)行文件精確的基本名。 |
| -d |
對(duì)于給定實(shí)體,顯示屬于該實(shí)體(用戶(hù)名或命令名)的進(jìn)程的內(nèi)存統(tǒng)計(jì)信息。 |
| -D SID1 ...SIDN |
顯示段 SID1 ...SIDN 的內(nèi)存使用統(tǒng)計(jì)信息和每個(gè)段所有幀的詳細(xì)狀態(tài)。指定的段標(biāo)識(shí)符必須關(guān)于主段。 |
| -e |
顯示 Class 參數(shù)的子類(lèi)的內(nèi)存使用統(tǒng)計(jì)信息(該參數(shù)在工作負(fù)載類(lèi)報(bào)告 -W 和層報(bào)告 -T 中)。-W 或 -a 類(lèi)參數(shù)需要是超類(lèi)名稱(chēng)。 |
| -f |
表示統(tǒng)計(jì)信息中只包含持久段(文件)。缺省情況下會(huì)分析所有段。 |
| -F [ Frame1...FrameN ] |
顯示幀 Frame1...FrameN 狀態(tài),包含其所屬的段。如果沒(méi)有供應(yīng)幀列表,那么會(huì)顯示所用內(nèi)存的百分比。 |
| -g |
表示要顯示的信息按照在調(diào)頁(yè)空間上保留或使用的頁(yè)面總數(shù)的降序排列。這個(gè)標(biāo)志結(jié)合段報(bào)告改變了排序列表末尾的非工作段。 |
| -G |
顯示全局報(bào)告。 |
| -i Interval [ NumIntervals ] |
指示 svmon 命令重復(fù)顯示統(tǒng)計(jì)信息。每個(gè) Interval 秒就收集和打印統(tǒng)計(jì)信息。NumIntervals 是重復(fù)的次數(shù);如果未指定,那么 svmon 一直運(yùn)行到用戶(hù)使用 Ctrl-C 中斷為止。
注:
因?yàn)樾枰ㄙM(fèi)幾秒來(lái)收集某些選項(xiàng)的統(tǒng)計(jì)信息,所以觀察到的時(shí)間間隔可能比指定的時(shí)間間隔大。 |
| -j |
顯示每個(gè)持久段引用的文件路徑。
注:
因?yàn)樵摌?biāo)志會(huì)對(duì)性能產(chǎn)生潛在的影響(特別是svmon -S ),所以請(qǐng)謹(jǐn)慎使用。 |
| -l |
每個(gè)顯示的段都會(huì)顯示使用段的進(jìn)程標(biāo)識(shí)符列表,并且根據(jù)報(bào)告類(lèi)型顯示進(jìn)程所屬的實(shí)體名(登錄、命令、層或類(lèi))。對(duì)于特別的段,會(huì)顯示標(biāo)號(hào)而不是進(jìn)程標(biāo)識(shí)符列表。
系統(tǒng)段
顯示標(biāo)志為 system 的段的標(biāo)號(hào)。
未使用段
此標(biāo)號(hào)將顯示所有的現(xiàn)有進(jìn)程都未使用的段。例如,與文件相關(guān)的持久段不再使用。
共享庫(kù)文本
顯示包含共享庫(kù)文本的段的標(biāo)號(hào),可能大部分進(jìn)程都使用該共享庫(kù)文本(例如,libc.a )。這將阻止顯示進(jìn)程的長(zhǎng)列表。 |
| -m |
段映射源段時(shí),顯示關(guān)于源段的信息并映射段。缺省值是只顯示關(guān)于映射段的信息。 |
| -n |
表示統(tǒng)計(jì)信息中只包含非系統(tǒng)段。缺省情況下會(huì)分析所有段。 |
| -p |
表示將要顯示的信息按照帶固定內(nèi)存的頁(yè)面總數(shù)降序排列。 |
| -P [ PID1 ... PIDN ] |
顯示進(jìn)程 PID1 ...PIDN 的內(nèi)存使用統(tǒng)計(jì)信息。PID 是一個(gè)十進(jìn)制的值。如果沒(méi)有供應(yīng)進(jìn)程標(biāo)識(shí)符(PID)列表,那么就會(huì)顯示所有活動(dòng)進(jìn)程的內(nèi)存使用統(tǒng)計(jì)信息。 |
| -q |
根據(jù)它們是否處理大頁(yè)面而過(guò)濾結(jié)果。另外,它顯示大頁(yè)面度量值。 |
| -r |
顯示已分配的段頁(yè)面內(nèi)的范圍。因?yàn)轫?yè)面可從兩端開(kāi)始然后向中間移動(dòng)而得到分配,所以工作段可能具有兩個(gè)范圍。 |
| -s |
表示統(tǒng)計(jì)信息中只包含系統(tǒng)段。缺省情況下會(huì)分析所有段。 |
| -S [ SID1 ...SIDN ] |
顯示段 SID1 ...SIDN 的內(nèi)存使用統(tǒng)計(jì)信息。SID 是一個(gè)十六進(jìn)制的值。指定的段標(biāo)識(shí)符必須關(guān)于主段。如果沒(méi)有供應(yīng)段標(biāo)識(shí)符(SID)列表,那么就會(huì)顯示所有定義的段的內(nèi)存使用統(tǒng)計(jì)信息。 |
| -t Count |
顯示要打印的最高 Count 對(duì)象的內(nèi)存使用統(tǒng)計(jì)信息 |
| -T [ Tier1...TierN ] |
顯示所有層號(hào) Tier1...TierN 的類(lèi)的內(nèi)存使用統(tǒng)計(jì)信息。如果沒(méi)有供應(yīng)層列表,那么就會(huì)顯示所有定義的層的內(nèi)存使用統(tǒng)計(jì)信息。 |
| -u |
表示要顯示的信息按照實(shí)內(nèi)存的頁(yè)面總數(shù)降序排列。如果無(wú)下列標(biāo)志出現(xiàn),這就是缺省的排序標(biāo)準(zhǔn):-p 、-g 和 -v 。 |
| -U [ LogName1 ...LogNameN ] |
顯示登錄名 LogName1 ...LogNameN 的內(nèi)存使用統(tǒng)計(jì)信息。Logname 是一個(gè)字符串,它是精確的登錄名。如果沒(méi)有提供登錄標(biāo)識(shí)符列表,那么就會(huì)顯示所有定義的登錄標(biāo)識(shí)符的內(nèi)存使用統(tǒng)計(jì)信息。 |
| -v |
表示要顯示的信息按照虛擬空間的頁(yè)面總數(shù)降序排列。這個(gè)標(biāo)志結(jié)合段報(bào)告改變了排序列表末尾的非工作段。 |
| -w |
表示統(tǒng)計(jì)信息中只包含工作段。缺省情況下會(huì)分析所有段。 |
| -W [ Clnm1 ...ClnmN ] |
顯示工作負(fù)載管理類(lèi) Clnm1 ...ClnmN 的內(nèi)存使用統(tǒng)計(jì)信息。Clnm 是一個(gè)字符串。它是一個(gè)類(lèi)的精確名稱(chēng)。對(duì)一個(gè)子類(lèi)來(lái)說(shuō),名稱(chēng)應(yīng)該具有 superclassname.subclassname 的格式。如果沒(méi)有提供類(lèi)名列表,那么就會(huì)顯示所有定義的類(lèi)名的內(nèi)存使用統(tǒng)計(jì)信息。 |
| -x |
顯示層報(bào)告 -T 中對(duì)某個(gè)層的每個(gè)類(lèi)的段的內(nèi)存使用統(tǒng)計(jì)信息。 |
| -z |
顯示在執(zhí)行 svmon 過(guò)程中動(dòng)態(tài)分配的最大內(nèi)存大小。 |
具體使用范例
1、全局統(tǒng)計(jì)信息
#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-----“釘”在內(nèi)存中的內(nèi)存段(筆者認(rèn)為這不是固定內(nèi)存段)
virtual-----虛擬內(nèi)存段
work------工作內(nèi)存段
pers-------固定內(nèi)存段
other------- mapping和real mapping memory
PageSize-----不同內(nèi)存頁(yè)大小的統(tǒng)計(jì)情況,s為常規(guī)頁(yè)面,大小為4k,m為大頁(yè)面大小為64k。
pgsp------ 分頁(yè)空間的使用情況
注意,在段的描述中,如果paging space使用的節(jié)中如果有一橫(-),表明該段未使用交換區(qū),work段可能使用交換區(qū),但persistent段和client段不會(huì)使用交換區(qū)。
2、打印 1/2 小時(shí)中每分鐘的全局統(tǒng)計(jì)信息,請(qǐng)輸入:
#svmon -G -i 60 30
3、要打印出只考慮工作段的用戶(hù) root 和 steve 的內(nèi)存使用統(tǒng)計(jì)信息,請(qǐng)輸入:
#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
PageSize Inuse Pin Pgsp Virtual
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
以上省略一部分輸出。。。。
用戶(hù)運(yùn)行的進(jìn)程所使用的段分成三個(gè)類(lèi)別:
系統(tǒng):所有進(jìn)程共享的段
互斥:屬于oracle 的進(jìn)程集所使用的段
共享:幾個(gè)用戶(hù)共享的段。
其中
Vsid:表示虛擬段標(biāo)識(shí)符。表示在虛擬內(nèi)存管理器中的唯一段。
Esid: 表示有效的段標(biāo)識(shí)符。Esid只有在段屬于進(jìn)程的地址空間時(shí)才有效。提供時(shí),它表示進(jìn)程如何使用段。如果 vsid 段被幾個(gè)進(jìn)程映射,但具有不同的 esid 值, 那么該字段包含“-”。如果是那樣的話(huà),那么通過(guò)應(yīng)用于使用該段的每個(gè)進(jìn)程標(biāo)識(shí)符的 -P 標(biāo)志,可以獲得精確的 esid 值。因?yàn)橛糜诠芾泶蜷_(kāi)的文件或多線程結(jié)構(gòu)的段不是進(jìn)程的用戶(hù)地址空間的一部分,所以也對(duì)這些段顯示“-”。
3、 可將使用實(shí)存最多的三個(gè)進(jìn)程標(biāo)出
# 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
輸出的格式順序?yàn)?Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd
可以計(jì)算出X程序所使用的實(shí)存為4681×4096=18763776,約為18MB
4、 可將使用交換區(qū)最多的三個(gè)進(jìn)程標(biāo)出
# svmon -gP -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
第一個(gè)程序X所使用的交換區(qū)大小約為 2566×4096 =10510336 字節(jié),大約為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
可見(jiàn),Vsid為4f08的段使用最多
6、 看PID為22674的進(jìn)程所使用的為固定內(nèi)存
#svmon -pP 22674
7、要打印出段 700e 8811 和 bed7 的內(nèi)存使用統(tǒng)計(jì)信息,請(qǐng)輸入:
#svmon -S 700e 8811 bed7 1cf8e
8、打印出命令 login ,ksh的內(nèi)存使用統(tǒng)計(jì)信息, 包括地址范圍,請(qǐng)輸入:
#svmon -C login ksh -r
9、要打印出只考慮非系統(tǒng)工作段的所有進(jìn)程的內(nèi)存使用統(tǒng)計(jì)信息,并且根據(jù)虛擬頁(yè)面數(shù)對(duì)該進(jìn)程排序,請(qǐng)輸入:
#svmon -P -n -w -v
10、根據(jù)實(shí)內(nèi)存的頁(yè)數(shù)將系統(tǒng)段排序,并且打印出結(jié)果列表中最高的 10 個(gè)系統(tǒng)段,請(qǐng)輸入:
#svmon -S -s -u -t 10
11、只打印大頁(yè)面段,請(qǐng)輸入:
#svmon -S -q
常見(jiàn)問(wèn)題分析
svmon -S中inuse的求和結(jié)果比svmon -G中的inuse小
下面的腳本可以用來(lái)統(tǒng)計(jì)svmon -S中的inuse的相加結(jié)果:
==============================================
#!/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'}'
========================================================
那么,產(chǎn)生這種差別的原因是什么呢?解釋如下:
svmon -S用來(lái)顯示系統(tǒng)中所有內(nèi)存段(segment)的內(nèi)存使用信息。AIX上僅存在三種內(nèi)存段,它們是work,client和persistent。因此,統(tǒng)計(jì)svmon -S中inuse的和就是將被使用的上述三種內(nèi)存段進(jìn)行求和。但是,這種統(tǒng)計(jì)并沒(méi)有將系統(tǒng)上所有的被使用的內(nèi)存頁(yè)面統(tǒng)計(jì)進(jìn)來(lái)。系統(tǒng)里存在著一些尚未被VMM管理的內(nèi)存頁(yè)面(mapping和real mapping memory),這些頁(yè)面已經(jīng)被使用,但是不屬于上述三種內(nèi)存段,因此在svmon -S中體現(xiàn)不出來(lái)。而svmon -G則包含了這些未被管理的頁(yè)面。
這些未被VMM管理的內(nèi)存主要是被硬件使用,用來(lái)對(duì)物理內(nèi)存做一些設(shè)置。在AIX 5L中,可以通過(guò)在kdb執(zhí)行vmstat來(lái)查看未被管理的內(nèi)存,輸出如下:
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”就代表這類(lèi)未被VMM管理的內(nèi)存頁(yè)面
參考至: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