close
1 、 VMM 的管理簡介
首先,還是簡單講解一下記憶體以及 VMM 的一點工作原理。
記憶體和交換空間一般都是用頁面來進行分配和管理的。 在記憶體中存在兩種類型的頁面:計算頁面(一般為可執行文件段中的頁面)和文件頁面(存儲的數據文件的頁面)。 當我們執行程序或者讀入數據的時候,記憶體中的頁面就逐漸被佔用。 當空閒的記憶體只剩 minfree 的時候, vmm 的調頁就被喚醒,通過調頁算法,將內存中的頁面轉移到交換空間中。 一直到空閒內存達到 maxfree,才停止調頁。
在這裡,我們涉及到兩個參數:
1) Minfree :最小空閒頁鍊錶尺寸。 一旦低於該值,系統偷頁以填充頁鍊錶,保證有足夠的記憶體頁面。 偷頁就是將不常用的頁面替換出去。
2) Maxfree :最大空閒頁鍊錶尺寸。 一旦高於該值,系統停止偷頁。
如果發現空閒列表不足,可以用下面的方法增加 minfree 參數
一般情況下, 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參數指定了文件頁面可以佔用記憶體的上限,因為文件頁面不主動釋放,所以很容易造成記憶體的文件頁面過高的佔用,導致其他的應用程式記憶體使用不足。 調整參數值的方法如下:
在 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 顯示當前所有的參數設置
顯示 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 命令
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 位的進程。
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
參考資料
首先,還是簡單講解一下記憶體以及 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
2)vmstat -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
系統調頁的規則:
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
¨ 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 的一些程序佔用了過度的記憶體,我們也可以通過前面類似的程序處理方法來分析。
具體調整需要結合系統運行的應用程序對症下藥,如調整 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的。
在剛剛說的 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的。
參考資料
全站熱搜