- 論壇徽章:
- 0
|
HP-UX緩沖區(qū)高速緩存的配置可能會(huì)令您十分困惑,您可能常常將它配置地過(guò)低或過(guò)高。了解如何保留和使用HP-UX緩沖區(qū)高速緩存將有助于您為您的應(yīng)用環(huán)境確定適合的配置。
本文將著重討論關(guān)于HP-UX緩沖區(qū)高速緩存的下述問(wèn)題:
1. 什么是緩沖區(qū)高速緩存?
2. 靜態(tài)緩沖區(qū)高速緩存與動(dòng)態(tài)緩沖區(qū)高速緩存的區(qū)別何在?
3. 緩沖區(qū)高速緩存的工作原理是怎樣的?
4. 緩沖區(qū)高速緩存及其相關(guān)結(jié)構(gòu)需要多少內(nèi)存?
5. 使用緩沖區(qū)高速緩存的利弊何在?
6. 是否可以繞過(guò)緩沖區(qū)高速緩存?
7. 配置緩沖區(qū)高速緩存應(yīng)遵循什么原則?
什么是緩沖區(qū)高速緩存?
緩沖區(qū)高速緩存是內(nèi)存中的一個(gè)區(qū)域,用于保存二級(jí)存儲(chǔ)設(shè)備中的頁(yè)。緩沖區(qū)高速緩存通過(guò)在內(nèi)存中存儲(chǔ)經(jīng)常被訪問(wèn)的頁(yè)來(lái)減少對(duì)二級(jí)存儲(chǔ)設(shè)備的訪問(wèn)。
一旦文件數(shù)據(jù)被調(diào)入內(nèi)存,就可以在內(nèi)存中進(jìn)行隨后的訪問(wèn),而無(wú)需訪問(wèn)二級(jí)存儲(chǔ)設(shè)備。
靜態(tài)與動(dòng)態(tài)緩沖區(qū)高速緩存
默認(rèn)情況下,緩沖區(qū)高速緩存是動(dòng)態(tài)的,因?yàn)樗梢愿鶕?jù)需要擴(kuò)大或縮小。要調(diào)節(jié)動(dòng)態(tài)緩沖區(qū)高速緩存,可以將內(nèi)核可調(diào)參數(shù)nbuf和bufpages設(shè)為零,并將dbc_min_pct和dbc_max_pct分別設(shè)為占用內(nèi)存的最小和最大比例。默認(rèn)值為:
dbc_max_pct 50
dbc_min_pct 5
注意:dbc_min_pct不能低于2,dbc_max_pct不能高于90。
系統(tǒng)最初啟動(dòng)時(shí),將按照dbc_min_pct的值(默認(rèn)為5%)為緩沖區(qū)頁(yè)分配相應(yīng)比例的內(nèi)存(每頁(yè)為4096個(gè)字節(jié))。系統(tǒng)還會(huì)為每2個(gè)緩沖區(qū)頁(yè)分配1個(gè)緩沖區(qū)頭指針(header)。隨著新頁(yè)不斷從磁盤(pán)調(diào)入,緩沖區(qū)高速緩存的大小將不斷增加。緩沖區(qū)高速緩存可以快速增大,達(dá)到dbc_max_pct指定的最高內(nèi)存比例。大型文件拷貝和備份會(huì)使緩沖區(qū)高速緩存迅速達(dá)到其最大值。緩沖區(qū)高速緩存增加速度非?欤挥挟(dāng)內(nèi)存需求緊張時(shí)它才會(huì)減少。
通過(guò)設(shè)置nbuf或bufpages可將靜態(tài)緩沖區(qū)高速緩存的大小配置為固定值。設(shè)定nbuf的值可以指定應(yīng)分配的緩沖區(qū)頭指針的數(shù)量。系統(tǒng)將為每個(gè)緩沖區(qū)頭指針?lè)峙鋬蓚(gè)緩沖區(qū)頁(yè),緩沖區(qū)頁(yè)總量為nbuf*2。如果設(shè)置了bufpages內(nèi)核參數(shù),且nbuf為0,那么緩沖區(qū)頁(yè)的頁(yè)數(shù)將被賦值給bufpages,每2個(gè)緩沖區(qū)頁(yè)將分配到一個(gè)緩沖區(qū)頭指針,緩沖區(qū)頭指針的總量為bufpages/2個(gè)。如果同時(shí)設(shè)置了nbuf和bufpages的值,那么nbuf就用于調(diào)節(jié)緩沖區(qū)高速緩存的大小。
另外,將dbc_min_pct和dbc_max_pct設(shè)為相同值也可以對(duì)靜態(tài)緩沖區(qū)高速緩存進(jìn)行配置。
靜態(tài)和動(dòng)態(tài)緩沖區(qū)高速緩存都存在折衷。如果出現(xiàn)內(nèi)存需求緊張,靜態(tài)緩沖區(qū)高速緩存無(wú)法減少,很可能會(huì)造成比較重要的頁(yè)被換出或者進(jìn)程被釋放。相比之下,在管理動(dòng)態(tài)緩沖區(qū)高速緩存(如緩沖區(qū)的動(dòng)態(tài)分配)以及管理緩沖區(qū)高速緩存地址映像或緩沖區(qū)高速緩存虛擬位圖(bufmap和bcvmap將在以下章節(jié)進(jìn)行詳細(xì)討論)方面存在一些系統(tǒng)開(kāi)銷(xiāo)。另外,動(dòng)態(tài)緩沖區(qū)高速緩存的增加速度非常快,但降低速度非常慢,只有當(dāng)內(nèi)存需求緊張時(shí)它才會(huì)釋放空間。
緩沖區(qū)高速緩存的工作原理
緩沖區(qū)高速緩存的主要部分有緩沖區(qū)高速緩存哈希表、緩沖區(qū)頭指針和緩沖區(qū)頁(yè)。我們至少要為實(shí)際緩沖區(qū)的每個(gè)緩沖區(qū)頭指針?lè)峙?個(gè)頁(yè),即使緩沖區(qū)的大小只有1kb。緩沖區(qū)最大為64kb。當(dāng)需要磁盤(pán)上的數(shù)據(jù)時(shí),我們可以利用塊設(shè)備(特別是塊設(shè)備的vnode地址)和塊號(hào)來(lái)計(jì)算哈希索引,并將其存入緩沖區(qū)高速緩存哈希表,該表存放的是一系列緩沖區(qū)高速緩存哈希頭指針。緩沖區(qū)高速緩存哈希頭指針將指向一個(gè)緩沖區(qū)鏈表,這些緩沖區(qū)的塊設(shè)備和塊號(hào)映射到同一哈希頭指針。
如果要從一臺(tái)設(shè)備訪問(wèn)一個(gè)塊,而它不在相應(yīng)的哈希鏈中,這時(shí)就會(huì)出現(xiàn)緩沖區(qū)高速緩存故障,并發(fā)生以下兩種情形之一:
1. 分配一個(gè)新緩沖區(qū)(如果使用的是動(dòng)態(tài)緩沖區(qū)高速緩存)。必須從磁盤(pán)讀入數(shù)據(jù)。
2. 重復(fù)使用現(xiàn)有緩沖區(qū)(如果使用的是靜態(tài)緩沖區(qū)高速緩存,或者該緩沖區(qū)高速緩存已經(jīng)達(dá)到dbc_max_pct值),必須從磁盤(pán)讀入數(shù)據(jù)。重復(fù)使用的緩沖區(qū)或者是無(wú)效緩沖區(qū)(即文件已被刪除或文件系統(tǒng)已被卸載),或者是最近沒(méi)有訪問(wèn)過(guò)的緩沖區(qū)。
但如果在該緩沖區(qū)高速緩存中找到了需要訪問(wèn)的緩沖區(qū),那么無(wú)需訪問(wèn)磁盤(pán)就可以訪問(wèn)數(shù)據(jù)了。
圖表:HP-UX緩沖區(qū)高速緩存
注意:即使文件關(guān)閉后緩沖區(qū)仍保留在緩沖區(qū)高速緩存中。因此,如果一小段時(shí)間后重新打開(kāi)文件,緩沖區(qū)仍然在緩沖區(qū)高速緩存中。例如,如果您的緩沖區(qū)高速緩存大小為500 MB,當(dāng)您對(duì)一個(gè)100MB的文件執(zhí)行g(shù)rep(1)命令時(shí),系統(tǒng)在掃描文件時(shí)需要將每個(gè)數(shù)據(jù)塊都讀入緩沖區(qū)高速緩存。但隨后如果您在同一文件上再執(zhí)行g(shù)rep(1)命令,系統(tǒng)會(huì)通過(guò)緩沖區(qū)高速緩存訪問(wèn)該文件,而無(wú)需訪問(wèn)磁盤(pán)設(shè)備,即使該文件在執(zhí)行完第一次grep(1)后已經(jīng)關(guān)閉。
緩沖區(qū)高速緩存與內(nèi)存
緩沖區(qū)高速緩存占用多少內(nèi)存?這個(gè)問(wèn)題似乎很簡(jiǎn)單。如果您在12GB內(nèi)存的系統(tǒng)上將緩沖區(qū)高速緩存配置為動(dòng)態(tài)的,最高占物理內(nèi)存的10%,那么緩沖區(qū)高速緩存最大可為1.2GB。但這只是指緩沖區(qū)頁(yè)。用于管理緩沖區(qū)高速緩存的其它結(jié)構(gòu)不在此范圍之列。這些其它結(jié)構(gòu)包括:
• 緩沖區(qū)頭指針。
• 緩沖區(qū)高速緩存哈希表
• 緩沖區(qū)散列鎖(Hash Lock)
• 緩沖區(qū)高速緩存地址映像/緩沖區(qū)高速緩存虛擬映像
緩沖區(qū)頭指針
緩沖區(qū)高速緩存中的每個(gè)緩沖區(qū)都需要一個(gè)頭指針結(jié)構(gòu),用于定義塊所代表的內(nèi)容、它的使用方法及其連接方式。緩沖區(qū)頭指針長(zhǎng)度約為600字節(jié)。如果緩沖區(qū)高速緩存是固定的,則系統(tǒng)初始化時(shí)將為其分配nbuf緩沖區(qū)頭指針。如果緩沖區(qū)高速緩存是動(dòng)態(tài)的,則系統(tǒng)將根據(jù)需要為其動(dòng)態(tài)分配緩沖區(qū)頭指針。當(dāng)需要更多緩沖區(qū)頭指針時(shí),系統(tǒng)將為其分配一個(gè)內(nèi)存頁(yè),該內(nèi)存頁(yè)將被劃分為一個(gè)4K頁(yè)所能容納的最大數(shù)量的緩沖區(qū)頭指針。
緩沖區(qū)高速緩存哈希表
緩沖區(qū)高速緩存中的塊被映射,以便可以對(duì)其進(jìn)行快速訪問(wèn)。在啟動(dòng)時(shí)系統(tǒng)將計(jì)算哈希表目的數(shù)量,該數(shù)值是空閑內(nèi)存頁(yè)數(shù)的¼,不足¼按最近的2的冪數(shù)計(jì)算。因此一個(gè)12 GB內(nèi)存的系統(tǒng)大約有100萬(wàn)個(gè)哈希表目(不考慮緩沖區(qū)高速緩存配置)。一頁(yè)為4096字節(jié),因此12GB就有3145728個(gè)頁(yè)。它的¼為786432個(gè),與它最近的2的冪數(shù)即1,048,576。每個(gè)哈希頭指針為40個(gè)字節(jié),因此12GB的系統(tǒng)就應(yīng)該為緩沖區(qū)高速緩存哈希表分配40MB的內(nèi)存。
緩沖區(qū)高速緩存散列鎖
并非每個(gè)緩沖區(qū)高速緩存哈希頭指針都有一個(gè)鎖,而是多個(gè)哈希頭指針共用一個(gè)鎖。這就減少了哈希鎖需要的內(nèi)存量。以下表2詳細(xì)說(shuō)明了每個(gè)哈希鎖覆蓋的哈希鏈數(shù)量。
緩沖區(qū)高速緩存地址映像/緩沖區(qū)高速緩存虛擬映像
在HP-UX 11.00和此前的版本中,緩沖區(qū)高速緩存地址映像(實(shí)際上有2個(gè)映像 — bufmap/bufmap2。下面提到bufmap時(shí)指的是上述兩個(gè)映像)是一種資源映像,用于追蹤緩沖區(qū)高速緩存使用的虛擬地址。bufmap包含所有可用于緩沖區(qū)高速緩存的空閑地址范圍的記錄。bufmap的大小視內(nèi)存大小的不同而不同。在32位系統(tǒng)上,它約占內(nèi)存的1%,在64位操作系統(tǒng)上約占內(nèi)存的2%。
緩沖區(qū)高速緩存虛擬映像(bcvmap)是HP-UX 11.11中采用的一種位映像,代表緩沖區(qū)高速緩存中的頁(yè)。由于它是位映像(bitmap),因此其內(nèi)存需求比bufmap要低。默認(rèn)情況下,位映像的大小(單位:位)與物理內(nèi)存頁(yè)的數(shù)量*內(nèi)核可調(diào)參數(shù)bcvmap_size_factor(默認(rèn)值為2)一致。管理位映像組需要一些系統(tǒng)開(kāi)銷(xiāo),但總的來(lái)說(shuō),內(nèi)存使用量非常小。
bcvmap_size_factor的默認(rèn)值2適用于許多系統(tǒng),尤其是將dbc_max_pct值設(shè)為20或更低的系統(tǒng)。但當(dāng)使用動(dòng)態(tài)緩沖區(qū)高速緩存時(shí),各種大小的緩沖區(qū)可以根據(jù)需要隨時(shí)分配和釋放。大小可變的緩沖區(qū)的分配和釋放可以將bcvmap分割開(kāi)使用。如果沒(méi)有任何位映像區(qū)域可以用來(lái)表示所需的緩沖區(qū)大小,那么系統(tǒng)可能會(huì)震蕩(thrash)。這種現(xiàn)象在dbc_max_pct配置為50%或更高的系統(tǒng)上較為常見(jiàn),在使用不同大小的緩沖區(qū)的系統(tǒng)上也比較常見(jiàn)。在下述情況下可以使用大小不同的緩沖區(qū):當(dāng)使用數(shù)據(jù)塊大小不同的多個(gè)HFS文件系統(tǒng)或使用多個(gè)JFS文件系統(tǒng)時(shí),其中部分文件系統(tǒng)將max_buf_data_size設(shè)為8 KB,而其他文件系統(tǒng)將max_buf_data_size設(shè)為64 KB。在這種高速緩存中,bcvmap_size_factor應(yīng)至少增加到16。
參見(jiàn)vxtunefs(1M),了解關(guān)于max_buf_data_size的更多信息。
注意:bcvmap_size_factor參數(shù)僅用于安裝了PHKL_27808的64位11.11系統(tǒng)。
下表提供的部分實(shí)例列舉了具有不同內(nèi)存大小、不同可調(diào)參數(shù)值的系統(tǒng)的內(nèi)存需求。
系統(tǒng)內(nèi)存大小 10% BufPages/緩沖區(qū)頭指針 20%BufPages/緩沖區(qū)頭指針 50%BufPages/緩沖區(qū)頭指針
1GB 100MB/7.3MB 200MB/15MB 500MB/36MB
2GB 200MB/15MB 400MB/30MB 1GB/75MB
4GB 400MB/30MB 800MB/60MB 2GB/150MB
8GB 800MB/60MB 1.6GB/120MB 4GB/300MB
12GB 1.2GB/90MB 2.4GB/180MB 6GB/450MB
32GB 3.2GB/240MB 6.4GB/480MB 16GB/1.2GB
256GB 25.6GB/2GB 51GB/4GB 128GB/9.6GB
系統(tǒng)內(nèi)存大小 哈希表大小 每個(gè)鎖的哈希表目數(shù)量 哈希表內(nèi)存需求
1GB 65536 512 2.5MB
2GB 131072 1024 5MB
4GB 262144 2048 10MB
8GB 524288 4096 20MB
12GB 1048576 8192 40MB
32GB 2097152 16384 80MB
256GB 16777216 131072 640MB
緩沖區(qū)高速緩存的優(yōu)勢(shì)
采用緩沖區(qū)高速緩存有以下幾大優(yōu)勢(shì)。
1. 順序I/O很少。應(yīng)用通過(guò)各種不同大小的請(qǐng)求從文件系統(tǒng)讀取數(shù)據(jù),這些請(qǐng)求可能與實(shí)際的文件系統(tǒng)塊大小不一致。沒(méi)有緩沖區(qū)高速緩存的話,每次請(qǐng)求都必須到物理磁盤(pán)中訪問(wèn)整個(gè)磁盤(pán)塊,即使它們需要的容量可能只有幾個(gè)字節(jié)。如果下一次讀操作是讀取同一個(gè)物理磁盤(pán)塊,那么系統(tǒng)就需要再次讀入該磁盤(pán)塊,因?yàn)樗鼪](méi)有保存。但如果有緩沖區(qū)高速緩存,第一次讀是與磁盤(pán)之間進(jìn)行物理I/O,但接下來(lái)對(duì)同一磁盤(pán)塊的讀操作就可以通過(guò)緩沖區(qū)高速緩存來(lái)完成了。
2. 預(yù)讀。如果文件系統(tǒng)的訪問(wèn)是順序的,那么緩沖區(qū)高速緩存將通過(guò)預(yù)讀來(lái)提高性能。當(dāng)文件系統(tǒng)檢測(cè)到對(duì)文件的順序訪問(wèn)時(shí),就開(kāi)始對(duì)后面的塊進(jìn)行異步讀。ㄒ脖环Q(chēng)為預(yù)。,因此當(dāng)應(yīng)用對(duì)數(shù)據(jù)發(fā)出請(qǐng)求時(shí)該數(shù)據(jù)可能已經(jīng)在(或者正在傳輸中)緩沖區(qū)高速緩存中了。
在HFS文件系統(tǒng)中,一般的順序讀取通過(guò)系統(tǒng)可調(diào)參數(shù)hfs_ra_per_disk來(lái)配置。如果使用LVM條帶化,我們可以將hfs_ra_per_disk的值與條帶的數(shù)量相乘。
在JFS 3.1文件系統(tǒng)中,順序預(yù)讀剛開(kāi)始時(shí)讀取數(shù)據(jù)很少,隨著順序訪問(wèn)的不斷進(jìn)行,JFS預(yù)讀的數(shù)據(jù)越來(lái)越多。
在JFS 3.3/3.5中,預(yù)讀區(qū)域是文件系統(tǒng)可調(diào)參數(shù)read_pref_io和read_nstream的乘積。當(dāng)?shù)谝淮螜z測(cè)到順序訪問(wèn)時(shí),系統(tǒng)將把4倍的預(yù)讀區(qū)域讀入緩沖區(qū)高速緩存(4 * read_pref_io * read_nstream)。當(dāng)應(yīng)用完成了一個(gè)區(qū)域的讀取后,系統(tǒng)將異步預(yù)取下一區(qū)域。預(yù)讀可能非常有益于順序文件存取。但通常進(jìn)行隨機(jī)I/O操作的應(yīng)用可能會(huì)偶爾讀取連續(xù)的數(shù)據(jù)塊,從而無(wú)意中產(chǎn)生大量的預(yù)讀數(shù)據(jù)。這種情況下可能不使用預(yù)讀,因?yàn)槲募w上是隨機(jī)讀取的。
在JFS 3.3/3.5中,預(yù)讀數(shù)據(jù)的大小受vxtunefs參數(shù)read_nstream和read_pref_io的控制,在JFS3.5中可以通過(guò)將vxtunefs參數(shù)read_ahead設(shè)為0來(lái)取消預(yù)讀。在JFS 3.1中,預(yù)讀數(shù)據(jù)的大小不可調(diào)節(jié)。
3. 熱數(shù)據(jù)塊。如果應(yīng)用(單進(jìn)程或多進(jìn)程)反復(fù)讀取文件系統(tǒng)塊,則該塊將保留在緩沖區(qū)高速緩存中,因此系統(tǒng)每次需要訪問(wèn)該數(shù)據(jù)時(shí)都無(wú)需到磁盤(pán)中讀取。當(dāng)應(yīng)用反復(fù)搜索一個(gè)大型目錄(可能要?jiǎng)?chuàng)建一個(gè)臨時(shí)文件)時(shí)緩沖區(qū)高速緩存尤其有用。如果經(jīng)常使用這些目錄塊,那么它們很可能會(huì)被保留在緩沖區(qū)高速緩存中,系統(tǒng)就無(wú)需訪問(wèn)物理磁盤(pán)了。
4. 延遲寫(xiě)。緩沖區(qū)高速緩存支持應(yīng)用進(jìn)行延遲或異步寫(xiě)。應(yīng)用只需將數(shù)據(jù)寫(xiě)到緩沖區(qū)高速緩存中,系統(tǒng)調(diào)用就會(huì)返回,而無(wú)需等待系統(tǒng)完成對(duì)磁盤(pán)的I/O操作。隨后系統(tǒng)會(huì)通過(guò)syncer(1M)、sync(1M)或fsync(2)等操作將臟緩沖區(qū)刷新到磁盤(pán)。進(jìn)行延遲寫(xiě)有時(shí)被稱(chēng)為后刷新(flush behind)。
使用緩沖區(qū)高速緩存的弊端
每個(gè)應(yīng)用似乎都可以從使用緩沖區(qū)高速緩存中受益,其實(shí)使用緩沖區(qū)高速緩存要付出一些代價(jià)。
1. 內(nèi)存。根據(jù)緩沖區(qū)高速緩存的配置情況,它可能會(huì)是占用內(nèi)存最厲害的。默認(rèn)情況下,在8 GB內(nèi)存的系統(tǒng)中,僅緩沖區(qū)高速緩存頁(yè)就會(huì)占去4 GB的內(nèi)存(dbc_max_pct設(shè)為50)。即使采用動(dòng)態(tài)緩沖區(qū)高速緩存,大容量的緩沖區(qū)高速緩存也可能導(dǎo)致總的內(nèi)存需求緊張。記住,除非內(nèi)存出現(xiàn)需求緊張,否則緩沖區(qū)高速緩存不會(huì)釋放緩沖區(qū)頁(yè)。一旦出現(xiàn)內(nèi)存緊張,緩沖區(qū)頁(yè)就像其它用戶(hù)頁(yè)一樣從時(shí)間最長(zhǎng)的開(kāi)始被侵占,因此它的減小速度比擴(kuò)張速度要慢得多。
2. 刷新緩沖區(qū)高速緩存。
Syncer — syncer(1M)是將延遲寫(xiě)緩沖區(qū)刷新至物理磁盤(pán)的進(jìn)程。當(dāng)然,緩沖區(qū)高速緩存越大,syncer就可能完成越多工作。11.0 syncer是單線程進(jìn)程。它定時(shí)被喚醒,并順序掃描整個(gè)緩沖區(qū)高速緩存,以查找需要寫(xiě)到物理設(shè)備上的數(shù)據(jù)塊。默認(rèn)的syncer間隔為30秒,也就是說(shuō)每隔30秒,系統(tǒng)就會(huì)對(duì)整個(gè)緩沖區(qū)高速緩存進(jìn)行掃描,以查找延遲寫(xiě)數(shù)據(jù)塊。實(shí)際上在每次syncer間隔中syncer運(yùn)行5次,每次掃描1/5的緩沖區(qū)高速緩存。
HP-UX 11.11在刷新臟緩沖區(qū)時(shí)更加高效。11.11 syncer是多線程進(jìn)程,每個(gè)CPU有一個(gè)線程。每個(gè)CPU都有一個(gè)臟表(dirty list),每個(gè)syncer線程負(fù)責(zé)從其各自的臟表刷新緩沖區(qū)。這就提高了緩沖區(qū)高速緩存的縮放,因?yàn)橄到y(tǒng)只掃描臟緩沖區(qū),而且每個(gè)線程都有自己的臟緩沖區(qū)表,這就避免了對(duì)一個(gè)表的爭(zhēng)用。
其他Sync操作 — 各種系統(tǒng)操作要求在操作完成前將緩沖區(qū)高速緩存中的臟塊寫(xiě)到磁盤(pán)中。文件的最后一次關(guān)閉,文件系統(tǒng)的卸載或一次sync系統(tǒng)調(diào)用都屬于此類(lèi)操作。這些操作獨(dú)立于syncer,必須掃描整個(gè)緩沖區(qū)高速緩存,以查找需要寫(xiě)到設(shè)備的塊。對(duì)于卸載這種情形,一旦操作完成,它必須重新掃描緩沖區(qū)高速緩存,以便使刷新后的緩沖區(qū)無(wú)效。緩沖區(qū)高速緩存的這些掃描可能十分耗時(shí),尤其是當(dāng)出現(xiàn)散列鎖爭(zhēng)奪現(xiàn)象時(shí)。
3. 限制IO — 除了檢查哈希鏈和鎖定/打開(kāi)散列鎖之外,緩沖區(qū)高速緩存越大,在高速緩存中需要刷新到磁盤(pán)的臟緩沖區(qū)數(shù)量可能就越多。這可能會(huì)導(dǎo)致在sync操作過(guò)程中大量寫(xiě)I/O操作排隊(duì)等待磁盤(pán)。一個(gè)讀請(qǐng)求或異步寫(xiě)請(qǐng)求可能會(huì)滯后于寫(xiě)操作,從而引起應(yīng)用延遲。由于限制了每次排隊(duì)等待磁盤(pán)的緩沖區(qū)數(shù)量,緩沖區(qū)高速緩存的刷新速度可能會(huì)受到限制。默認(rèn)情況下,關(guān)閉限制功能。在JFS 3.1中,如果安裝了PHKL_27070,則可以通過(guò)將vx_nothrottle設(shè)置為0來(lái)啟用限制功能。這就通過(guò)sync操作(如卸載文件系統(tǒng))減輕了讀饑餓。在JFS 3.3/3.5中,從單個(gè)文件刷新到磁盤(pán)的數(shù)據(jù)量可以通過(guò)vxtunefs max_diskq參數(shù)來(lái)控制。
限制寫(xiě)操作 — 設(shè)置max_diskq來(lái)限制臟緩沖區(qū)的刷新有一個(gè)弊端。執(zhí)行sync操作的進(jìn)程(如umount(1M)或bdf(1M))可能會(huì)由于寫(xiě)操作受到限制而停止。設(shè)置max_diskq并不會(huì)阻止應(yīng)用繼續(xù)執(zhí)行異步寫(xiě)操作。如果對(duì)大型文件進(jìn)行寫(xiě),那么臟緩沖區(qū)很有可能會(huì)耗盡所有緩沖區(qū),并可能導(dǎo)致其它重要應(yīng)用的讀或?qū)懷舆t。
JFS 3.5中采用了一個(gè)新的可調(diào)參數(shù) — write_throttle.它可以控制一個(gè)文件可以容納的未完成的臟緩沖區(qū)的數(shù)量。如果一個(gè)應(yīng)用的寫(xiě)速度意欲超過(guò)數(shù)據(jù)寫(xiě)到磁盤(pán)的速度,并且達(dá)到了write_throttle的值,那么該應(yīng)用將一直等到部分?jǐn)?shù)據(jù)寫(xiě)到磁盤(pán)后,臟緩沖區(qū)中的數(shù)據(jù)量重新低于write_throttle值為止。
設(shè)置write_throttle能夠減少long sync的次數(shù),同時(shí)保持磁盤(pán)I/O隊(duì)列的可管理性。但是寫(xiě)到磁盤(pán)的應(yīng)用在其寫(xiě)數(shù)據(jù)時(shí)可能會(huì)遇到延遲。
4. 大型I/O。一個(gè)緩沖區(qū)最大可以為64 Kb。對(duì)于高于64 Kb的I/O來(lái)說(shuō),請(qǐng)求必須分解成多個(gè)64 Kb I/O。因此從磁盤(pán)讀取256 Kb的數(shù)據(jù)就需要4次I/O。但如果繞過(guò)緩沖區(qū)高速緩存,就可以直接執(zhí)行一次256 Kb I/O。
5. 只訪問(wèn)一次的數(shù)據(jù)。緩沖區(qū)高速緩存的管理需要額外的代碼和處理。對(duì)于只訪問(wèn)一次的數(shù)據(jù),使用緩沖區(qū)高速緩存在高速緩存中保存數(shù)據(jù)沒(méi)有任何好處。事實(shí)上,將只訪問(wèn)一次的數(shù)據(jù)放入高速緩存,系統(tǒng)可能需要移出那些經(jīng)常訪問(wèn)的緩沖區(qū)頁(yè)。
6. 系統(tǒng)崩潰。由于許多寫(xiě)操作都被延遲,當(dāng)系統(tǒng)崩潰時(shí),系統(tǒng)可能在緩沖區(qū)高速緩存中有許多需要刷新至磁盤(pán)的“臟”緩沖區(qū)。緩沖區(qū)高速緩存中在系統(tǒng)崩潰前沒(méi)有更新的的數(shù)據(jù)就會(huì)丟失。
繞過(guò)緩沖區(qū)高速緩存
有幾種方法可以避免I/O使用全部緩沖區(qū)高速緩存。繞過(guò)緩沖區(qū)高速緩存被稱(chēng)為直接I/O。對(duì)于下面提到的JFS特性來(lái)說(shuō),要執(zhí)行直接I/O需要HP OnlineJFS授權(quán)。
- mincache=direct,convosync=direct
在JFS文件系統(tǒng)中,如果文件系統(tǒng)在安裝時(shí)選擇了mincache=direct選項(xiàng)和/或convosync=direct選項(xiàng),那么將繞過(guò)對(duì)緩沖區(qū)高速緩存的讀寫(xiě) — 參見(jiàn)mount_vxfs(1M)的manpage,了解更多詳細(xì)信息。如果文件系統(tǒng)在安裝時(shí)選擇了這些選項(xiàng),那么所有對(duì)文件系統(tǒng)的I/O操作將繞過(guò)緩沖區(qū)高速緩存。當(dāng)繞過(guò)緩沖區(qū)高速緩存時(shí)將無(wú)法進(jìn)行預(yù)讀和延遲寫(xiě),因?yàn)闆](méi)有了中間保存區(qū)。
- ioctl (fd,VX_SETCACHE, VX_DIRECT)
在JFS文件系統(tǒng)中,該ioctl調(diào)用將把對(duì)fd引用的文件的訪問(wèn)設(shè)為直接訪問(wèn),并繞過(guò)緩沖區(qū)高速緩存。該調(diào)用僅用于fd引用的文件實(shí)例。其它打開(kāi)同一文件的應(yīng)用不受影響。參見(jiàn)vxfsio(7) manpage,了解更多信息。
-discovered direct IO
JFS提供了一種被稱(chēng)為discovered direct I/O的特性,其中超過(guò)一定大小的I/O操作使用直接I/O來(lái)完成。只進(jìn)行一次數(shù)據(jù)讀取的應(yīng)用(如備份或拷貝操作)通常執(zhí)行大型I/O。由于只進(jìn)行一次數(shù)據(jù)存取,因此將數(shù)據(jù)調(diào)入高速緩存不會(huì)帶來(lái)任何好處。將數(shù)據(jù)調(diào)入高速緩存甚至可能會(huì)帶來(lái)負(fù)面效果,因?yàn)橹辉L問(wèn)一次的數(shù)據(jù)可能會(huì)占用比較有用的緩沖區(qū)。因此,JFS文件系統(tǒng)上的大型I/O采用“直接”執(zhí)行,繞過(guò)緩沖區(qū)高速緩存。在JFS 3.1中,discovered direct I/O的大小固定為128 Kb。在JFS 3.3/3.5中,默認(rèn)的discovered direct IO的大小為256 Kb,但可以通過(guò)設(shè)置vxtunefs(1M)的discovered_direct_iosz可調(diào)參數(shù)來(lái)對(duì)其進(jìn)行設(shè)定。
-raw io
如果對(duì)數(shù)據(jù)的訪問(wèn)是通過(guò)原始設(shè)備文件,則不使用緩沖區(qū)高速緩存。
-async driver
一些數(shù)據(jù)庫(kù)使用async driver(/dev/async)來(lái)執(zhí)行異步I/O操作,而繞過(guò)緩沖區(qū)高速緩存,直接讀入共享內(nèi)存段。
HP-UX緩沖區(qū)高速緩存調(diào)節(jié)指南。
為調(diào)節(jié)緩沖區(qū)高速緩存提供指南非常困難。很多因素要取決于在系統(tǒng)上運(yùn)行的各種應(yīng)用。但我們可以提供一些一般性總結(jié)。
如果使用數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)緩沖很可能比系統(tǒng)緩沖更加高效。數(shù)據(jù)庫(kù)可能更熟悉I/O模式,從而將相關(guān)的緩沖區(qū)留在內(nèi)存中。因此如果可以選擇的話,內(nèi)存應(yīng)分配給數(shù)據(jù)庫(kù)全局區(qū),而不是系統(tǒng)緩沖區(qū)高速緩存。
我們已經(jīng)了解到HP-UX 11.11在處理大型緩沖區(qū)高速緩存方面比HP-UX 11.0更加高效!按笮汀边@一詞是相對(duì)而言的,但在本文討論中可以認(rèn)為它是指大于1 Gb或高于50%內(nèi)存的緩沖區(qū)高速緩存?傮w而言,由于大型高速緩存存在縮放問(wèn)題,11.0上的緩沖區(qū)高速緩存應(yīng)配置為1GB或更低,但可以比11.11上的大。但如果您使用的是11.11上的大型緩沖區(qū)高速緩存,那么您應(yīng)該安裝PHKL_27808或替代補(bǔ)丁,以提高緩沖區(qū)高速緩存的虛擬映像的大小。
緩沖區(qū)高速緩存越大,您的sync操作所用時(shí)間就會(huì)越長(zhǎng)。這尤其會(huì)影響文件系統(tǒng)的安裝和卸載次數(shù)。如果需要快速安裝或卸載文件系統(tǒng)(如在SG數(shù)據(jù)包交換過(guò)程中),那么可以考慮使用較小的緩沖區(qū)高速緩存。
如果緩沖區(qū)高速緩存的配置過(guò)低,那么系統(tǒng)可能會(huì)不斷搜索可用的緩沖區(qū)。在大多數(shù)系統(tǒng)上應(yīng)盡可能將緩沖區(qū)高速緩存配置為最低200MB。
最受益于大型高速緩存的應(yīng)用往往是文件服務(wù)器,如NFS或web服務(wù)器,其中大量數(shù)據(jù)經(jīng)常要被訪問(wèn)到。一些不管理自身文件存取的數(shù)據(jù)庫(kù)應(yīng)用也可能屬于這一類(lèi)。請(qǐng)與您的應(yīng)用廠商聯(lián)系,了解具體廠商的建議。
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/12951/showart_113267.html |
|