本系列的三篇文章深入研究?jī)?nèi)存優(yōu)化中的參數(shù)優(yōu)化,重點(diǎn)關(guān)注于內(nèi)存性能優(yōu)化方面的各種挑戰(zhàn)和各種最佳實(shí)踐,并且還介紹了 AIX? Version 5.3 中的一些改進(jìn)。盡管與中央處理單元 (CPU) 優(yōu)化相比,實(shí)現(xiàn)內(nèi)存優(yōu)化可能更加困難,但它同樣是非常重要的。在 AIX 服務(wù)器中,與任何其他子系統(tǒng)相比,您可以對(duì)內(nèi)存進(jìn)行更多的優(yōu)化工作。更改系統(tǒng)中的某些內(nèi)存參數(shù),可以極大地提高性能,特別是在尚未對(duì)這些參數(shù)進(jìn)行優(yōu)化的運(yùn)行環(huán)境中。本系列文章的第 1 部分提供了 AIX 中內(nèi)存的概述,包括對(duì)虛擬內(nèi)存和虛擬內(nèi)存管理器 (VMM) 的介紹。
引言
作為一名系統(tǒng)管理員,您應(yīng)該已經(jīng)對(duì)有關(guān)內(nèi)存的基本知識(shí)非常熟悉,如物理和虛擬內(nèi)存之間的區(qū)別。您可能還不是很清楚 AIX? 中的虛擬內(nèi)存管理器 (VMM) 是如何工作的、以及它與性能優(yōu)化之間的關(guān)系如何。而且,在最近幾年中,有一些優(yōu)化命令和參數(shù)發(fā)生了變化,如果您較長(zhǎng)時(shí)間沒(méi)有使用 AIX 了,那么您可能會(huì)發(fā)現(xiàn),您從前所熟悉的一些命令,現(xiàn)在甚至根本無(wú)法繼續(xù)使用了。本文詳細(xì)地介紹了 AIX VMM,以及優(yōu)化 VMM 所需使用的各種優(yōu)化命令。我將介紹一些監(jiān)視工具,您可以使用這些工具來(lái)優(yōu)化您的系統(tǒng),本文還對(duì)一些比較重要的 AIX Version 5.3 內(nèi)存管理增強(qiáng)功能進(jìn)行概述。實(shí)現(xiàn)這些增強(qiáng)功能,即將其應(yīng)用到您的系統(tǒng)環(huán)境,可以在您的系統(tǒng)中優(yōu)化內(nèi)存性能。
盡管您可能會(huì)發(fā)現(xiàn),與其他的子系統(tǒng)相比,內(nèi)存的優(yōu)化更為困難一些,但是收到的效果往往更加顯著。可能還有一些應(yīng)該在您的系統(tǒng)中進(jìn)行設(shè)置的特定的優(yōu)化建議,這取決于您所運(yùn)行的系統(tǒng)的類型。為了幫助證實(shí)這些內(nèi)容,我使用了一個(gè)特定的示例,并介紹了進(jìn)行這些參數(shù)設(shè)置的一些最佳實(shí)踐。在某些情況下,動(dòng)態(tài)地優(yōu)化一個(gè)或兩個(gè)參數(shù),可能會(huì)使得您的系統(tǒng)的整體性能完全不同。
無(wú)論您需要對(duì)哪個(gè)子系統(tǒng)進(jìn)行優(yōu)化,有一個(gè)方面是相同的,即優(yōu)化系統(tǒng)—您始終應(yīng)該將其看作一個(gè)正在進(jìn)行的進(jìn)程。開(kāi)始對(duì)系統(tǒng)進(jìn)行監(jiān)視的最佳時(shí)間是當(dāng)您首次將系統(tǒng)應(yīng)用到產(chǎn)品環(huán)境中并且正常運(yùn)行時(shí),而不是等到用戶抱怨系統(tǒng)的性能非常糟糕的時(shí)候。如果您不了解系統(tǒng)正常運(yùn)行時(shí)的情況,并以此作為基準(zhǔn),那么您可能永遠(yuǎn)也無(wú)法真正地確定是否出現(xiàn)了問(wèn)題。而且,一次只應(yīng)該進(jìn)行一項(xiàng)更改,并且在進(jìn)行了更改之后,應(yīng)該盡快地捕獲相關(guān)的數(shù)據(jù)并對(duì)其進(jìn)行分析,以確定這項(xiàng)更改究竟帶來(lái)了什么不同(如果存在的話)。
內(nèi)存概述
這部分內(nèi)容提供了與 AIX 有關(guān)的內(nèi)存方面的概述。我將介紹 AIX 如何使用虛擬內(nèi)存來(lái)尋址比系統(tǒng)中物理內(nèi)存更大的內(nèi)存。我還將說(shuō)明 VMM 的工作方式以及它如何處理各種請(qǐng)求。
任何有關(guān)內(nèi)存和 AIX 的介紹都必須以對(duì) VMM 的描述作為開(kāi)始。有時(shí)候,令 AIX 新手感到困惑的是,VMM 服務(wù)如何處理系統(tǒng)中所有的內(nèi)存請(qǐng)求,而不僅僅是虛擬內(nèi)存本身。在訪問(wèn) RAM 時(shí),VMM 需要分配空間,即使是在系統(tǒng)中有足夠的物理內(nèi)存的情況下。它實(shí)現(xiàn)了分頁(yè)空間的預(yù)分配過(guò)程。使用這種方法,VMM 在幫助管理實(shí)際內(nèi)存方面扮演了重要的角色,而不僅是在虛擬內(nèi)存方面。下面來(lái)說(shuō)明它的工作原理。在 AIX 中,將所有的虛擬內(nèi)存段劃分為若干個(gè)頁(yè)面。在 AIX 中,每個(gè)頁(yè)面的缺省大小為 4KB。所分配的頁(yè)面可以位于 RAM 或者分頁(yè)空間(虛擬內(nèi)存存儲(chǔ)于磁盤(pán)上)。VMM 還維護(hù)一個(gè)稱為空閑列表 的對(duì)象,該對(duì)象定義為未分配的頁(yè)幀。它們用于處理缺頁(yè)的情況。通常存在少量未分配頁(yè)面(您可以自行配置),VMM 可以使用這些頁(yè)面來(lái)騰出空間并為其重新分配頁(yè)幀。可以使用 VMM 的頁(yè)面置換算法來(lái)選擇要重新分配頁(yè)幀的虛擬內(nèi)存頁(yè)面。這種分頁(yè)算法可以確定對(duì)當(dāng)前位于 RAM 中的哪些虛擬內(nèi)存頁(yè)面的頁(yè)幀進(jìn)行回收,并放回到空閑列表中。AIX 可以使用所有可用的內(nèi)存,除了那些配置為未分配并用做空閑列表的內(nèi)存之外。
需要重申的是,VMM 的目的是管理 RAM 和虛擬頁(yè)面的分配。由此可以看出,它的目標(biāo)是幫助最大限度地縮短缺頁(yè)響應(yīng)時(shí)間,并在可能的情況下減少虛擬內(nèi)存的使用。很顯然,假設(shè)要在 RAM 和分頁(yè)空間之間進(jìn)行選擇,在 RAM 可用的情況下,大多數(shù)人都更希望使用物理內(nèi)存。另外,VMM 還將虛擬內(nèi)存段劃分為兩種不同的類別。它們分別是,使用計(jì)算內(nèi)存的工作段和使用文件內(nèi)存的持久段。了解這兩種類別之間的區(qū)別是非常重要的,因?yàn)檫@將幫助您實(shí)現(xiàn)系統(tǒng)的最優(yōu)化。
計(jì)算內(nèi)存
當(dāng)您的進(jìn)程對(duì)計(jì)算信息進(jìn)行處理時(shí),將使用到計(jì)算內(nèi)存。這些工作段是臨時(shí)的(暫時(shí)的),并且當(dāng)進(jìn)程終止或者頁(yè)面被替換時(shí),這些工作段將不復(fù)存在。它們沒(méi)有對(duì)應(yīng)的持久磁盤(pán)存儲(chǔ)位置。在許多情況下,當(dāng)一個(gè)進(jìn)程終止時(shí),將釋放其物理和分頁(yè)空間。當(dāng)可用頁(yè)面出現(xiàn)較大的峰值時(shí),您可以在監(jiān)視系統(tǒng)的過(guò)程中發(fā)現(xiàn)這種情況。在 VMM 中,當(dāng)空閑物理內(nèi)存較少時(shí),可以將最近沒(méi)有使用的程序從 RAM 移出到分頁(yè)空間,以幫助釋放物理內(nèi)存,從而完成更多的實(shí)際工作。
文件內(nèi)存
與計(jì)算內(nèi)存不同,文件內(nèi)存使用了持久段,并在磁盤(pán)上具有持久存儲(chǔ)位置。數(shù)據(jù)文件或者可執(zhí)行程序通常都映射為持久段,而不是工作段。數(shù)據(jù)文件可能與文件系統(tǒng)相關(guān),如 JFS、JFS2 或 NFS。它們一直都位于內(nèi)存中,直到文件被卸載、頁(yè)面被替換、或者取消了到文件的鏈接。在將數(shù)據(jù)文件復(fù)制到 RAM 中之后,VMM 控制何時(shí)對(duì)這些頁(yè)面進(jìn)行覆蓋或者將其用于存儲(chǔ)其他數(shù)據(jù)。在可以選擇的情況下,大多數(shù)人更希望將文件內(nèi)存調(diào)出到磁盤(pán),而不是計(jì)算內(nèi)存。
當(dāng)進(jìn)程引用磁盤(pán)上的某個(gè)頁(yè)面時(shí),必須將其調(diào)入,而這可能會(huì)導(dǎo)致再次將其他的頁(yè)面調(diào)出。VMM 常駐內(nèi)存并在后臺(tái)運(yùn)行,嘗試替換最近沒(méi)有使用的頁(yè)幀,其中使用到前面介紹的頁(yè)面置換算法。它還可以幫助檢測(cè)系統(tǒng)顛簸,當(dāng)可用內(nèi)存量很低并且不斷地調(diào)入和調(diào)出頁(yè)面以支持任務(wù)的處理時(shí),可能會(huì)出現(xiàn)系統(tǒng)顛簸。實(shí)際上,VMM 中提供了一種內(nèi)存負(fù)載控制算法,它可以檢測(cè)系統(tǒng)是否出現(xiàn)顛簸,并嘗試去解決這種情況。如果不加以處理,系統(tǒng)顛簸可能會(huì)導(dǎo)致系統(tǒng)停滯,因?yàn)閮?nèi)核此刻過(guò)分地關(guān)注于為頁(yè)面騰出空間,而不是完成任何有實(shí)際意義的工作。
優(yōu)化
讓我們研究一些相關(guān)的工具,它們?cè)试S您對(duì) VMM 進(jìn)行優(yōu)化,從而實(shí)現(xiàn)系統(tǒng)性能的優(yōu)化。我提供了一個(gè)環(huán)境示例,其中使用了某種方法對(duì)相關(guān)的參數(shù)進(jìn)行優(yōu)化。我還介紹了一些需要注意的關(guān)鍵參數(shù)。
在 AIX 5L? 之前,您可能曾經(jīng)使用過(guò) vmtune 命令對(duì)您的 VMM 系統(tǒng)進(jìn)行優(yōu)化。盡管在 AIX Version 5.2 中提供了 vmo 命令,但 vmtune 命令也可以使用,直到 AIX Version 5.3。在 AIX Version 5.3 中,您不能夠再使用 vmtune 這一命令了。盡管有一些根本的變化您需要了解,但是大多數(shù)實(shí)際參數(shù)都是相同的。
讓我們來(lái)介紹一下 AIX 5L 中頁(yè)幀方面一項(xiàng)重要的變化。從 POWER4 處理器開(kāi)始,AIX 可以支持最大 16MB 的頁(yè)面大小。實(shí)際上,POWER5 芯片支持四種虛擬內(nèi)存頁(yè)面的大?。?KB、64KB、16MB 和 16GB。通過(guò)下面一項(xiàng)簡(jiǎn)單的 vmo 更改,您就可以對(duì)系統(tǒng)進(jìn)行優(yōu)化以提供大型的頁(yè)面,從而對(duì)于消耗大量?jī)?nèi)存的應(yīng)用程序極大地提高系統(tǒng)性能。性能之所以得到了改進(jìn),是因?yàn)樘岣吡?Translation Lookaside Buffer (TLB) 的命中率,這是因?yàn)?TLB 可以映射到更大的虛擬內(nèi)存范圍。例如 Oracle 數(shù)據(jù)庫(kù),無(wú)論是聯(lián)機(jī)事務(wù)處理 (OLTP) 或者數(shù)據(jù)倉(cāng)庫(kù)應(yīng)用程序,都可以從大型頁(yè)面的使用中獲益。這是因?yàn)?Oracle 使用了大量的虛擬內(nèi)存,特別是對(duì)于其系統(tǒng)全局區(qū) (SGA)。這里使用的示例是一個(gè)運(yùn)行 AIX Version 5.3 的 p550 LPAR 上的 Oracle 數(shù)據(jù)庫(kù)服務(wù)器。該系統(tǒng)可用于 OLTP 和數(shù)據(jù)倉(cāng)庫(kù)。
清單 1 中的命令分配了 16777216 字節(jié)以提供 128 個(gè)大型頁(yè)面。
清單 1. 分配字節(jié)
# vmo -r -o lgpg_size=16777216 lgpg_regions=128
|
最重要的 vmo 設(shè)置是 minperm 和 maxperm。將這些參數(shù)設(shè)置為適合您的系統(tǒng)的值,以確保對(duì)計(jì)算內(nèi)存或者文件內(nèi)存進(jìn)行優(yōu)化。在大多數(shù)情況下,您并不希望調(diào)出工作段,因?yàn)檫@樣做會(huì)導(dǎo)致系統(tǒng)進(jìn)行沒(méi)有必要的頁(yè)面調(diào)出,并且會(huì)降低性能。以前,它的工作方式非常簡(jiǎn)單:如果您的文件頁(yè)面 (numperm%) 大于 maxperm%,那么頁(yè)面置換算法將僅替換文件頁(yè)面。當(dāng)它小于 minperm 時(shí),可以替換文件頁(yè)面和計(jì)算頁(yè)面。如果它的值位于兩者之間,那么將僅替換文件頁(yè)面,除非重分頁(yè)的文件頁(yè)面的數(shù)目大于計(jì)算頁(yè)面。還有另一種方法,如果您的 numperm 大于 maxperm,您可以開(kāi)始替換持久的存儲(chǔ)?;谶@種方法學(xué),早期的方法是調(diào)整您的 minperm 和 maxperm 參數(shù),將 maxperm 設(shè)置得比較低(例如,<20),而將 minperm 設(shè)置為 <=10。您可以使用這種方法來(lái)優(yōu)化您的數(shù)據(jù)庫(kù)服務(wù)器。
所有的這些方法都發(fā)生了變化。新的方法將 maxperm 設(shè)置為一個(gè)比較高的值(例如,>80),并且確保將 lru_file_repage 參數(shù)設(shè)置為 0。lru_file_repage 是在帶 ML4 的 AIX Version 5.2 和 AIX Version 5.3 的 ML1 中首次引入的。這個(gè)參數(shù)說(shuō)明了是否應(yīng)該考慮 VMM 重分頁(yè)計(jì)數(shù),以及它應(yīng)該替換何種類型的內(nèi)存。其缺省設(shè)置為 1,所以您需要對(duì)它進(jìn)行更改。當(dāng)您將這個(gè)參數(shù)設(shè)置為 0 時(shí),它將告訴 VMM,您希望它僅替換文件頁(yè)面,而不是計(jì)算頁(yè)面。如果您的 numperm 小于 minperm 或者大于 maxperm,這種情況會(huì)發(fā)生變化,這正是您希望將 maxperm 設(shè)置得較高而將 minperm 設(shè)置得較低的原因。我們不應(yīng)該忘記一個(gè)事實(shí),對(duì)這個(gè)值進(jìn)行優(yōu)化的主要原因是因?yàn)槟MWo(hù)計(jì)算內(nèi)存?;氐角懊娴氖纠琌racle 使用它自己的緩存,同時(shí)使用 AIX 文件緩存,但是卻產(chǎn)生了混淆,所以您希望停止它。在這個(gè)場(chǎng)景中,如果您打算降低 maxperm,那么您將會(huì)停止正在運(yùn)行的應(yīng)用程序緩存程序。
清單 2 設(shè)置了這些關(guān)鍵的優(yōu)化參數(shù)。
清單 2. 設(shè)置優(yōu)化參數(shù)
vmo -p -o minperm%=5
vmo -p -o maxperm%=90
vmo -p -o maxclient%=90
|
盡管您已經(jīng)習(xí)慣于對(duì)這些參數(shù)進(jìn)行更改,但是現(xiàn)在,您只需保持 strict_maxperm 和 strict_maxclient 的缺省數(shù)值即可。如果將 strict_maxperm 更改為 1,那么它將會(huì)對(duì)可用于持久文件緩存的內(nèi)存量設(shè)置一個(gè)硬限制。通過(guò)將 maxperm 值作為緩存的上限,可以實(shí)現(xiàn)這一點(diǎn)?,F(xiàn)在,沒(méi)有必要這樣做,因?yàn)楦?lru_file_repage 參數(shù)是一種更加有效的優(yōu)化方法,而您并不希望使用 AIX 文件緩存。
還有兩個(gè)其他的重要參數(shù)需要說(shuō)明,它們是 minfree 和 maxfree。如果空閑列表中的頁(yè)面數(shù)降低到低于 minfree 參數(shù),那么 VMM 開(kāi)始替換頁(yè)面(只需添加到空閑列表),這樣做并不是很合適。它將繼續(xù)進(jìn)行這項(xiàng)操作,直到空閑列表至少包含 maxfree 參數(shù)中指定的頁(yè)面數(shù)。
在較早版本的 AIX 中,當(dāng)缺省 minfree 設(shè)置為 120 時(shí),通常您將會(huì)看到空閑列表為 120 或者更低,而這將導(dǎo)致進(jìn)行沒(méi)有必要的分頁(yè),更糟糕的是,會(huì)阻塞那些需要空閑幀的線程,因?yàn)檫@個(gè)值設(shè)置得過(guò)低。要解決這個(gè)問(wèn)題,在 AIX Version 5.3 中,將 minfree 和 maxfree 的缺省值分別提高到 960 和 1088。如果您正在運(yùn)行 AIX Version 5.2 或者更早的版本,我建議進(jìn)行下面的設(shè)置,您可以使用清單 3 中的命令,手動(dòng)地進(jìn)行更改。
清單 3. 手動(dòng)地設(shè)置 minfree 和 maxfree 參數(shù)
vmo -p -o minfree=960
vmo -p -o maxfree=1088
|
AIX Version 5.3 內(nèi)存方面的變化和改進(jìn)
讓我們先研究一下 AIX Version 5.3 中與內(nèi)存有關(guān)的一些最新的變化。適當(dāng)?shù)厥褂?AIX Version 5.3 中的內(nèi)存管理增強(qiáng)功能,可以幫助您高效地對(duì)系統(tǒng)進(jìn)行優(yōu)化。有關(guān)其他的方面,讓我們介紹一下頁(yè)面空間清理、動(dòng)態(tài)的 xmalloc、內(nèi)存關(guān)聯(lián)和 Watson malloc。
- 頁(yè)面空間清理:在某些情況下,這種特性允許系統(tǒng)釋放分頁(yè)空間磁盤(pán)塊,這樣一來(lái),您就不需要為給定的工作負(fù)載配置相應(yīng)的分頁(yè)空間。僅在使用延遲頁(yè)面空間分配策略時(shí),才能使用這種特性。
- 動(dòng)態(tài)的 xmalloc 調(diào)試 (xmdbg):這種特性通過(guò)改進(jìn)內(nèi)存分配的整體診斷功能,提高了系統(tǒng)的可靠性。。它允許客戶改變收集的診斷內(nèi)存量,而無(wú)需重新啟動(dòng)。
- Watson malloc:與內(nèi)存碎片的缺省實(shí)現(xiàn)相比,這種新的 malloc 子系統(tǒng)能夠快速處理一些小的請(qǐng)求。與缺省實(shí)現(xiàn) Yorktown 相比,它所消耗的內(nèi)存非常少。為了方便調(diào)試,還添加了一些新的特性,以幫助您修復(fù)各種內(nèi)存分配問(wèn)題。
- 改進(jìn)的多種頁(yè)面大小支持:正如前面在優(yōu)化部分中所介紹的,現(xiàn)在有四種不同的頁(yè)面大小可供使用。這些大小分別為:
- VMM 監(jiān)視工具:一些監(jiān)視工具,如 vmstat 和 svmon,都經(jīng)過(guò)了優(yōu)化,以便支持 POWER5 體系結(jié)構(gòu)的虛擬化功能?,F(xiàn)在,它們還支持這部分內(nèi)容中所介紹的一些改進(jìn)功能。在本系列文章的第 2 部分中,我將會(huì)詳細(xì)地介紹這些變化,使您能夠深入地了解 AIX 的各種內(nèi)存監(jiān)視工具,以確定瓶頸、以及分析歷史趨勢(shì)和數(shù)據(jù)。
- 內(nèi)存關(guān)聯(lián):對(duì)于 AIX Version 5.3,您無(wú)法禁用內(nèi)存關(guān)聯(lián),在 AIX Version 5.2 中也同樣如此。這樣做的目的是,在內(nèi)存模塊中為處理器上產(chǎn)生缺頁(yè)的進(jìn)程提供內(nèi)存分配的功能。在完成了內(nèi)存分配之后,處理器可以首先訪問(wèn)附加到其自身模塊的內(nèi)存,然后查找其他的模塊,這樣可以提高性能。要禁用 AIX Version 5.2 上的內(nèi)存關(guān)聯(lián)支持,您可以使用下面的
vmo 命令: vmo -o memory_affinity=0
您還應(yīng)該注意,不再需要在 rc.tune 中保存任何可調(diào)整的設(shè)置?,F(xiàn)在,新的方法使用 /etc/tunables,這無(wú)疑是一項(xiàng)改進(jìn)。盡管這個(gè)特性是在 AIX Version 5.2 而不是 Version 5.3 中引入的,但是仍然值得在這里進(jìn)行說(shuō)明。
總結(jié)
如前所述,在您對(duì) AIX 進(jìn)行優(yōu)化或監(jiān)視之前,您必須設(shè)置一個(gè)基準(zhǔn)。在進(jìn)行優(yōu)化之后,您必須捕獲數(shù)據(jù)并分析更改所帶來(lái)的結(jié)果。如果沒(méi)有這類信息,您將無(wú)法了解優(yōu)化工作的實(shí)際效果。在本系列文章的第 1 部分中,您了解了所有關(guān)于 AIX 的 VMM 的內(nèi)容及其工作方式。您還對(duì)一個(gè) Oracle 系統(tǒng)進(jìn)行了調(diào)整,以優(yōu)化內(nèi)存子系統(tǒng)的使用。您研究了一些重要的內(nèi)核參數(shù)、它們的用途以及如何對(duì)它們進(jìn)行優(yōu)化。在學(xué)習(xí)的過(guò)程中,您研究了近年來(lái) AIX Version 5.3 中與內(nèi)存有關(guān)的一些根本變化,包括某些參數(shù)和改進(jìn)。
第 2 部分重點(diǎn)關(guān)注于系統(tǒng)監(jiān)視的細(xì)節(jié),以確定內(nèi)存瓶頸,分析趨勢(shì)和結(jié)果。第 3 部分重點(diǎn)關(guān)注于交換空間和對(duì) VMM 進(jìn)行優(yōu)化以實(shí)現(xiàn)性能最大化的其他方法。
|