AIX 5L 記憶體效能優化,第 3 部分
獲得關於交換(分頁)空間的概述,瞭解如何配置和管理它,捕獲統計資料,優化您的虛擬記憶體管理器 (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 mkps 和 smit 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 來優化分頁引數,這可以極大地降低系統中的分頁次數。我還介紹了一些需要更改的閾值和引數,它們會影響您的整體掃描開銷。
您可以對 VMM 進行哪些優化工作來減少分頁呢?在本系列的第一期文章中(請參見參考資料部分),我曾詳細地介紹了 minperm 和 maxperm 引數,在本文中,我將對一些最重要的概念進行總結。在優化 vmo 設定的過程中,可以偏重於工作儲存或者持久儲存。通常,您希望偏重於工作儲存。防止 AIX 調出工作儲存並充分利用資料庫快取的方法是,將 maxperm 設定為一個較高的值(大於 80),並確保 lru_file_repage=0 參數列示是否應該考慮 VMM 重分頁計數,以及它應該替換何種型別的記憶體。其預設設定為 1,所以您需要將其更改為 0。可以使用 vmo 命令來完成這項工作。當您將該引數設定為 0 時,它會告訴 VMM,您希望僅替換檔案頁面,而不是計算頁面。這正是您所希望的。您還需要設定 minperm、maxperm 和 maxclient 引數,如下面的清單 11 所示。
清單 11. 設定 minperm、maxperm 和 maxclient 引數
vmo -p -o minperm%=5 vmo -p -o maxperm%=90 vmo -p -o maxclient%=90 |
在以前的 AIX 版本中,您可以對 strict_maxperm 和 strict_maxclient 的預設值進行優化。在 AIX Version 5.3 中,更改 lru_file_repage 引數是一種更加有效的優化方法,因為您希望不要使用 AIX 檔案快取。現在,讓我們簡要地總結一下 minfree 和 maxfree。如果空閒列表中的頁面數低於 minfree 引數,VMM 開始替換頁面,直到空閒列表至少包含 maxfree 引數中指定的頁面數。AIX Version 5.3 中的預設設定通常可以正常工作(請參見清單 12)。
清單 12. maxfree 和 minfree 的預設設定
# vmo -a | grep free maxfree = 1088 minfree = 960 |
讓我們來介紹一些優化頁面空間的閾值。如前所述,當您的分頁空間開始變得很低時,系統將會警告破壞性的程式,然後終止它們。更改哪些閾值可以影響這項活動呢?這些閾值分別是 npsware、npskill 和 nokilluid。Npswarn 是當空間變得較低時用於通知程式的閾值。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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android 效能優化之記憶體優化Android優化記憶體
- Android效能優化篇之記憶體優化--記憶體洩漏Android優化記憶體
- 【AIX】記憶體AI記憶體
- iOS 使用Instruments優化記憶體效能iOS優化記憶體
- Linux 效能優化之 記憶體 篇Linux優化記憶體
- android效能評測與優化-記憶體Android優化記憶體
- Spark效能優化:診斷記憶體的消耗Spark優化記憶體
- Linux效能優化實戰記憶體篇(五)Linux優化記憶體
- Linux效能優化:記憶體使用情況分析Linux優化記憶體
- Android深度效能優化--記憶體優化(一篇就夠)Android優化記憶體
- Android效能優化,Startalk會話頁GIF記憶體優化實踐Android優化會話記憶體
- 效能優化——記憶體洩漏(1)入門篇優化記憶體
- Android記憶體優化Android記憶體優化
- Android效能優化:手把手帶你全面實現記憶體優化Android優化記憶體
- 關於redis記憶體分析,記憶體優化Redis記憶體優化
- 記憶體洩漏與排查流程——安卓效能優化記憶體安卓優化
- iOS效能優化 - 工具Instruments之Leaks記憶體洩漏iOS優化記憶體
- 效能優化-記憶體池的設計和實現優化記憶體
- 效能優化 | Go Ballast 讓記憶體控制更加絲滑優化GoAST記憶體
- JVM | 第1部分:自動記憶體管理與效能調優《深入理解 Java 虛擬機器》JVM記憶體Java虛擬機
- JVM效能調優,記憶體分析工具JVM記憶體
- 記憶體優化相關記憶體優化
- Android Note - 記憶體優化Android記憶體優化
- 1.記憶體優化(一)記憶體洩漏記憶體優化
- 實踐App記憶體優化:如何有序地做記憶體分析與優化APP記憶體優化
- Android記憶體優化之圖片優化Android記憶體優化
- 效能調優(cpu/IO/JVM記憶體分析)JVM記憶體
- JNI記憶體管理及優化記憶體優化
- mariadb 記憶體佔用優化記憶體優化
- iOS圖片記憶體優化iOS記憶體優化
- App記憶體優化-實踐APP記憶體優化
- 淺談Android記憶體優化Android記憶體優化
- Android記憶體優化全解析Android記憶體優化
- Redis-記憶體優化(一)Redis記憶體優化
- (2)Linux效能調優之Linux記憶體體系Linux記憶體
- 前端效能和載入體驗優化實踐(附:PWA、離線包、記憶體優化、預渲染)前端優化記憶體
- Unity效能最佳化記憶體最佳化Unity記憶體
- win10怎麼優化記憶體 win10系統記憶體優化的方法Win10優化記憶體
- 2.記憶體優化(二)優化分析記憶體優化