aix的記憶體使用

wmlm發表於2007-03-08
有幾種效能工具可提供記憶體使用情況報告。最讓人感興趣的報告來自 vmstat、ps 和 svmon 命令。[@more@]

使用 vmstat 命令確定記憶體使用情況
vmstat 命令總結了系統中所有程式使用的總活動虛擬記憶體,以及空閒列表上實記憶體頁幀的數量。活動的虛擬記憶體定義為虛擬記憶體中實際可以得到的工作段頁面的數量。有關更詳細的定義,請參閱『後頁面空間分配』。這個數字可能大於機器中的實際頁幀數,因為一些活動的虛擬記憶體頁可能已寫出到調頁空間中。

當確定記憶體是否短缺或者是否需要進行某種記憶體調整時,在一組時間間隔裡輸入 vmstat 命令,檢查結果報告中的 pi 和 po 列。這兩列表明瞭每秒調頁空間頁面調入的數量和每秒調頁空間頁面調出的數量。如果這些值經常為非零值,說明可能存在記憶體瓶頸。偶爾出現的非零值不用在意,因為頁面排程是虛擬記憶體的主要原理。

# vmstat 2 10
kthr memory page faults cpu
----- ----------- ------------------------ ------------ -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
1 3 113726 124 0 14 6 151 600 0 521 5533 816 23 13 7 57
0 3 113643 346 0 2 14 208 690 0 585 2201 866 16 9 2 73
0 3 113659 135 0 2 2 108 323 0 516 1563 797 25 7 2 66
0 2 113661 122 0 3 2 120 375 0 527 1622 871 13 7 2 79
0 3 113662 128 0 10 3 134 432 0 644 1434 948 22 7 4 67
1 5 113858 238 0 35 1 146 422 0 599 5103 903 40 16 0 44
0 3 113969 127 0 5 10 153 529 0 565 2006 823 19 8 3 70
0 3 113983 125 0 33 5 153 424 0 559 2165 921 25 8 4 63
0 3 113682 121 0 20 9 154 470 0 608 1569 1007 15 8 0 77
0 4 113701 124 0 3 29 228 635 0 674 1730 1086 18 9 0 73
在上述示例輸出中,請注意輸出中的較高的 I/O 等待率以及阻塞佇列中的執行緒數。其他 I/O 活動可能會造成 I/O 等待,但是在這種特殊情況下,I/O 等待最大可能是由於與頁面空間之間的頁面調進調出造成的。

要察看系統的 VMM 是否有效能問題,請檢查 memory 和 page 下的列:

記憶體
提供了實際和虛擬記憶體的資訊。

avm
活動虛擬記憶體 avm 列顯示在收集 vmstat 樣本時存在的活動虛擬記憶體頁面數。預設策略為延遲頁面空間策略。在該策略下,avm 的值可能比使用的調頁空間頁面數要高。avm 統計資訊並不包含檔案頁面。

fre
fre 列顯示出空閒記憶體頁面的平均數量。一個頁面是實記憶體中的 4 KB 的區域。系統維護記憶體頁面的緩衝區,稱為空閒列表。當 VMM 需要空間時可以很方便地訪問此空閒列表。VMM 在空閒列表上儲存的最少頁數由 vmo 命令的 minfree 引數決定。有關更多詳細資訊,請參閱『VMM 頁面替換調整』。

當一個應用程式終止時,它所有的工作頁面會立即返回給空閒列表。然而,它的永久頁面(或檔案)仍然在 RAM 中,不會新增回空閒列表中,直到由 VMM 竊取用於其他程式為止。如果刪除相應的檔案,也會釋放其永久頁面。

由於這個原因,fre 的值可能不表示程式可以方便使用所有實記憶體。如果需要頁幀,那與已終止應用程式相關的永久頁面將會最先移交給另一個程式。

如果 fre 的值遠大於 maxfree 的值,那不太可能出現系統顛簸。系統顛簸意味著系統一直在進行頁面調進調出。然而,如果系統正在經歷抖動,可以肯定 fre 值很小。

頁面
關於缺頁故障和頁面排程活動的資訊。它們是一段時間間隔的平均值並以秒為單位給出。

re
注:
這一欄當前不受支援。
pi
pi 列詳細描述了從調頁空間調入的頁數。調頁空間是駐留在磁碟上的虛擬記憶體的一部分。當記憶體過量使用時,它用作溢位。調頁空間由用於儲存從實記憶體中竊取到的工作組頁面的邏輯卷組成。當程式訪問一個竊取頁時,產生了一個缺頁故障,這一頁必須從調頁空間讀入記憶體。

因為硬體配置、軟體和應用程式的不同,沒有絕對的數字可以用以參考。這個欄位作為調頁空間活動的關鍵指示符。如果發生頁面調進,該頁面就一定有一個較早的頁面調出。在記憶體受限的環境下也有可能每一次頁面調進會迫使另一個頁面被竊取而頁面調出。

po
po 一欄顯示了調出到調頁空間的頁面數(速率)。無論什麼時候竊取工作儲存器的一頁,如果它仍未駐留在調頁空間中或已被修改,那它會被寫入調頁空間。如果不被再次訪問,它會留在頁面排程裝置中直到程式終止或放棄空間。如果包含在出故障頁面中的後續地址引用導致缺頁故障,那麼這些頁面將會由系統個別調進。當一個程式正常終止,任何分配給該程式的調頁空間將被釋放。如果系統讀入大量的永久頁面,您會發覺 po 欄裡增加了而在 pi 欄裡沒有相應增加。這並不一定會造成系統顛簸,但可以保證對於應用程式資料存取模式的調查。

fr
在一定時間間隔內根據頁面替換演算法每秒所釋放的頁數。當 VMM 頁面替換例程掃描頁面幀表(Page Frame Table,PFT)時,它使用一些條件選取要竊取的頁面以插入到可用記憶體幀的空閒列表中。該條件包含了兩種頁面,工作(計算的)和檔案(永久的)頁面。就因為頁面已經釋放,並不意味著發生了任何 I/O。例如,如果某個永久儲存(檔案)頁面尚未修改,它就不會被寫回磁碟。如果 I/O 不是必需的,則要求最小的系統資源來釋放頁面。

sr
在一定時間間隔內根據頁面替換演算法每秒所檢查的頁面數。頁面替換演算法在可以竊取足夠的頁面以滿足頁面替換執行緒的需要之前可能不得不掃描許多頁面幀。sr 值比 fr 值高得越多,頁面替換演算法查詢要竊取的合格頁面就越困難。

cy
時鐘演算法中每秒的週期數。VMM 使用一種叫時鐘演算法的技術來選擇要替換的頁面。這種技術利用了每一個頁面的訪問位來指示哪些頁最近曾被使用(訪問)過。呼叫頁面竊取程式例程時,它遍歷整個 PFT,檢查每一頁的訪問位。

cy 一欄顯示了每秒頁面替換程式碼掃描了 PFT 多少次。因為插入空閒列表可以不需要完全掃描 PFT,並且因為所有的 vmstat 欄位報告為整數,這一欄位通常為 0。

確定一個系統的適當 RAM 數量的一種方法是察看 avm 欄位的最大值,該欄位由 vmstat 命令報告。將該數字乘以 4K 得到位元組數,然後將其與系統的 RAM 位元組數比較。理想情況下,avm 應該比總 RAM 數小。如果不是,可能會出現一些虛擬記憶體頁面排程量。有多少頁面排程發生取決於兩個值之間的差值。記住,虛擬記憶體的概念是提供給我們定址大於實記憶體容量的能力(一些在 RAM 記憶體中,而另一些在調頁空間中)。但是如果虛擬記憶體遠大於實記憶體,可能造成過度的頁面排程,從而導致延時。如果 avm 小於 RAM,那麼當 RAM 中填滿檔案頁時就會引起調頁空間的頁面排程。這種情況下,調整 minperm、maxperm 和 maxclient 的值可以減少調頁空間的頁面排程量。有關更多資訊,請參閱『用 vmo 命令進行 VMM 頁面替換調整』。

vmstat -I 命令
vmstat -I 命令顯示其他資訊,例如每秒調進的檔案和每秒調出的檔案(即不是調頁空間調進或調頁空間調出的所有 VMM 調進調出。使用這個標誌不會報告 re 和 cy 欄。

vmstat -s 命令
摘要選項 -s 向標準輸出傳送摘要報告,該報告從系統初始化開始,以絕對計數表示,而不是基於某個時間間隔。推薦使用這些統計資訊的方法是在有工作負載之前執行該命令,儲存輸出,在有工作負載後再次執行此命令,並儲存輸出。下一步是確定兩組輸出間的差異。自動實現該操作的 awk 指令碼名為 vmstatit,在『確定問題是否與磁碟或記憶體有關』中提供。


# vmstat -s
3231543 total address trans. faults
63623 page ins
383540 page outs
149 paging space page ins
832 paging space page outs
0 total reclaims
807729 zero filled pages faults
4450 executable filled pages faults
429258 pages examined by clock
8 revolutions of the clock hand
175846 pages freed by the clock
18975 backtracks
0 lock misses
40 free frame waits
0 extend XPT waits
16984 pending I/O waits
186443 start I/Os
186443 iodones
141695229 cpu context switches
317690215 device interrupts
0 software interrupts
0 traps
55102397 syscalls
總結裡的頁面調進和頁面調出的數量代表虛擬記憶體從頁面空間和檔案空間調進或調出頁面的活動。調頁空間的頁面調進調出代表整個頁面空間。

用 ps 命令確定記憶體使用情況
ps 命令也可以用來監視個別程式對記憶體的使用。ps v PID 命令為個別程式提供了最全面的記憶體相關統計資訊的報告,例如:

缺頁故障
工作段已經達到的大小
記憶體中工作段和程式碼段的大小
文字段的大小
駐留集的大小
程式使用的實記憶體的百分比
下面是一個例子:

# ps v
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
36626 pts/3 A 0:00 0 316 408 32768 51 60 0.0 0.0 ps v
結果 ps 報告中最重要的列描述如下:

PGIN
缺頁故障引起的頁面調進的數目。既然所有 I/O 歸於缺頁故障,那這主要就是 I/O 量的測量。
大小
程式資料區的虛擬大小(在調頁空間),用千位元組表示(在其他標誌中用 SZ 來表示)。這個數目等於程式可用的工作段頁的數目的 4 倍。如果一些工作段頁當前被調出,這個數字將大於所使用的實記憶體量。SIZE 包含了私有段的頁面和程式的共享庫資料段。
RSS
程式實記憶體(駐留集合)的大小,用千位元組表示。這個數值等於記憶體中的工作段頁和程式碼段頁數和的 4 倍。記住程式碼段頁是為所有當前程式執行的例項所共享的。如果 26 個 ksh 程式正在執行,只有 ksh 可執行程式的任何給定頁面的一份副本可位於記憶體中,但是 ps 命令會將程式碼段的大小作為每個 ksh 程式的例項的 RSS 的一部分報告。
TSIZ
文字(共享程式)映像的大小。這是可執行檔案的文字區域的大小。可執行程式文字區的頁面是隻能在用到它們時帶入記憶體的,就是說,轉移到記憶體或從記憶體裝入。這個數字只表明了可以裝入的文字量的上限。TSIZ 的值並不反映實記憶體的使用情況。這個 TSIZ 值也可以透過對可執行程式執行 dump-ov 命令檢視到(例如:dump -ov /usr/bin/ls)。
TRS
文字駐留集合(實記憶體)的大小。這個數目等於程式可用的程式碼段頁的數目的 4 倍。當程式有多個執行例項時,這個數字誇大了記憶體的使用情況。TRS 的值可能比 TSIZ 的值要高是因為其他頁可能包含在程式碼段中,例如 XCOFF 標頭檔案和裝入程式段。
%MEM
由記憶體中工作段和程式碼段頁的和的 4 倍計算得到(即 RSS 的值),再除以機器實記憶體的大小(單位 KB),再乘以 100,四捨五入到最接近的百分點。這個值旨在表明了程式使用的實記憶體。但不巧的是,就像 RSS,它誇大了一個程式與其他程式共享程式文字的開銷。而且,四捨五入到最接近的百分點,使得系統中所有 RSS 值小於 0.005 乘以資料記憶體大小的程式的 %MEM 值為 0.0。
注:
ps 命令並不表明共享記憶體段或者記憶體映像段消耗的記憶體。因為許多應用程式使用共享記憶體或記憶體對映段,svmon 命令是一個更好的檢視這些段的記憶體使用情況的工具。
svmon 命令
svmon 命令提供了一個更加深入的記憶體使用情況的分析。比起 vmstat 和 ps 命令來說,它帶有更多資訊量,並且更具有強制性。svmon 命令捕獲一個當前記憶體狀態的快照。然而,這並不是一個真正的快照,因為它執行在使用者級別,即中斷允許狀態。

要確定 svmon 是否已安裝並可用,執行以下命令:

# lslpp -lI bos.perf.tools
svmon 命令只能由 root 使用者執行。

如果使用時間間隔(-i 選項),統計資訊將會一直顯示直到命令被殺死或者直到達到了時間間隔的數值(可以剛好在該時間間隔後指定)。

可以使用下列不同的報告來分析所顯示的資訊:

全域性(-G)
顯示描述整個系統中實記憶體和調頁空間的使用的統計資訊。
程式(-P)
顯示指定活動程式的記憶體使用情況。如果不提供程式列表,則記憶體使用統計資訊顯示所有活動的程式。
段(-S)
顯示指定段的記憶體使用情況。如果不提供段的列表,則記憶體使用統計資訊顯示所有定義的段。
段的詳細資訊(-D)
顯示指定段的詳細資訊。
使用者(-U)
顯示指定登入名的記憶體使用統計資訊。如果不提供登入名列表,則顯示所有定義的登入名的記憶體使用統計資訊。
命令(-C)
顯示某個命令名指定的程式的記憶體使用統計資訊。
工作負載管理類(-W)
顯示指定的工作負載管理類的記憶體使用統計資訊。如果不提供類,則顯示所有定義的類的記憶體使用統計資訊。
幀(-F)
顯示幀的資訊。不指定幀的號碼時,會報告使用的記憶體的百分比。僅考慮設定了訪問位的幀。在處理期間,所有的訪問位都將復位。因此,當第二次使用 -f 選項時,svmon 命令會報告自上次使用 -f 選項以來已訪問的實記憶體的百分比。如果在系統上定義了一個保留池,則將報告每個已定義池中使用的記憶體的百分比。
層(-T)
顯示層的資訊,例如層號,使用 -a 標誌時的超類名和實記憶體中屬於層的段的總頁數。
使用中的記憶體量
列印全域性的統計資訊,要用 -G 標誌。在以下示例中,以一秒鐘的時間間隔重複兩次。

# svmon -G -i 1 2

size inuse free pin virtual
memory 1048576 425275 623301 66521 159191
pg space 262144 31995

work pers clnt
pin 46041 0 0
in use 129600 275195 0

PageSize PoolSize inuse pgsp pin virtual
s 4 KB - 404795 31995 46041 159191
L 16 MB 5 0 0 5 0
size inuse free pin virtual
memory 1048576 425279 623297 66521 159195
pg space 262144 31995

work pers clnt
pin 46041 0 0
in use 129604 275195 0

PageSize PoolSize inuse pgsp pin virtual
s 4 KB - 404799 31995 46041 159195
L 16 MB 5 0 0 5 0


請注意如果系統中只有 4 KB 的頁面可用,則不顯示細分每個頁面大小的資訊的段。

結果 svmon 報告中的列描述如下:

memory
描述實記憶體使用情況的統計資訊,顯示為 4 KB 大小的頁。
size
整個記憶體的大小,以 4 KB 頁計。
inuse
RAM 中程式使用的頁數加上屬於終止程式但仍駐留在 RAM 中的永久頁面數。這個值等於總記憶體大小減去空閒列表中的頁數。
free
空閒列表中頁面的數量。
pin
固定在 RAM 的頁面的數量。(一個固定的頁面就是一直駐留在 RAM 中而不能調出的頁面)。
virtual
在程式虛擬空間中分配的頁數。
pg space
描述調頁空間使用情況的統計資訊,以 4 KB 大小的頁顯示。報告的值是所使用的實際調頁空間頁面數,這表明這些頁面調出到了調頁空間中。它與 vmstat 命令的不同在於 vmstat 命令的 avm 一欄顯示的是已訪問但不一定調出的虛擬記憶體。
size
總調頁空間的大小,以 4 KB 頁計。
inuse
分配頁的總數。
pin
包含固定頁面的實記憶體子集的詳細統計資訊,以 4 KB 幀顯示。
work
固定在 RAM 中的工作頁面的數量。
pers
固定在 RAM 中的永久頁面數量。
clnt
固定在 RAM 中的客戶機頁面的數量。
in use
正在使用的實記憶體子集的詳細統計資訊,以 4 KB 幀顯示。
work
RAM 中工作頁面的數量。
pers
RAM 中永久頁面的數量。
clnt
RAM 中客戶機頁面的數量(客戶機頁面就是一個遠端檔案頁面)。
PageSize
僅在系統上大小不為 4 KB 的頁面可用時顯示。指定可以在系統上使用的每種頁面大小各自的統計資訊。
PageSize
頁面大小
PoolSize
保留記憶體池中頁面的數目。
inuse
已使用頁面的數目
pgsp
調頁空間中分配的頁面的數目
pin
已固定頁面的數目
virtual
系統虛擬空間中分配的頁面的數目。
在示例中,總記憶體大小有 1048576 頁。將這個數乘以 4096 就是總實記憶體的大小(以位元組計)(4 GB)。其中 425275 頁正在使用,而空閒列表中有 623301 頁,固定在 RAM 中的有 66521 頁。在所有正在使用的頁中,RAM 中有 129600 頁工作頁面,275195 頁永久頁面和 0 頁客戶機頁面。這三個部分的總和(加上已保留的但不一定由保留池使用的記憶體)等於 memory 部分中 inuse 一欄的值。pin 部分將固定記憶體大小分成工作頁面、永久頁面和客戶機頁面這三類。它們的和(加上由保留池保留的總是固定的記憶體)等於 memory 部分中 pin 一欄的值。調頁空間總共有 262144 頁(1 GB),其中有 31995 頁正在使用。memory 中的 inuse 一欄通常要比 pg space 中的 inuse 一欄要大,因為當一個程式完成後,檔案頁面佔用的記憶體不會釋放,而調頁空間分配則會釋放記憶體。

程式的記憶體使用情況
svmon -P 命令顯示了當前正在系統上執行的所有程式的記憶體使用統計資訊。以下是 svmon -P 命令的一個示例:

# svmon -P

--------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
16264 IBM.ServiceRM 10075 3345 3064 13310 N Y N

PageSize Inuse Pin Pgsp Virtual
s 4 KB 10075 3345 3064 13310
L 16 MB 0 0 0 0

Vsid Esid Type Description PSize Inuse Pin Pgsp Virtual
f001e d work shared library text s 4857 0 36 6823
0 0 work kernel seg s 4205 3335 2674 5197
b83f7 2 work process private s 898 2 242 1098
503ea f work shared library data s 63 0 97 165
c8439 1 pers code,/dev/hd2:149841 s 28 0 - -
883f1 - work s 21 8 14 26
e83dd - pers /dev/hd2:71733 s 2 0 - -
f043e 4 work shared memory segment s 1 0 1 1
c0438 - pers large file /dev/hd9var:243 s 0 0 - -
b8437 3 mmap mapped to sid a03f4 s 0 0 - -
583eb - pers large file /dev/hd9var:247 s 0 0 - -

--------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
17032 IBM.CSMAgentR 9791 3347 3167 12944 N Y N

PageSize Inuse Pin Pgsp Virtual
s 4 KB 9791 3347 3167 12944
L 16 MB 0 0 0 0

Vsid Esid Type Description PSize Inuse Pin Pgsp Virtual
f001e d work shared library text s 4857 0 36 6823
0 0 work kernel seg s 4205 3335 2674 5197
400 2 work process private s 479 2 303 674
38407 f work shared library data s 120 0 127 211
a83f5 1 pers code,/dev/hd2:149840 s 99 0 - -
7840f - work s 28 10 27 39
e83dd - pers /dev/hd2:71733 s 2 0 - -
babf7 - pers /dev/hd2:284985 s 1 0 - -
383e7 - pers large file /dev/hd9var:186 s 0 0 - -
e03fc - pers large file /dev/hd9var:204 s 0 0 - -
f839f 3 mmap mapped to sid 5840b s 0 0 - -
[...]

該命令輸出詳細描述了每個程式的全域性記憶體使用情況,以及每個報告的程式所使用的每個段的記憶體使用詳細情況。預設的排序規則是按照 Inuse 頁面計數降序排列。您可以透過使用 svmon 命令與 -u、-p、-g 或 -v 標誌來更改排序規則。

要獲得系統上使用記憶體的前 15 個程式摘要,請使用以下命令:

# svmon -Pt15 | perl -e 'while(<>){print if($.==2||$&&&!$s++);$.=0 if(/^-+$/)}'
--------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
16264 IBM.ServiceRM 10075 3345 3064 13310 N Y N
17032 IBM.CSMAgentR 9791 3347 3167 12944 N Y N
21980 zsh 9457 3337 2710 12214 N N N
22522 zsh 9456 3337 2710 12213 N N N
13684 getty 9413 3337 2710 12150 N N N
26590 perl5.8.0 9147 3337 2710 12090 N N N
7514 sendmail 9390 3337 2878 12258 N N N
14968 rmcd 9299 3340 3224 12596 N Y N
18940 ksh 9275 3337 2710 12172 N N N
14424 ksh 9270 3337 2710 12169 N N N
4164 errdemon 9248 3337 2916 12255 N N N
3744 cron 9217 3337 2770 12125 N N N
11424 rpc.mountd 9212 3339 2960 12290 N Y N
21564 rlogind 9211 3337 2710 12181 N N N
26704 rlogind 9211 3337 2710 12181 N N N

Pid 16264 是消耗記憶體最多的程式標識。Command 表示命令名,這裡是 IBM?.ServiceRM。 Inuse 一欄顯示 10075 頁,它是程式使用的段在實記憶體中的總頁數。每一頁大小為 4 KB。Pin 一欄顯示 3345 頁,它是程式使用的段中固定的總頁數。Pgsp 一欄顯示 3064 頁,它是程式使用的調頁空間總頁數。Virtual 一欄(程式虛擬空間中的總頁數)顯示 13310 頁。

細節區域顯示了摘要區域中顯示的每個程式的每一段的資訊。這包括虛擬 Vsid 和有效 Esid 段標識。Esid 反映了用於訪問相應頁的段暫存器。還顯示了段的型別及其描述,該描述為段的文字描述,包括卷名以及永久段的檔案索引節點。該報告還詳細描述了支援段的頁面的大小(其中 s 表示 4 KB 頁面,L 表示 16 MB 頁面)、RAM 中的頁數 Inuse、RAM 中的固定頁數 Pin、調頁空間中的頁數 Pgsp 以及虛擬頁數 Virtual。

您甚至可以使用更多選項來獲取更多詳細資訊。-j 選項顯示永久段的檔案的路徑。-l 選項提供關於段的更多詳細資訊,-r 選項顯示每個段使用的記憶體範圍。以下是 svmon 命令帶 -l、-r 和 -j 選項的示例:

# svmon -S f001e 400 e83dd -l -r -j

Vsid Esid Type Description PSize Inuse Pin Pgsp Virtual
f001e d work shared library text s 4857 0 36 6823
Addr Range: 0..60123
Shared library text segment
400 2 work process private s 480 2 303 675
Addr Range: 0..969 : 65305..65535
pid(s)=17032
e83dd - pers /dev/hd2:71733 s 2 0 - -
/usr/lib/nls/loc/uconvTable/ISO8859-1
Addr Range: 0..1
pid(s)=17552, 17290, 17032, 16264, 14968, 9620

Address Range 為永久段或者客戶機段指定一個範圍或者為工作段指定兩個範圍。永久段或者客戶機段的範圍用‘0..x’的形式來表示,其中 x 是已使用的虛擬頁面的最大數目。工作段的欄位範圍可以是‘0..x : y..65535’,其中 0..x 包含了全域性資料,會增大,而 y..65535 包含了堆疊區域,會減小。對於一個工作段的地址範圍,是從兩邊開始分配空間直到中間。如果工作段是非私有的(核心或共享庫),空間的分配是不同的。

在以上示例中,段標識 400? 是專用工作段;它的地址範圍是 0..969 : 65305..65535。段標識 f001e 是共享庫文字工作段;它的地址範圍是 0..60123。

一個段可由多個程式使用。這樣的段裡的每一個實記憶體頁解釋了每個使用該段的程式的 Inuse 欄位。因此,Inuse 的總數可能超過實記憶體中的頁面總數。這對 Pgsp 和 Pin 欄位同樣適用。摘要部分中顯示的值由程式使用的所有段的 Inuse、Pin、Pgsp 和 Virtual 計數器的總和組成。

在以上示例中,e83dd 段由若干程式使用,這些程式的 PID 是 17552、17290、17032、16264、14968 和 9620。

特定段標識的詳細資訊
-D 選項顯示了段的記憶體使用的詳細統計資訊。

下面是一個例子:

# svmon -D 38287 -b
Segid: 38287
Type: working
PSize: s (4 KB)
Address Range: 0..484
Size of page space allocation: 2 pages ( 0,0 MB)
Virtual: 18 frames ( 0,1 MB)
Inuse: 16 frames ( 0,1 MB)

Page Frame Pin Ref Mod ExtSegid ExtPage
341 527720 N N N - -
342 996079 N N N - -
343 524936 N N N - -
344 985024 N N N - -
347 658735 N N N - -
348 78158 N N N - -
349 174728 N N N - -
350 758694 N N N - -
404 516554 N N N - -
406 740622 N Y N - -
411 528313 N Y Y - -
412 1005599 N Y N - -
416 509936 N N Y - -
440 836295 N N Y - -
443 60204 N N Y - -
446 655288 N N Y - -

各列的說明如下:

Page
指定段內頁面的索引。
Frame
指定駐留在實記憶體的幀索引。
Pin
指定表示該頁是否固定的標誌。
Ref
僅用 -b 標誌指定。指定表示該頁的訪問位是否有效的標誌。
Mod
僅用 -b 標誌指定。指定表示該頁是否修改的標誌。
ExtSegid
如果頁屬於連結到被檢查段的擴充套件段,則會顯示該段的虛擬段標識。
ExtPage
如果頁屬於連結到被檢查段的擴充套件段,則會顯示該擴充套件段中的頁索引。
當擴充套件段連結到檢查段時,報告類似於以下示例:

Page Frame Pin Ref Mod ExtSegid ExtPage
65574 345324 N N N 288071 38
65575 707166 N N N 288071 39
65576 617193 N N N 288071 40


-b 標誌顯示了所有顯示的幀的訪問和修改位的狀態。顯示之後,幀的訪問位將被複位。當使用 -i 標誌時,它檢測每一個時間間隔內哪些幀可以訪問。

注:
由於對效能會造成影響,請謹慎使用 -b 標誌。
使用記憶體最多的段的列表
-S 選項用於按記憶體使用情況對段排序,並且顯示指定段的記憶體使用統計資訊。如果不提供段的列表,則記憶體使用統計資訊顯示所有定義的段。以下命令按實記憶體中的頁數多少排列系統和非系統段。-t 選項可用於將顯示的段數限制為指定的計數。-u 標誌按實記憶體中的總頁數降序排列輸出。

下面是 svmon 命令帶 -S、-t 和 -u 選項的示例輸出:

# svmon -Sut 10

Vsid Esid Type Description PSize Inuse Pin Pgsp Virtual
70c4e - pers large file /dev/lv01:26 s 84625 0 - -
22ec4 - work s 29576 0 0 29586
8b091 - pers /dev/hd3:123 s 24403 0 - -
7800f - work kernel heap s 22050 3199 19690 22903
a2db4 - pers /dev/hd3:105 s 15833 0 - -
80010 - work page frame table s 15120 15120 0 15120
7000e - work misc kernel tables s 13991 0 2388 14104
dc09b - pers /dev/hd1:28703 s 9496 0 - -
730ee - pers /dev/hd3:111 s 8568 0 - -
f001e - work s 4857 0 36 6823

svmon 和 vmstat 命令輸出的相關性
svmon 和 vmstat 的輸出之間存在相關性。

下面是 svmon 命令的示例輸出:

# svmon -G
size inuse free pin virtual
memory 1048576 417374 631202 66533 151468
pg space 262144 31993

work pers clnt
pin 46053 0 0
in use 121948 274946 0

PageSize PoolSize inuse pgsp pin virtual
s 4 KB - 397194 262144 46053 151468
L 16 MB 5 0 0 5 0

vmstat 命令在一個獨立的視窗中執行,與此同時 svmon 也在執行。vmstat 的報告如下所示:

# vmstat 3
kthr memory page faults cpu
----- ----------- ------------------------ ------------ -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
1 5 205031 749504 0 0 0 0 0 0 1240 248 318 0 0 99 0
2 2 151360 631310 0 0 3 3 32 0 1187 1718 641 1 1 98 0
1 0 151366 631304 0 0 0 0 0 0 1335 2240 535 0 1 99 0
1 0 151366 631304 0 0 0 0 0 0 1303 2434 528 1 4 95 0
1 0 151367 631303 0 0 0 0 0 0 1331 2202 528 0 0 99 0

全域性 svmon 報告顯示了相關的數字。vmstat 命令的 fre 列與 svmon 命令的 memory free 列相關。vmstat 命令報告的活動虛擬記憶體 avm 值與 svmon 命令報告的虛擬記憶體值接近。

svmon 和 ps 命令輸出的相關性
svmon 和 ps 命令輸出之間存在著一些聯絡。svmon 命令輸出如下:

# svmon -P 14706

---------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
14706 itesmdem 9067 3337 2833 12198 N N N

PageSize Inuse Pin Pgsp Virtual
s 4 KB 9067 3337 2833 12198
L 16 MB 0 0 0 0

Vsid Esid Type Description PSize Inuse Pin Pgsp Virtual
f001e d work shared library text s 4857 0 36 6823
0 0 work kernel seg s 4205 3335 2674 5197
f039e 2 work process private s 5 2 27 29
b8397 3 work shared memory segment s 0 0 1 1
d039a 6 work shared memory segment s 0 0 1 1
c0398 4 work shared memory segment s 0 0 1 1
d839b 7 work shared memory segment s 0 0 1 1
e839d f work shared library data s 0 0 91 144
c8399 5 work shared memory segment s 0 0 1 1
83a1 1 pers code,/dev/hd2:221359 s 0 0 - -

將上述示例與下面的 ps 報告作比較:

# ps v 14706
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
14706 - A 0:00 16 692 20 32768 19 0 0,0 0,0 /usr/bin/

SIZE 值 328 與 svmon 命令的 Virtual 值相關,由 process private 值(59)加上 shared library data 值(23)得到,以 1 KB 為單位。這個數目等於程式已使用的工作段頁的數目(即已分配的虛擬頁的數目)的 4 倍。該數必須乘以 4 是因為頁面是以 4 KB 為單位而 SIZE 是以 1 KB 為單位的。如果一些工作段頁當前被調出,這個數值將大於所使用的實記憶體量。SIZE 值(692)與 Virtual 數字相關,該數字由 svmon 命令得到,對應於 process private(29)加上 shared library data(144),以 1 KB 為單位。

RSS 指的是程式實記憶體(駐留集合)的大小,用 KB 表示。這個數值等於記憶體中的工作段頁和程式碼段頁數和的 4 倍。記住程式碼段頁是為所有當前程式執行的例項所共享的。如果 26 個 ksh 程式正在執行,只有 ksh 的可執行程式的任何給定頁面的一個副本可以駐留在記憶體,但是 ps 命令會將程式碼段的大小作為每一個 RSS 的一部分報告,而該部分是 ksh 程式的一個例項。RSS 值(20)與 Inuse 數字相關,該數字由 svmon 命令得到,對應於程式的 process private 值(5 個工作儲存段)、code,/dev/hd2:221359(0) 段以及 shared library data 值(0),以 1 KB 為單位。

TRS 值指的是駐留的文字集合(實記憶體)大小。這個數字等於程式碼段頁數乘以 4。正如我們較早提到的,這個數目誇大程式正在執行多個例項的程式的記憶體使用。這不包括程式的共享文字。TRS 值(232)與 Inuse 列的 code 段(58)中的 svmon 頁數有關,以 1 KB 為單位。TRS 的值可能比 TSIZ 的值要大,因為其他頁,如 XCOFF 頭和載入程式區,可能包含在程式碼段裡。

可以使用以下等式來計算 SIZE、RSS 和 TRS 值:

SIZE = 4 * Virtual of (work lib data + work private)
RSS = 4 * Inuse of (work lib data + work private + pers code)
TRS = 4 * Inuse of (pers code)
以上的 svmon 命令示例只顯示了 4 KB 的頁面。如果使用其他頁面大小,則當您計算 SIZE、RSS 和 TRS 值時應該考慮該頁面大小。

最小記憶體需求計算
用以計算程式的最小記憶體需求的公式如下:

總記憶體頁數(以 4 KB 為單位)= T + ( N * ( PD + LD ) ) + F
其中:

T
= 文字頁數(所有使用者共享)
N
= 該程式同時執行的副本數
PD
= 程式私有段中的工作段數
LD
= 程式使用的共享庫資料頁數
F
= 檔案頁數(所有使用者共享)
得到的結果乘以 4 就得到要求的數值,以千位元組計。您可能也希望將核心中的核心擴充套件和共享庫文字段的值加到這個值上,即使它們是為系統中所有程式共享的。例如,一些如 CATIA 的應用程式和資料庫使用很大的共享庫模組。注意到由於我們只用了程式的單一快照的統計資訊,不保證我們從公式得到的值就是正確的程式的最小工作集合的大小值。要獲得工作集大小,須執行諸如 rmss 命令之類的工具或者在程式活動期間捕獲大量快照,並從這些快照取平均值。有關更多資訊,請參閱『使用 rmss 命令進行記憶體需求評估』。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/271063/viewspace-903427/,如需轉載,請註明出處,否則將追究法律責任。

相關文章