|
介紹
信息傳輸過程中數(shù)據(jù)通常暫存于磁盤隊(duì)列。實(shí)驗(yàn)表明,隨著服務(wù)器性能的不斷提高,磁盤I/O隊(duì)列常常成為影響磁盤響應(yīng)速度的首要瓶頸。本文以AIX系統(tǒng)為例,描述了I/O隊(duì)列在磁盤中的工作原理、監(jiān)測命令,以及如何對其進(jìn)行優(yōu)化以提升磁盤性能。
使用I/O隊(duì)列的意義:
為何要對磁盤I/O進(jìn)行并行處理呢?主要目的是提升應(yīng)用程序的性能。這一點(diǎn)對于多物理磁盤組成的虛擬磁盤(或LUN)顯得尤為重要。如果一次提交一個(gè)I/O,雖然響應(yīng)時(shí)間較短,但系統(tǒng)的吞吐量很小。相比較而言,一次提交多個(gè)I/O既縮短了磁頭移動(dòng)距離(通過電梯算法),同時(shí)也能夠提升IOPS。假如一部電梯一次只能搭乘一人,那么每個(gè)人一但乘上電梯,就能快速達(dá)到目的地(響應(yīng)時(shí)間),但需要耗費(fèi)較長的等待時(shí)間(隊(duì)列長度)。因此一次向磁盤系統(tǒng)提交多個(gè)I/O能夠平衡吞吐量和整體響應(yīng)時(shí)間。 理論上,磁盤的IOPS取決于隊(duì)列長度÷平均IO響應(yīng)時(shí)間。假設(shè)隊(duì)列長度為3,平均IO響應(yīng)時(shí)間是10ms,則最大吞吐量是300 IOPS。
IO隊(duì)列位于何處: 以AIX系統(tǒng)為例,從應(yīng)用層到磁盤物理層的IO堆棧如下所示,IO按照從上至下的順序遍歷堆棧:
AIX在每一層堆棧都會(huì)監(jiān)測IO,因此堆棧的每一層都有IO隊(duì)列。通常,如果當(dāng)前各層執(zhí)行的IO超過了隊(duì)列長度所限制的最大數(shù)量,這些IO將暫存于等待隊(duì)列中,直至獲取申請資源。在文件系統(tǒng)層,文件系統(tǒng)緩存限制了各文件系統(tǒng)的最大可執(zhí)行IO數(shù)量。LVM設(shè)備驅(qū)動(dòng)層,可執(zhí)行的最大IO數(shù)量受hdisk緩存的限制。在SDD層,如果dpo設(shè)備的qdepth_enable屬性設(shè)置成yes,則會(huì)建立IO隊(duì)列,但也有些版本無法設(shè)置隊(duì)列。SDDPCM在將IO發(fā)送至磁盤設(shè)備驅(qū)動(dòng)層之前沒有進(jìn)行隊(duì)列處理。hdisk通過queue_depth參數(shù)設(shè)置最大響應(yīng)IO數(shù)量, 而FC適配層的參數(shù)為num_cmd_elems。磁盤子系統(tǒng)層有IO隊(duì)列,單塊物理磁盤可接收多個(gè)IO請求但一次只能處理一個(gè)IO。
IO隊(duì)列監(jiān)測命令:
以AIX為例,AIX 5.3及以上版本,可用iostat和sar –d命令監(jiān)測hdisk隊(duì)列,iostat -D命令輸出如下: hdisk6 xfer: %tm_act bps tps bread bwrtn 這里,avgwqsz是平均等待隊(duì)列長度,avgsqsz是平均響應(yīng)隊(duì)列長度。在等待隊(duì)列中花費(fèi)的平均等待時(shí)間是avgtime。sqfull值代表每秒鐘向已滿隊(duì)列提交的IO數(shù)。對于有cache的磁盤子系統(tǒng),IO響應(yīng)時(shí)間會(huì)有所不同。iostat –D命令顯示的是系統(tǒng)從啟動(dòng)后的統(tǒng)計(jì)數(shù)據(jù)。 從應(yīng)用程序的角度來看,處理IO的總時(shí)間是響應(yīng)時(shí)間加上在hdisk等待隊(duì)列中的時(shí)間。 sar –d命令輸出如下: 16:50:59 device %busy avque r w/s Kbs/s avwait avserv avwait和avserv分別是花費(fèi)在等待隊(duì)列和響應(yīng)隊(duì)列的時(shí)間,avque在AIX 5.3以上版本中,代表等待隊(duì)列中的平均IO數(shù)量。
優(yōu)化方法:
首先,不應(yīng)盲目增加以上隊(duì)列參數(shù)值。這樣有可能造成磁盤子系統(tǒng)過載或在啟動(dòng)時(shí)引起設(shè)備配置報(bào)錯(cuò)。因此,僅增加hdisk的queue_depths值并不是最好的方法,而應(yīng)該同時(shí)調(diào)整可提交最大IO數(shù)量。當(dāng)queue_depths和發(fā)送至磁盤子系統(tǒng)的IO數(shù)量同時(shí)增加時(shí),IO響應(yīng)時(shí)間可能會(huì)增加,但同時(shí)吞吐量也得到了提升。當(dāng)IO響應(yīng)時(shí)間接近磁盤超時(shí)時(shí)間,則說明所提交IO超過了磁盤能夠處理的界限。如果看到IO超時(shí)并在錯(cuò)誤日志中報(bào)出IO無法完成,說明可能有硬件問題,或需要縮短隊(duì)列。 調(diào)整queue_depths的一條法則是:對于隨機(jī)讀寫或隊(duì)列未滿的情況,如果IO響應(yīng)時(shí)間超過15ms,就不能再增加queue_depths值。一旦IO響應(yīng)時(shí)間增加,瓶頸就從磁盤和adapter隊(duì)列轉(zhuǎn)移至磁盤子系統(tǒng)。調(diào)整隊(duì)列長度應(yīng)依據(jù):1)實(shí)際應(yīng)用程序產(chǎn)生的IO請求數(shù),2)使用測試工具以觀察磁盤子系統(tǒng)的處理能力。其中,1)為主要依據(jù)。 IO隊(duì)列有以下四種狀態(tài):
我們需要把隊(duì)列調(diào)整為2或3的狀態(tài)。情況3表明瓶頸不在hdisk驅(qū)動(dòng)層,而很有可能在磁盤子系統(tǒng)自身,也有可能位于adapter驅(qū)動(dòng)層或SAN。 第4種情況是應(yīng)該避免的。受限于存儲IO請求和數(shù)據(jù)的內(nèi)存大小,所有磁盤和磁盤子系統(tǒng)都有IO執(zhí)行數(shù)量的限制。當(dāng)存儲丟失IO時(shí),主機(jī)端超時(shí),IO將被重新提交,同時(shí)等待該IO的事件將被暫停。CPU為了處理IO多做了很多事情,這種情況應(yīng)該避免。如果IO最終失敗,將會(huì)導(dǎo)致應(yīng)用程序崩潰或更嚴(yán)重的結(jié)果。所以必須仔細(xì)確認(rèn)存儲的處理極限。
合理的平均IO響應(yīng)時(shí)間:
假設(shè)隊(duì)列中沒有IO,一次讀操作將會(huì)占據(jù)0至15ms,取決于尋址時(shí)間,磁盤轉(zhuǎn)速,以及數(shù)據(jù)傳輸時(shí)間。之后數(shù)據(jù)從存儲移動(dòng)至主機(jī)。有時(shí)數(shù)據(jù)位于磁盤讀緩存,這種情況下IO響應(yīng)時(shí)間約為1ms。對于大型磁盤系統(tǒng)在正常工作狀態(tài)下,平均IO響應(yīng)時(shí)間約為5-10ms。當(dāng)隨機(jī)讀取小數(shù)據(jù)耗時(shí)超過15ms時(shí),表明存儲較為繁忙。 寫操作通常將數(shù)據(jù)寫入cache中,平均耗時(shí)不到2.5ms。但是也有例外:如果存儲同步將數(shù)據(jù)鏡像至遠(yuǎn)端,寫操作將耗費(fèi)更長時(shí)間。如果寫入數(shù)據(jù)量較大(多于64KB)則數(shù)據(jù)傳輸時(shí)間會(huì)顯著增加。沒有cache的情況下,寫時(shí)間的讀時(shí)間差不多。 如果IO是大塊順序讀寫,除了傳輸時(shí)間較長,IO會(huì)暫存于磁盤物理層隊(duì)列,IO響應(yīng)時(shí)間遠(yuǎn)高于平均值。例如:應(yīng)用提交50個(gè)IO(50個(gè)64KB順序讀),最初幾個(gè)IO會(huì)獲得較快的響應(yīng)時(shí)間,而最后一個(gè)IO必須等待其他49個(gè)完成,從而耗費(fèi)很長的響應(yīng)時(shí)間。
參考
https://community./docs/DOC-18970 https://community./thread/129131 https://community./thread/145929 應(yīng)用于
UNIX系統(tǒng) AIX系統(tǒng)
|
|
|