星期一, 1月 10, 2011

AIX Memory 效能設定

1 、 VMM 的管理簡介


首先,還是簡單講解一下記憶體以及 VMM 的一點工作原理。

記憶體和交換空間一般都是用頁面來進行分配和管理的。 在記憶體中存在兩種類型的頁面:計算頁面(一般為可執行文件段中的頁面)和文件頁面(存儲的數據文件的頁面)。 當我們執行程序或者讀入數據的時候,記憶體中的頁面就逐漸被佔用。 當空閒的記憶體只剩 minfree 的時候, vmm 的調頁就被喚醒,通過調頁算法,將內存中的頁面轉移到交換空間中。 一直到空閒內存達到 maxfree,才停止調頁。

在這裡,我們涉及到兩個參數:

1) Minfree :最小空閒頁鍊錶尺寸。 一旦低於該值,系統偷頁以填充頁鍊錶,保證有足夠的記憶體頁面。 偷頁就是將不常用的頁面替換出去。

2) Maxfree :最大空閒頁鍊錶尺寸。 一旦高於該值,系統停止偷頁。

如果發現空閒列表不足,可以用下面的方法增加 minfree 參數

#vmo -o minfree=1000 -o maxfree=1008
Setting maxfree to 1008
Setting minfree to 1000

#vmo –o minfree=1000 –o maxfree=1008 –P # -P 參數使修改永久生效
一般情況下, minfree 和 maxfree 通過下面的公式得到:
maxfree=minmum(memory/128,128) ,minfree=maxfree-8
注意:在 AIX 5.2 之前的版本請使用 /usr/samples/kernel/vmtune 命令。
#/usr/samples/kernel/vmtune –f 1000 –F 1008

或參考 http://pctartarus.com/bbs/archiver/tid-1939.html


另外,關於內存的使用,我們還有兩個經常碰到的參數需要關注:
Minperm :用戶 I/O 文件訪問的最小緩衝區頁數
Maxperm :用戶 I/O 文件訪問的最大緩衝區頁數
Minperm 和 maxperm 這兩個參數的預設值分別為 20 %和 80 %。 在這裡主要與性能相關的是 maxperm 參數。maxperm參數指定了文件頁面可以佔用記憶體的上限,因為文件頁面不主動釋放,所以很容易造成記憶體的文件頁面過高的佔用,導致其他的應用程式記憶體使用不足。 調整參數值的方法如下:

#vmo -o maxperm%=80 -o minperm%=20
Setting minperm% to 20
Setting maxperm% to 80

在 AIX 5.2 之前的版本請使用 /usr/samples/kernel/vmtune 命令。
#/usr/samples/kernel/vmtune -p 20 – P 80 將 min 和 max 的值分別設置為 20 %和 80 %。

查看當前的參數設置方法如下:
1 ) vmo –a 顯示當前所有的參數設置
在 AIX 5.2 之前的版本請使用 # /usr/samples/kernel/vmtune 顯示當前所有的參數設置

qwfnhora01:/>vmo -a
       cpu_scale_memp = 8
data_stagger_interval = 161
                defps = 1
  force_relalias_lite = 0
            framesets = 2
            htabscale = n/a
    kernel_heap_psize = 4096
 large_page_heap_size = 0
         lgpg_regions = 0
            lgpg_size = 0
      low_ps_handling = 1
      lru_file_repage = 1
    lru_poll_interval = 0
            lrubucket = 131072
           maxclient% = 80
              maxfree = 128
              maxperm = 2520411
             maxperm% = 80
               maxpin = 2621440
              maxpin% = 80
      mbuf_heap_psize = 4096
      memory_affinity = 1
        memory_frames = 3276800
             mempools = 1
              minfree = 120
              minperm = 630102
             minperm% = 20
            nokilluid = 0
              npskill = 16384
              npswarn = 65536
     num_spec_dataseg = 0
            numpsblks = 2097152
         pagecoloring = n/a
      pinnable_frames = 3082426
pta_balance_threshold = n/a
  relalias_percentage = 0
soft_min_lgpgs_vmpool = 0
     spec_dataseg_int = 512
     strict_maxclient = 1
       strict_maxperm = 0
             v_pinshm = 0
      vmm_fork_policy = 0

2vmstat -v

qwfnhora01:/>vmstat -v
              3276800 memory pages
              3150515 lruable pages
               548834 free pages
                    2 memory pools
               194364 pinned pages
                 80.0 maxpin percentage
                 20.0 minperm percentage
                 80.0 maxperm percentage
                 12.9 numperm percentage
               407332 file pages
                  0.0 compressed percentage
                    0 compressed pages
                  0.0 numclient percentage
                 80.0 maxclient percentage
                    0 client pages
                    0 remote pageouts scheduled
                    0 pending disk I/Os blocked with no pbuf
                    0 paging space I/Os blocked with no psbuf
                 8634 filesystem I/Os blocked with no fsbuf
                    0 client filesystem I/Os blocked with no fsbuf
                    0 external pager filesystem I/Os blocked with no fsbuf


顯示 minperm 和 maxperm 和 numperm 的值。numperm 值給出的是記憶體中文件頁數。
系統調頁的規則:
1) 如果 numperm>maxperm ,則只調出文件頁面。
2) 如果 numperm<minperm ,則同時調出文件頁面和計算頁面。
3) 如果 minperm<numperm<maxperm ,則只調出文件頁面,除非新調入的文件頁面大於計算頁面的總和。
如果系統在向調頁空間調出頁面,可能使因為記憶體中的文件頁數低於 maxperm ,從而也調出了部分的計算頁面以達到 maxfree的要求。 在這種情況下,可以考慮把 maxperm 降低到低於 numperm 的某個值,從而阻止計算頁面的調出。 在 5.2 ML4 以後的版本中,為了防止計算頁面被調出,可以採用另外一個方法,就是設置參數 lru_file_repage=0 。 將該參數設為 0 ,則告訴 vmm在進行頁面替換的時候,優先替換文件頁面。
maxclient 通常應該設置為一個小於或者等於 maxperm 的值。
增強 JFS 文件系統為它的緩衝區高速緩存使用客戶機文件,這不受 maxperm 和 minperm 的影響。 為了在限制增強 JFS 文件系統使用高速緩存,可以指定 maxclient 的值,避免在它進行頁面替換的時候,替換其他類型的頁。


2 、使用 vmstat 確定內存的使用情況

主要檢查 vmstat 輸出的 memory 和 pages 列和 faults 列。 詳細的說明見前一節 cpu 評估說明。

3 、 svmon 命令

qwfnhora01:/>svmon -G -i 2 2
               size      inuse       free        pin    virtual
memory      3276800    2720818     555982     194216    2381233
pg space    2097152     289637

               work       pers       clnt      lpage
pin          193983        233          0          0
in use      2289298     431520          0          0
               size      inuse       free        pin    virtual
memory      3276800    2722427     554373     194238    2382831
pg space    2097152     289636

               work       pers       clnt      lpage
pin          194003        233          0          0
in use      2290896     431531          0          0

memory 段

¨ size 物理記憶體總頁數。4KB/ 頁
¨ inuse 物理記憶體中正在使用的記憶體頁面數。 包含活動進程和已經終止的進程的持久文件頁面。
¨ free 空閒列表中的頁面數量
¨ pin 鎖定在記憶體中的頁面數量(鎖定的意思就是不能被替換出去)
¨ virtual

pg space 段

¨ size 調頁空間總大小
¨ inuse 已經分配頁的總數,也就是已經使用的調頁空間頁數

pin 段

¨ work 物理記憶體中的工作頁面數
¨ pers 物理記憶體中的持久頁面數
¨ clnt 物理記憶體中的client頁面數(clinet頁面就是一個遠程文件頁面)

inuse 段

¨ work 物理記憶體中的工作頁面數
¨ pers 物理記憶體中的持久頁面數
¨ clnt 物理記憶體中的client頁面數(client
頁面就是一個遠程文件頁面)

3 、 ps 命令顯示當前運行的進程狀態信息。
運行下列命令,顯示內存佔用前 10 位的進程。

qwfnhora01:/>r
ps gv |sort +6b -nr |head -10
 1511620      - A    27:53 2364 200000 226280    xx 64644 38092  0.0  2.0 ora_mmo
 2343082      - A     3:11    1 22240 60332    xx 64644 38092  2.6  1.0 oraclem
 1958134      - A     1:59    1 18620 56712    xx 64644 38092  5.9  1.0 oraclem
 1728572      - A    41:05  551 20760 54328    xx 64644 38092  0.0  0.0 ora_arc
 2306100      - A    409:24   82 16760 54140    xx 64644 38092  0.5  0.0 oraclem
  946326      - A    193:55    2 15936 54028    xx 64644 38092  3.2  0.0 oraclem
  983108      - A    216:51    1 15928 54020    xx 64644 38092  1.5  0.0 oraclem
  975094      - A    77:42    1 15852 53944    xx 64644 38092  0.6  0.0 oraclem
 1548438      - A    18:24    1 15780 53872    xx 64644 38092  2.2  0.0 oraclem
 1847442      - A    46:45    1 15684 53776    xx 64644 38092  0.3  0.0 oraclem



如果是 oracle 的一些程序佔用了過度的記憶體,我們也可以通過前面類似的程序處理方法來分析。

4 、記憶體的調整

具體調整需要結合系統運行的應用程序對症下藥,如調整 minperm/maxperm 將改變內存與 PAGING SPACE 之間的交換算法,調整 minpgahead/maxpgahead 將改變記憶體塊請求機制,調整 minfree/maxfree 將改變記憶體不足時的記憶體清理刷新機制,等等。如果數據庫使用raw device,並且沒有太多其他的應用,因為raw device不需要文件系統的緩存,所以可以降低 minperm , maxperm ,maxclient 的默認值,降低操作系統對內存的不必要的佔用。
案例:
計費數據庫數據庫響應變慢,內存16G,raw device,卻存在很多的 PI,PO 情況。

在檢查與內存相關的系統參數,發現如下問題:
minperm% = 20 , maxperm% = 80 , maxclient% = 80

說明:以上三個參數為系統預設配置,其表示,使用文件系統時,最多可使用 80% *16G=10.8G,用於緩存所訪問的文件。

結論:由於以上參數採用系預設配置,文件系統緩存最大可以達到10.8G, 在執行大量的文件 cp 操作後,系統的可用記憶體量迅速下降,在其後的計費過程中,由於大量 page in/page out 操作引起系統嚴重性能瓶頸。


優化:
將 maxperm% = 30 , maxclient% = 30

#vmo –o maxperm%=30 –P
#vmo –o maxclient%=30 –P
5.2 以前版本
/usr/samples/kernel/vmtune –p 20 –P 30
/usr/samples/kernel/vmtune –t 30



AIX 的記憶體配置

有關AIX 的記憶體配置一直有個奇怪的問題,就是無論你的記憶體裝了多少,系統配置時都會儘可能的讓作業系統拿來當成檔案系統 JFS/JFS2 操作的 Cache,而且會儘可能的把記憶體都吃光,這使得有些正常的使用者作業要用到記憶體時,系統就要去做記憶體分頁切換,而在 AIX 5.2 ML5 和 AIX 5.3 ML2之前,這個動作並沒有被最佳化過,意思就是平常記憶體可能都會被 File System Cache 佔用,但真正使用者要執行的程式要使用時,實體記憶體己經被佔用光了,所以系統就會大量的使用 VMM 上面定義的磁碟分頁的部份,如此一來,真正的效能就會被磁碟分頁這個動作整個拖住。造成效能非常的差。

在剛剛說的 AIX 5.2 ML5 和 AIX 5.3 ML2 之前,我們使用 VMO 中的 Min Perm 和 Max Perm 來限制 File System Cache ,讓系統可保有最小有 Min Perm 定義的百分比 Size 的 File Cache ,最大又只能使用 Max Perm 定義的 Cache ,這樣的話就能改善上述的一些狀況。

另外在搭配 Oracle 9i /10g 版本時,更可以在系統上去改動 v_pinshm=1 ,然後將 Oracle 的 Lock_SGA 啟動,讓 Oracle 的 SGA 部份啟動後就佔住記憶體,不會再接受系統操作去切換分頁位置,但是 v_pinshm=1 這個設定如果在記憶體較小的設備上(其實己經遇過幾次,說比較小,也不一定,有很大的系統還是當過),經常造成系統當掉,每次原廠工程師把 Report 收回去一看就會說這個要關掉不能開,但 Oracle 明明有文件說這個開了效能才會上來。每次就為了這個參數在吵。

一直到 AIX 5.2 ML5 和 AIX 5.3 ML2 之後,有了一個新的參數叫 LRU_FILE_REPAGE ,系統預設是 1 ,建議是 0 (AIX 6 己經將這個參數拿掉,直接預設就是 0 ) ,這個參數設定為 0 後,系統就會將記憶體優先配置給使用者使用,假設記憶體己經全部被 Filesystem Cache 部份佔掉了,當有使用者要使用時,Filesystem Cache 就會優先被釋放出來供使用者的應用程式使用。

有這個參數以後,在各種應用系統的記憶體問題效能就有比較大幅度的解決,起碼記憶體不會再莫明奇妙的一直被吃光,然後用到磁碟分頁去了,除非,你的記憶體是真的不夠的。但是記住一點,你在各種記憶體監控程序去檢視記憶體時,你仍然會發現記憶體的 Free Space 可能還是 2%~3%或者是更少,除非你的系統開起來都沒有任何運作。

另外 File System Cache 只有在有使用 JFS/JFS2 的狀態下,有執行 OS Level 的 檔案操作時會被使用到,比如說 copy 檔案, tar 檔案等等這些檔案的 I/O 行為,如果是像 Oracle 那種直接由 Block Level 或是說使用 RAW Device 是不會用到 File Cache的。


參考資料



沒有留言: