AIX 5L 記憶體效能優化,第 3 部分

victorymoshui發表於2011-07-27
獲得關於交換(分頁)空間的概述,瞭解如何配置和管理它,捕獲統計資料,優化您的虛擬記憶體管理器 (VMM) 設定,以便提供最優的交換(分頁)空間配置和效能。

關於本系列

這個由三篇文章組成的系列重點關注於在執行 AIX® 的 IBM System p™ 伺服器上進行記憶體管理和優化的各個方面。第 1 部分提供了 AIX 中記憶體的概述,包括對虛擬記憶體和虛擬記憶體管理器 (VMM) 的介紹。它還深入地分析了各種優化引數,並對 AIX Version 5.3 中記憶體管理方面的改進內容進行了介紹。第 2 部分重點關注於記憶體子系統監視的詳細內容,並介紹瞭如何分析所得到的結果。第 3 部分主要介紹交換空間,以及如何最好地優化 VMM 設定,以提供最優的交換空間配置和效能。

引言

什麼是交換(分頁)空間?它是與 VMM 有關的。VMM 使用交換(分頁)空間儲存沒有使用活動 RAM 的程式。正是因為這個目的,交換空間是系統整體效能的關鍵元件。作為一名管理員,您需要了解如何監視和優化您的分頁引數。分頁空間本身是一個特殊的邏輯卷,它儲存了當前不訪問的資訊。您必須確保您的系統擁有足夠的分頁空間。如果分頁空間過小,整個程式可能會丟失,並且當所有的空間都佔滿後,系統可能會崩潰。儘管值得再次說明,分頁空間是 VMM 中的一部分,但是更重要的是真正地理解核心如何將程式調入到 RAM 中,過多的分頁肯定會對效能造成影響。AIX 通過將核心與 VMM 緊密整合在一起,實現了一種稱為請求分頁的方法。事實上,核心本身的大部分都駐留在虛擬記憶體中,這樣可以幫助釋放它的片段空間以用於其他程式。我將更深入地介紹它的工作方式,並介紹在管理和優化分頁空間時需要使用的一些工具。

您將瞭解到,優化工作必須根據系統的型別來進行。例如,對於使用 Oracle 聯機事務處理 (OLTP) 型別資料庫的系統,在配置多大的交換空間以及如何優化分頁引數方面,通常有一些特定的推薦方案。正如本系列前幾期文章中所介紹的(請參見參考資料部分),如果不能真正地瞭解系統的執行狀況,您就無法對分頁設定進行真正地優化。您需要了解所使用的工具、如何最好地分析將要捕獲的資料,並熟悉實現分頁空間的最佳實踐。根據我的經驗,導致系統崩潰的首要原因就是耗盡了分頁空間。如果您仔細地閱讀本文,並且遵循其中的建議方案,那麼應該不會出現這種情況。很顯然,您並不希望系統發生崩潰,但如果的確出現了這種情況,那麼您將希望這是由於硬體故障造成的、而與您的操作無關,或者由於系統管理員的疏忽造成。

請求分頁

在這個部分中,我介紹了 AIX 如何處理分頁,給出了交換和分頁的定義,並深入地研究了分頁空間分配的幾種不同模式。這些概念可以幫助您理解後續有關監視、配置和優化的部分。

大多數管理員都認為分頁是一件很麻煩的事情。實際上,分頁是 AIX 所完成的任務中非常必要的一部分,這是由於 AIX 核心與 VMM 及其請求分頁的實現進行了緊密的整合。請求分頁的工作原理是,核心一次僅載入部分頁面到實際記憶體中。當 CPU 需要另一個頁面時,它會到 RAM 中查詢。如果無法在 RAM 中找到這個頁面,則出現一次缺頁,然後向核心發出訊號以便從磁碟中載入更多的頁面到 RAM。請求分頁的一個優點是,分頁空間不需要非常大,因為資料總是在分頁空間和 RAM 之間不斷地交換。在較早的 UNIX® 系統中,將分頁預先分配到磁碟,無論使用還是不使用它們。這使得所分配的磁碟空間可能永遠不會被使用。從本質上說,請求分頁可以避免盲目地分配磁碟空間。應該使得程式的交換最少,因為許多工可能儲存在 RAM 中。的確如此,因為程式(頁面)只有一部分儲存在 RAM 中。

交換指的是什麼呢?儘管分頁和交換通常可以互換使用,但它們之間存在細微的區別。如前所述,在進行分頁時,程式的部分內容將在磁碟和 RAM 之間來回移動。當發生交換時,會將整個程式來回移動。為了支援這種情況,在將程式移動到分頁空間之前,AIX 會掛起整個程式。只有在將程式交換回 RAM 之後,才能夠繼續執行它。出現這樣的情況並不是很好,您應該儘量防止交換的發生,交換可能會導致另一種稱為顛簸的情況(稍後將介紹這個內容)發生。

作為一名 UNIX 管理員,您可能對分頁和交換的一些概念已經非常熟悉。AIX 提供了三種不同模式的分頁空間分配策略:延遲的頁面空間分配(deferred page space allocation)、晚頁面空間分配(late page space allocation)、早頁面空間分配(early page space allocation)。AIX 的預設策略是延遲的頁面空間分配。這樣可以確保將分頁空間的分配延遲到必須調出頁面的時候進行,從而確保不會浪費分頁空間。事實上,當您擁有很大的 RAM 時,您甚至不需要使用任何分頁空間(請參見清單 1)。


清單 1. 確保沒有浪費的分頁空間
# lsps -a

Page Space      Physical Volume   Volume Group    Size %Used Active  Auto  Type
hd6             hdisk0            rootvg        4096MB     1     yes   yes lv

清單 1 中僅使用了百分之一的分頁空間。

讓我們來看看 AIX 是如何處理分頁空間分配的(請參見清單 2)。


清單 2. 檢查 AIX 如何處理分頁空間分配
# vmo -a | grep def
  defps = 1

清單 2 說明使用了這種預設的方法(延遲的頁面空間分配)。要禁用這個策略,您需要將引數設定為 0。這將使得系統使用晚分頁空間分配策略。晚分頁空間分配策略會在 RAM 中相應的頁面被修改時才分配分頁磁碟塊。這種方法通常用於那些效能比可靠性更加重要的環境。在本文所介紹的場景中,程式可能會因為缺少記憶體而執行失敗。那麼早頁面空間分配又如何呢?如果您希望確保程式不會因為較低的分頁情況而終止,通常可以使用這種策略。早頁面空間分配策略可以預先分配分頁空間。這是與晚分頁空間分配策略截然相反的。對於可靠性要求很高的環境,可以使用這種策略。啟用這種策略的方法是將 PSALLOC 環境變數設定為 early (PSALLOC=early)。

您還應該瞭解在 AIX Version 5.3 中首次引入的垃圾回收特性。這個特性允許您釋放分頁空間磁碟塊,從而允許您配置比通常所需要的更少的分頁空間。這種特性只能用於預設的延遲頁面空間分配策略。

監視和配置分頁空間

在這個部分中,我將向您介紹如何監視系統中的分頁空間。我還將介紹用於配置分頁空間的各種命令,以及幫助系統管理員使用分頁空間的其他工具。

要確定系統中分頁空間的使用量,最簡單的方法是執行 lsps 命令(請參見清單 3)。


清單 3. 執行 lsps 命令
# lsps -s
Total Paging Space   Percent Used
      4096MB               1%

您已經在前面看到了 -a 標誌。我喜歡使用 -s 標誌,因為 -a 標誌僅僅顯示所使用的分頁空間,而 -s 標誌則可以提供所有分配的分頁空間的彙總資訊,包括使用早頁面空間分配策略分配的空間。當然,這個標誌僅適用於禁用了分頁分配預設方法的情況。

接下來再研究 vmstat。本系列文章的第 2 部分非常詳細地介紹了 vmstat,這是我最喜歡的 VMM 監視工具之一。我發現,要確定系統的執行情況,使用這個命令是最簡單的方法。您可以從中發現是否存在許多分頁以及是否發生了顛簸。

讓我們來看看清單 4 中顯示的一些輸出。


清單 4. 使用 vmstat
# vmstat 1 5

System Configuration: lcpu=2 mem=4096MB
kthr     memory             page              faults        cpu
----- ----------- ------------------------ ------------ -----------
r  b   avm   fre  re   pi  po  fr   sr    cy    in   sy  cs  us sy id wa
1  0 166512  627    0   0   1  0   92    0 277  3260 278   3  1  96  0
1  0 166512  623    0   0   1  0   40    0 253  2260 108   2  1  96  1
1  0 166512  627    0   0   0  0   0     0 248  3343  91   0  1  96  2
1  0 166512  627    0   0   0  0   2     0 247  3164  84   0  1  99  0
1  0 166512  627    0   1   0  0   0     0 277  3260  83   2  1  97  0

其中,最重要的列包括:

  • avm——這一列表示您所使用的活動虛擬記憶體量(單位為 4k 大小的頁面),不包括檔案頁面。
  • fre ——這一列表示記憶體空閒列表的大小。在大多數情況下,我並不擔心這個值什麼時候變得很小,因為 AIX 總是會充分地使用記憶體,並且不會像您希望的那樣儘早地釋放記憶體。這個設定由 vmo 命令的 minfree 引數來確定。歸根結底,分頁的資訊更加重要。
  • pi——這一列表示從分頁空間調入的頁面數。
  • po——這一列表示調出到分頁空間的頁面數。

正如您在清單 4 中所看到的,該系統中幾乎沒有進行分頁。

清單 5 顯示了一個可能出現了顛簸的系統的示例。


清單 5. 可能存在顛簸的系統
# vmstat 2 3

System Configuration: lcpu=4 mem=4096MB
kthr     memory             page              faults        cpu
----- ----------- ------------------------ ------------ -----------
r  b   avm   fre  re   pi  po  fr   sr    cy    in   sy  cs  us sy id wa
1  2 166512  7    0    57 127  0   929    0 2779 3260 1278 3 30  50  0 20
1  5 166512  12   0    39 129  0   409    0 2538 2260 1108 2 10  30 10 50
1  6 166512  110  0     8 212  0   480    0 2487 3343 991  0 27  33 20 30

憑什麼能夠得出這個結論呢?首先,請看 po 列。該列的值表示頁面不斷地在磁碟和 RAM 之間來回移動。您還應該發現系統中存在瓶頸,因為阻塞程式和等待時間都高得離譜。而且空閒列表的值也比正常情況要低一些。您可以使用 vmo 命令來檢視空閒列表,其值為 120。這意味著,空閒列表的值不應該低於 120。一般情況下,我認為空閒列表的值較低並不能說明問題,但是在這個示例中,它比正常值還要低。當出現這種情況時,通常表示系統中發生了顛簸現象。顛簸現象的典型標誌是,當作業系統試圖釋放資源時,首先警告程式以釋放分頁空間,然後終止整個程式。在優化 vmo 引數的過程中,您可以幫助設定顛簸開始時的閾值。您還可以使用 topas 或者 nmon 來檢視記憶體的使用情況。這兩種實用工具可以以圖形的方式、更加友好的格式顯示分頁資訊(請參見清單 6)。


清單 6. 使用 topas 以圖形化的方式顯示分頁資訊
Topas Monitor for host:    testbox               EVENTS/QUEUES    FILE/TTY
Sun May 20 11:48:42 2007   Interval:  2         Cswitch      86  Readch    90043
                                                Syscall    1173  Writech    1336
Kernel    0.5   |#                           |  Reads       103  Rawin         1
User      0.0   |                            |  Writes       91  Ttyout      157
Wait      0.0   |                            |  Forks         0  Igets         0
Idle     99.5   |############################|  Execs         0  Namei       147
                                                Runqueue    0.0  Dirblk        0
Network  KBPS   I-Pack  O-Pack   KB-In  KB-Out  Waitqueue   0.0
en1       1.6      4.0     4.0     0.2     1.4
en2       0.0      0.0     0.0     0.0     0.0  PAGING           MEMORY
lo0       0.0      0.0     0.0     0.0     0.0  Faults        0  Real,MB    4095
                                                Steals        0  % Comp     16.6
Disk    Busy%     KBPS     TPS KB-Read KB-Writ  PgspIn        0  % Noncomp  84.3
hdisk0    0.0      0.0     0.0     0.0     0.0  PgspOut       0  % Client    0.5
hdisk1    0.0      0.0     0.0     0.0     0.0  PageIn        0
hdisk3    0.0      0.0     0.0     0.0     0.0  PageOut       0  PAGING SPACE
                                                Sios          0  Size,MB    4096
Name            PID  CPU%  PgSp Owner                            % Used      0.5
topas        156220   0.2   2.5 root            NFS (calls/sec)  % Free     99.4
sldf          96772   0.2   0.2 rds             ServerV2       0
syncd         12458   0.0   0.6 root            ClientV2       0   Press:
lrud           9030   0.0   0.0 root            ServerV3       0   "h" for help
gil           10320   0.0   0.1 root            ClientV3       0   "q" to quit

PAGING 列(如清單 6 中以粗體顯示的內容)顯示根本不存在分頁。

那麼如何維護分頁空間的大小呢?在 AIX 中,您可以使用 swap 命令(請參見 清單 7)來完成這項任務。


清單 7. 使用 swap 命令
# swap -l
device              maj,min     total       free
/dev/hd6            10,  2      4096MB      4093MB

其結果說明,系統中定義了一個交換分割槽。您還將注意到,其中只使用了 3MB 的空間。清單 8 顯示了當分頁空間利用率過高時會發生什麼樣的情況。


清單 8. 耗盡了分頁空間
# lsps -a

Page Space      Physical Volume   Volume Group    Size %Used Active  Auto  Type
hd6             hdisk0            rootvg        4096MB    78    yes   yes   lv

在這個示例中,您的分頁空間變得很低,以至於可能出現危險。您的系統從啟動到現在可能已經很長時間了。如果您執行資料庫(如 Oracle),那麼直到您清空資料庫快取,才會釋放虛擬記憶體。讓我們來檢視一下您的系統啟動了多長時間了(請參見清單 9)。


清單 9. 使用 uptime 命令
# uptime
  11:58AM   up 9 days,  15:50,  23 users,  load average: 0.00, 0.03, 0.04

清單 9 中所示,這個系統才啟動了 9 天。如果在這麼短的時間內,分頁空間利用率就增加到百分之七十八,那麼您應該考慮新增更多的分頁空間。如果您的系統中還有足夠的空間,可以新增另一個分割槽。

一個最佳實踐是,請記住保持分頁空間的大小相同。在這個示例中,我會新增另一個 4GB 的分頁空間到 rootvg 卷。您可以使用系統管理工具 (SMIT) 來完成這項任務,並使用 smit mkpssmit swapon 命令以啟用分頁空間。或者,您可以從命令列使用 swapon(包括 swapoff)命令。如果可以,請使用最少被分頁區域所使用的磁碟。另外,可以嘗試不要為每個物理磁碟分配多個分頁邏輯卷。儘管有些管理員並不介意將分頁空間放到外部儲存中,但是我個人並不推崇這種做法。如果您採取了這種方式,並且外部儲存直到重新啟動之後才可用,那麼您的系統可能會出現崩潰(這取決於所分配的分頁空間的大小)。如果可以,請將它們分散到多個磁碟,並且使用 lsps -a 命令確保它們是聯機的。

您的系統究竟需要多大的分頁空間呢?其基本原則是什麼呢?首先,從提供應用程式的組織開始。DB2® 或者 Oracle 團隊應該可以告訴您,從資料庫的角度來看,系統究竟需要分配多大的分頁空間。如果是一家小型的公司,您就不得不自己研究確定。請多加小心。資料庫管理員通常會提出最大的需求,並且告訴您將分頁空間的大小設定為您的 RAM 的兩倍(以前的基本原則)。通常來說,如果我的系統擁有超過 4GB 的記憶體,我會按照 RAM 的大小來建立分頁空間。在投入執行後,要經常監視您的系統。如果您看到分頁空間的利用率從來都沒有接近過百分之五十,那麼就不需要新增額外的空間。您可以檢視最近 Oracle 為 AIX 提供的文件(請參見參考資料部分),以證實這個基本原則。其中說明了,分頁空間的推薦初始設定為 RAM 大小的一半加上 4GB,但是上限為 32GB。它推薦使用 lsps -a 命令監視系統中空間使用率超過百分之二十五的情況。新增根本不會用到的額外空間,是毫無意義的。

經常有人問我,如何判斷某個程式是否正在使用分頁空間?可以檢視一下 svmon 的輸出,如清單 10 中所示。


清單 10. 使用 svmon
# svmon -P | grep -p 17602
-------------------------------------------------------------------------------
     Pid Command          Inuse      Pin     Pgsp  Virtual 64-bit Mthrd LPage
   17602 sendmail         11877     3211        0    11691      N     N     N

在確定了 PID 數值之後,可以使用 svmon 進一步深入研究。這樣可以幫助您確定是否需要對您的應用程式進行優化,從而幫助停止分頁或者優化您的作業系統。對 svmon 執行 man 命令,因為這個 AIX 記憶體特定的實用工具還有許多其他的用途。

使用 vmo 進行優化

在這個部分中,我使用 vmo 來優化分頁引數,這可以極大地降低系統中的分頁次數。我還介紹了一些需要更改的閾值和引數,它們會影響您的整體掃描開銷。

您可以對 VMM 進行哪些優化工作來減少分頁呢?在本系列的第一期文章中(請參見參考資料部分),我曾詳細地介紹了 minpermmaxperm 引數,在本文中,我將對一些最重要的概念進行總結。在優化 vmo 設定的過程中,可以偏重於工作儲存或者持久儲存。通常,您希望偏重於工作儲存。防止 AIX 調出工作儲存並充分利用資料庫快取的方法是,將 maxperm 設定為一個較高的值(大於 80),並確保 lru_file_repage=0 參數列示是否應該考慮 VMM 重分頁計數,以及它應該替換何種型別的記憶體。其預設設定為 1,所以您需要將其更改為 0。可以使用 vmo 命令來完成這項工作。當您將該引數設定為 0 時,它會告訴 VMM,您希望僅替換檔案頁面,而不是計算頁面。這正是您所希望的。您還需要設定 minpermmaxpermmaxclient 引數,如下面的清單 11 所示。


清單 11. 設定 minperm、maxperm 和 maxclient 引數
vmo -p -o minperm%=5
vmo -p -o maxperm%=90
vmo -p -o maxclient%=90

在以前的 AIX 版本中,您可以對 strict_maxpermstrict_maxclient 的預設值進行優化。在 AIX Version 5.3 中,更改 lru_file_repage 引數是一種更加有效的優化方法,因為您希望不要使用 AIX 檔案快取。現在,讓我們簡要地總結一下 minfreemaxfree。如果空閒列表中的頁面數低於 minfree 引數,VMM 開始替換頁面,直到空閒列表至少包含 maxfree 引數中指定的頁面數。AIX Version 5.3 中的預設設定通常可以正常工作(請參見清單 12)。


清單 12. maxfree 和 minfree 的預設設定
# vmo -a | grep free
              maxfree = 1088
              minfree = 960

讓我們來介紹一些優化頁面空間的閾值。如前所述,當您的分頁空間開始變得很低時,系統將會警告破壞性的程式,然後終止它們。更改哪些閾值可以影響這項活動呢?這些閾值分別是 npswarenpskillnokilluidNpswarn 是當空間變得較低時用於通知程式的閾值。Npskill 是 AIX 開始終止程式的閾值。如果您的策略是早頁面空間分配策略,它將不會終止程式。如果您還記得,我曾提到過,這是最可靠的分頁方法。Nokillid 是一個非常重要的閾值,因為如果它設定為 1,那麼它將確保不會終止 root 所擁有的程式,即使達到了 npskill 閾值。

而且,當因為分頁空間的問題使得程式不能通過 fork 系統呼叫來建立子程式時,排程程式將重新嘗試為其建立子程式,共重試五次,每次重試之間延遲十個時鐘週期。您可以更改 schedo 引數以增加或者減少嘗試的次數。用於這項任務的引數是 pacefork 值。您可以檢視的另一個重要引數是 lrubucket。對這個引數進行優化,可以降低掃描開銷。在對擁有大量記憶體的系統進行掃描時,因為頁面置換演算法始終查詢空閒幀,所以需要掃描的頁幀的數目是非常重要的。增加這個值可以減少需要掃描的桶數。這樣做可以幫助提高效能。清單 13 使用了帶 -a 選項的 vmo 命令,以顯示 lrubucket 的值。


清單 13. 顯示 lrubucket 的值
# vmo -a | grep lru
      lru_file_repage = 1
    lru_poll_interval = 0
            lrubucket = 131072 (this is in 4 KB frames)

要將其預設值從 512MB 增加到 1GB,可以使用 # vmo -o lrubucket=262144

您可以通過這種方式使用 vmo 來降低 AIX 系統中的分頁。

總結

本系列文章的第 3 部分介紹了一些用於捕獲資料進行交換分析的工具。您使用了一些系統管理命令來顯示和配置系統中的交換引數,並且瞭解了有關分頁和交換的概念、以及 AIX 中可用於分頁的各種方法。您還看到了一些對系統的分頁空間進行配置的最佳實踐。最後,您學習了優化 VMM 以處理分頁和交換的特定方法。本系列文章的第 1 部分第 2 部分詳細地介紹了 VMM 以及如何對記憶體瓶頸進行故障診斷。您使用了各種工具幫助監視系統,以便進行短期和長期的分析。您還了解了通用優化方法的所有內容,以及在出現瓶頸前對系統進行監視的重要性。這使得您能夠在系統正常執行時建立基準資料,以便可以使用本系列文章中所介紹的方法,包括優化您的記憶體子系統。請確保在將更改部署到生產環境之前,在開發或測試環境中對它們進行測試。

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

相關文章