AIX系統記憶體佔用率的計算

n-lauren發表於2017-02-09
1、現象、問題描述

在系統監控時,經常會監控系統記憶體佔用率,其目的為避免系統因為在動態分配記憶體時因為實際記憶體不夠而使用swap空間,使用swap空間將使用系統效能下降,系統不穩定。

在Linux系統中,系統記憶體佔用率可以通過free命令,計算得出:

/home/jcxia> free

total used free shared buffers cached

Mem: 24672800 17895600 6777200 0 232996 14706928

-/+ buffers/cache: 2955676 21717124

Swap: 21727904 0 21727904

其中:

total――指系統所有的實體記憶體大小

used――已經使用的實體記憶體大小

free――空閒的實體記憶體大小

buffers――檔案系統快取佔用的實體記憶體,指要寫入物理磁碟的資料佔用的記憶體。

cached――檔案系統快取佔用的實體記憶體,指從物理磁碟讀入供以後使用的資料佔用的記憶體。

實際系統中,檔案系統快取可能佔用大量的實體記憶體,Linux下計算實體記憶體空閒率時,通常將buffers與cached記憶體當作可使用的記憶體。即實際系統記憶體佔用率計算:

( total – (free + buffer + cached) ) * 100/ total

在AIX系統下,沒有free命令,與之類似的的命令是svmon –G

# svmon -G

size inuse free pin virtual

memory 4100096 420275 3679821 271614 398980

pg space 1048576 1109


work pers clnt

pin 271614 0 0

in use 398980 0 21295

其中:

size――報告了 RAM 的大小,單位是大小為 4k 的頁面。

inuse ――報告了程式所使用的 RAM 中的頁面數,加上屬於一個已終止的程式但仍位於 RAM 中的持久頁面的數目。

free ――報告了空閒列表中頁面的數目。

pin ――報告了實體記憶體 (RAM) 中固定的頁面數。固定的頁面不能被調出。

paging space ――報告了分頁空間的實際使用情況(單位是大小為 4k 的頁面)。


與Linux不同的是,svmon只能是root使用者才能使用。但有一些指令碼並不執行在root使用者下,那怎麼樣才能在普通使用者下計算系統記憶體佔用率呢?

在巡檢工具及watchdog指令碼中,AIX下的空閒記憶體計算通常通過free * 100/ total。與Linux系統一樣,AIX的檔案系統也佔用了大量的記憶體,free值很小是很正常的。

因此這裡有兩個問題:

l AIX下的記憶體佔用率應該怎麼計算?

l AIX下普通使用者怎麼獲取記憶體佔用資訊?

2、關鍵過程、根本原因分析

首先想到的辦法是通過另外的屬主是root使用者的指令碼,設定其Set-id位,使其執行時有效使用者ID為root使用者的ID,然後在指令碼中執行svmon,沒有成功。

然後,想想能不能搞清楚svmon每項輸出的含義,並找找有沒有普通使用者能執行的相關的命令,並根據相關的輸出計算得出。

先來分析AIX記憶體管理原理。

AIX使用VMM(虛擬記憶體管理器)管理管理 RAM 和虛擬頁面的分配。“在 AIX 中,將所有的虛擬記憶體段劃分為若干個頁面,每個頁面的預設大小為 4KB。所分配的頁面可以位於 RAM 或者分頁空間(虛擬記憶體儲存於磁碟上)。VMM 還維護一個稱為空閒列表 的物件,該物件定義為未分配的頁幀。它們用於處理缺頁的情況。通常存在少量未分配頁面(您可以自行配置),VMM 可以使用這些頁面來騰出空間併為其重新分配頁幀。可以使用 VMM 的頁面置換演算法來選擇要重新分配頁幀的虛擬記憶體頁面。這種分頁演算法可以確定對當前位於 RAM 中的哪些虛擬記憶體頁面的頁幀進行回收,並放回到空閒列表中。AIX 可以使用所有可用的記憶體,除了那些配置為未分配並用做空閒列表的記憶體之外。”

VMM 將虛擬記憶體段劃分為兩種不同的類別。它們分別是,使用計算記憶體的工作段和使用檔案記憶體的持久段。

計算頁面

當程式對計算資訊進行處理時,將使用到計算記憶體。這些工作段是臨時的(暫時的),並且當程式終止或者頁面被替換時,這些工作段將不復存在。它們沒有對應的持久磁碟儲存位置。在許多情況下,當一個程式終止時,將釋放其物理和分頁空間。在 VMM 中,當空閒實體記憶體較少時,可以將最近沒有使用的程式從 RAM 移出到分頁空間,以幫助釋放實體記憶體,從而完成更多的實際工作。

檔案頁面

與計算記憶體不同,檔案記憶體使用了持久段,並在磁碟上具有持久儲存位置。資料檔案或者可執行程式通常都對映為持久段,而不是工作段。資料檔案可能與檔案系統相關,如 JFS、JFS2 或 NFS。它們一直都位於記憶體中,直到檔案被解除安裝、頁面被替換、或者取消了到檔案的連結。在將資料檔案複製到 RAM 中之後,VMM 控制何時對這些頁面進行覆蓋或者將其用於儲存其他資料。在可以選擇的情況下,大多數人更希望將檔案記憶體調出到磁碟,而不是計算記憶體。 

從以上分析可以得出,計算AIX記憶體實際使用的量時,應該是:
計算記憶體 *100 / 總記憶體 

使用svmon –G命令時,即為work * 100 / memory size.

不過上述計算也不完全正確,因為work頁面可能於交換空間,而不是實際記憶體中。


分析系統效能時,我們還常用另一個命令:vmstat。

8 [jcxia] :/home/jcxia/tool>vmstat 

系統配置:lcpu=4 mem=16000MB 

kthr memory page faults cpu 

----- ----------- ------------------------ ------------ -----------

r b avm fre re pi po fr sr cy in sy cs us sy id wa

1 1 397674 3681485 0 0 0 0 0 0 24 2040 64 0 0 75 24

這裡,avm的含義為:表示系統所使用的活動虛擬記憶體量(單位為 4k 大小的頁面),不包括檔案頁面。可見,使用“vm * 100/系統記憶體總頁面數 ”可以估算系統當前記憶體佔用率。


3、結論、解決方案及效果

使用vmstat –v獲取系統總頁面數:

9 [jcxia] :/home/jcxia/tool>vmstat -v

4096000 記憶體頁

3886550 lruable 頁

3681488 可用頁

0 記憶體池

279392 固定頁

80.0 maxpin 百分比

20.0 minperm 百分比

80.0 maxperm 百分比

0.3 numperm 百分比

13075 檔案頁

0.0 壓縮百分比

0 壓縮頁

0.4 numclient 百分比

80.0 maxclient 百分比

16841 客戶機頁

0 已排程的遠端頁調出

0 在沒有 pbuf 的情況下阻塞暫掛磁碟 I/O

0 在沒有 psbuf 的情況下阻塞調頁空間 I/O

2740 在沒有 fsbuf 的情況下阻塞檔案系統 I/O

6092 在沒有 fsbuf 的情況下阻塞客戶機檔案系統 I/O

0 在沒有 fsbuf 的情況下阻塞外部尋呼機檔案系統 I/O

然後使用vmstat獲取avm大小。

可以使用使用shell指令碼如下:

total=`vmstat -v|head -1|awk '{print $1}'`

avm=`vmstat |sed -n '$ p'|awk '{print $3}'`

SysMemRatio=`echo "100 * ${avm} / ${total}" | bc `

4、經驗總結、預防措施和規範建議

不同的作業系統管理機制存在一定的差別,做watchdog等相關的工具時,要考慮不同平臺的差別。

這種方法只能近似計算,並且有可能出現記憶體佔用率超過100%的現象.



1.在AIX系統中,記憶體可以簡單的分為兩類,計算型記憶體和檔案型記憶體,

在AIX作業系統中,可以使用topas命令檢視整個系統的執行情況,其中一個重要的部份是系統的記憶體使用情況,以及交換情況:

MEMORY
Real,MB   16032
% Comp     83.2
% Noncomp   9.9
% Client    9.9

PAGING SPACE
Size,MB   16384
% Used      3.3
% Free     96.6

  在一個使用裸裝置的系統中,檔案型記憶體,即上面的%Noncomp,%Client,只需要使用整個系統很少的記憶體;而把大部份的記憶體作為計算型記憶體(%Comp)來使用,這部份記憶體量主要為ORACLE SGA和PGA所用,其中ORACLE SGA 為pinned memory.

  根據系統記憶體大小,設定系統可以pin住的最大值:

     maxpin% = 80   --此值可以升高

     v_pinshm = 1   --允許pin住記憶體

     接下來是三個控制檔案型記憶體的引數的值:

     maxclient% = 10  --檔案型記憶體可使用記憶體總的百分比的最大值,<=maxperm%

     maxperm% = 10    --檔案型記憶體可使用記憶體總的百分比的最大值

     minperm% = 5     --檔案型記憶體可使用記憶體總的百分比的最小值

  這三個引數,可以根據記憶體總量大小,進行適度調節。計算型記憶體與檔案型記憶體,在實際的應用中,需要遵循以下一些原則(前3條是參考別人的):

     1.使用的檔案型記憶體百分比 + 使用的計算型記憶體百分比 < 100%

     2.計算型記憶體中的pinned memory設定要合理,即sga大小要設定合理,要留一部份給OS,OS也需要pinned memory.當系統資源緊張時,OS的pinned memory具有最高的優先順序.

     3.保證系統非pinned 計算型 memory有一個合理的成長空間,這部份主要是給ORACLE PGA使用,當連線數增長過快時,此記憶體的使用增長也相當的明顯,而此增長很有可能會導致作業系統的交換。

     當系統的使用的檔案型記憶體百分比 + 使用的計算型記憶體百分比 >= 100%,系統便開始產生交換,系統的PAGING SPACE會持續的增長,影響到產品庫的安全。

     4.一般的資料庫伺服器,檔案型記憶體可以使用較少的空間,因為檔案型記憶體並不主動釋放,可能造成記憶體資源的短缺及Paging Space使用率過高,所以資料庫伺服器上maxclient、maxperm、minperm的值不宜過大,典型值如下:

     maxclient% = 8     

     maxperm% = 12    

     minperm% = 5     

如何更改這三個引數呢,  在AIX5.3上,可以使用 vmo 命令,此命令設定或顯示所有虛擬記憶體管理器調整引數的當前值或下一個引導值。還可以用此命令進行永久性更改,或將更改推遲到下一次重新引導之後生效。此命令是設定引數還是顯示引數,要由所帶標誌來決定。帶 -o 標誌的話,兩個操作都執行。它既可以顯示引數的值,也可以為引數設定新值。

如果在修改這些引數前,想檢視這些引數的值,則可以用下面的命令:

vmo -L 或者 vmstat -v 或者vmo -a

調整:vmo -p -o maxclient%=8

     vmo -p -o maxperm%=12

     vmo -p -o minperm%=5

利用-p引數,是立即生效的,不需要重啟,下次重啟仍然有效。

如果是-r引數,是不立即生效的,重啟生效,turns on the updating of the
/etc/tunables/nextboot file.重啟生效的引數記錄在 /etc/tunables/nextboot。

因為引數maxperm充當的是軟限制,所以檔案型記憶體的佔用率仍然可以超過maxperm的設定值,如果需要進行強制限制,則需要將引數strict_maxperm的值設為1,該引數的預設值是0,但此方法需要謹慎使用。

備註:也許有人不是很熟悉vmo,反而熟悉vmtune,其實他們是一樣的

AIX 5.3以前,檢視引數值 vmtune -a

            修改minperm和maxperm的值為5%和20%,vmtune -p 5 -P 20

            如果是64位核心,vmtune64 -p 5 -P 20

AIX 5.3:    vmo -p -o maxperm%=20

            vmo -p -o minperm%=5









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

相關文章