AIX幾種 IO 類型概念的介紹 .

幾種 I/O 類型概念的介紹

AIO

AIO 的全稱爲 Asynchronous I/O,即異步 I/O。在 AIO 的工作模式下,應用程序向操作系統發起 I/O 請求(讀 / 寫)以後,不必等 I/O 完成,即可發起新的 I/O 請求。通過這種方法,可以提示提升 I/O 吞吐量和性能。從 AIX5L 起,AIX 支持兩種 AIO:legacy AIO 和 POSIX AIO。AIO 既支持文件系統也支持裸設備。

DIO

AIO 的全稱爲 Direct I/O,即直接 I/O。在 DIO 的工作模式下,數據直接從磁盤傳送到應用的緩存,而不經過文件的 buffer cache。DIO 是 JFS 文件系統的一個選項,對於一些應用,如 Oracle 數據庫,它本身有自己的緩存,如果再使用文件系統緩存,反而會造成性能的下降,在這種情況下,使用 DIO 會提升一定的性能。但是,當應用有大量的順序讀 I/O 的時候,使用 DIO 的方式由於缺少讀緩存,會造成一定的性能下降。

CIO

CIO 的全稱爲 Concurrent I/O 即併發 I/O。CIO 的工作模式是建立在 DIO 模式基礎之上的。在 JFS2 的環境下,如果應用需要繞過文件系統緩存,經常會使用 CIO 模式來替代 DIO 模式。在 CIO 的工作模式下,數據會從磁盤直接傳遞到應用的緩存。從 AIX 5.2.10 開始,JFS2 支持 CIO 選項。

我們知道,在文件系統中,爲了保證數據和文件系統的一致性,需要使用 inode lock。Inode lock 保證一個文件在某一時刻,只有一個寫 I/O,並且爲了避免讀到 stale 的數據,寫的時候併發讀也是不被允許的。

而在 CIO 的工作模式下,JFS2 會繞過 inode lock,從而實現多個線程可以同時讀寫一個共享文件。而在這種情況下,數據的一致性就需要應用或數據庫來提供,如 DB2 Pure Scale、Oracle RAC。

AIODIOCIO 的區別

AIO 在 AIX6.1 中默認是打開的,它既支持文件系統,也支持裸設備。而 DIO 和 CIO 是文件系統的一個選項。我們可以在 mount 文件系統的時候,進行設置,執行命令如下 :

#mount -o dio /weixinyu 

#mount -o cio /weixinyu 

對於已經掛載的文件系統,也可以修改其 I/O 方式 :

# chfs -a options=rw,dio /weixinyu 

# chfs -a options=rw,aio /weixinyu 

DIO 與 CIO 本質上並不矛盾,均屬於“繞過文件系統緩存”的 I/O 方式。不同的是,在 DIO 的工作模式下,文件系統中的數據一致性是通過 inode lock 來實現的;而 CIO 爲了提高文件的併發讀寫性,會繞過 inode lock,讓應用來提供文件一致性鎖。

AIO 對於裸設備的支持與 CIO 對文件系統支持的方式類似,都是通過“FastPath”來實現。前者受內核參數 fastpath 控制,後者受內核參數 fsfastpath 控制。在 AIX6.1 中,這兩個參數默認都是設置爲 1。

# ioo -F -a |grep -i path 

aio_fastpath = 1

aio_fsfastpath = 1

三種 I/O 方式的邏輯關係如下圖:


 1.I/O 方式邏輯圖
1363702326_5703.jpg

AIO的參數設置與調優

AIO的兩種支持方式

在上文中我們已經提到過,AIO 既支持文件系統,也支持裸設備。在文件系統模式下,AIO 通過文件系統緩存來實現異步 I/O。在裸設備的模式下,AIO 通過“FastPath”來實現,它的作用是將原始邏輯卷直接傳遞到磁盤層的 AIO 請求。在 AIX6.1 中,這個參數是默認打開,設置爲 1。

 

# ioo -F -a |grep -i path 

aio_fastpath = 1

 

AIO 對文件系統的支持邏輯圖如下(通過 Kproc 即 AIO Server 處理 I/O)。在這種工作模式下,將會由 kproc 進程來控制 I/O 請求,而 kproc 的數量(即 AIO Server 的數量)將會決定系統處理的最多 AIO 請求的數量。


 2.AIO 支持邏輯圖
1363702371_1669.jpg

AIO 對裸設備的支持邏輯圖如下(通過 FastPath 處理 I/O):


 3.AIO 支持邏輯圖
1363702382_5270.jpg

Fastpath 不需要 AIO Server 來處理 I/O 請求,它可以減少 CPU 上下文切換,降低 CPU 開銷。

AIO的主要內核參數

在 AIX6.1 中,使用 ioo 命令可以查看與 AIO 相關的內核參數。

 

# ioo -F -a |grep -i aio 

aio_maxreqs = 131072 

aio_maxservers = 30 

aio_minservers = 3 

 

kproc 的最小值由系統參數 minservers 決定,最大值由系統參數 maxservers 決定。如果異步 I/O 請求的數量很多,就需要將 maxservers 的數值增大。由於 AIX 內核可以自動生成額外的 kproc,因此在大多數情況下,minservers 的數值不需要手動調整。需要注意的是,minservers 和 maxservers 兩個參數只對文件系統有效,對於 AIO 的裸設備模式以及 CIO 的模式是無效的,這兩種 I/O 由 FastPath 來處理,而不是 kproc。

在 AIX6.1 中,aio_maxservers 和 aio_minservers 的默認數值分別爲 30 和 3,一般認爲這兩個數值是每個 CPU 的 AIO Server 數量設置。

AIX6.1 中的 maxreqs 參數決定 AIO 系統裏可以處理最多併發 I/O 請求的數量。這個參數對於 fast path 的 I/O 類型是不起作用的。我們在調整 minservers 和 maxservers 參數時,也需要監控 maxreqs 數值。

在 AIX6.1 中,可以用如下命令查看運行的 AIO Server 的數量:

 

# pstat -a |grep -c aios |wc -l 

# ioo -F -a |grep -i aio_minservers 

aio_minservers = 3 

 

 

# pstat -a |grep -c kproc |wc -l 

 

從上面結果可以看出,目前系統中的 AIO 請求很少,只有一個 AIO server 在運行。而 AIO server 的數量與 kproc 的數量,是一致的。

在系統中,如果 maxreqs 和 maxservers 設置的太低低,可能會造成數據庫報錯或者宕機,查看 Oracle 的 bdump 文件可以發現如下報錯:


 4.Oracle 報錯
1363702401_8445.jpg

aio_server_inactivity 參數控制的是 AIO Server 的退出時間:即當 AIO server 空閒的時間超過 aio_server_inactivit 設置的數值時,AIO server 將會退出,默認這個數值默認爲 300 秒。

一般情況下,運行的 AIO Server 數量不會低於 aio_minservers 參數的設置,在上面的例子中,之所以出現 AIO Server 的數量低於 aio_minservers 參數設置的數值,是因爲該系統是一個空閒的系統,沒有任何負載和 AIO 請求。aio_server_inactivity 在 AIX6.1 中一般不需要設置。

aio_active 參數不需要設置,默認爲 0。只有當 AIO kernel extensors 被使用時,纔會變成 1。

 

# ioo -a | grep active 

aio_active = 0 

posix_aio_active = 0 

# ioo -o aio_active=1 

ioo: 1485-114 Static tunable aio_active cannot be changed 

 



如何判斷 AIO 性能問題

在 AIX 操作系統中,可以通過系統命令查看 AIO 是否存在性能問題 :

 

# iostat -A 1 3 |grep -v hdisk 

 



 5.AIO 性能監控

1363702415_5705.jpg

在上面的命令中,我採用的監控時間是 1 秒,因此下面幾個數值的描述都是“每秒”。

用紅框標註的幾個數值需要關注:

avgc: 每秒全局非 FastPath AIO 平均請求數量。如果 iostat 命令時間間隔爲 3 秒,那麼此項描述應爲:3 秒內全局非 FastPath AIO 請求的平均數量,下不贅述。

avfc: 每秒裸設備(不包括 CIO FastPath IOs)FastPath AIO 平均請求數量。

maxgc:1 秒內,非 FastPath AIO 達到的最大值。

maxfc: 1 秒內,FastPath AIO 達到的最大值。

maxreqs: 參數設定的系統最大允許的 AIO 請求數量。

在命令的輸出結果中,如果 maxgc 或 maxfc 的數值接近 maxreqs 或 maxservers 的數值,那麼就需要增大系統中 maxreqs 或 maxservers 設置。

AIO 內核參數設置的方法

在 AIX6.1 中,可以用 ioo 命令設置相關的參數。例如我們將 AIO Server 最大值設置爲 40,最小值設置爲 10:

 

# ioo -p -o aix_maxservers=40 -o aio_minservers=10 

ioo: 1485-110 Invalid tunable name aix_maxservers 

Setting aio_minservers to 10 in nextboot file 

Setting aio_minservers to 10 

 

我們將 maxreqs 的數值設置爲 666666

 

# ioo -p -o aio_maxreqs=666666 

Setting aio_maxreqs to 666666 in nextboot file 

Setting aio_maxreqs to 666666 

 

設置 fast path 參數,1 爲打開,設置爲 0 則關閉:

 

# ioo -o aio_fastpath=1  

Setting aio_fastpath to 1 

Warning: a restricted tunable has been modified 

# ioo -o aio_fsfastpath=1 

Setting aio_fsfastpath to 1 

Warning: a restricted tunable has been modified 

 

一般情況下,對於常見的應用,主要參數建議設置的數值爲:


 1. 參數設置建議值

 

 

默認值

OLTP

SAP

aio_minservers

3

200

400

aio_maxservers

10

800

1200

maxreqs

4096

16384

16384

 

回頁首

總結

AIO 在 AIX6.1 及 AIX7.1 中已默認開啓,不需要手動開啓。AIO 對於數據庫而言是很重要的,如果參數設置的不對,將會造成性能大幅下降。因此,在規劃數據庫或者進行數據庫調優時,應充分考慮到 I/O 的方式以及相關參數的設置。



參考資料

學習

·         通過參考  AIX 5L Version 6.1 System Management Concepts: Operating System and Devices ,瞭解 AIX 的更多信息。

·         AIX and UNIX 專區:developerWorks 的“AIX and UNIX 專區”提供了大量與 AIX 系統管理的所有方面相關的信息,您可以利用它們來擴展自己的 UNIX 技能。

·         AIX and UNIX 新手入門:訪問“AIX and UNIX 新手入門”頁面可瞭解更多關於 AIX 和 UNIX 的內容。

·         AIX and UNIX 專題彙總:AIX and UNIX 專區已經爲您推出了很多的技術專題,爲您總結了很多熱門的知識點。我們在後面還會繼續推出很多相關的熱門專題給您,爲了方便您的訪問,我們在這裏爲您把本專區的所有專題進行彙總,讓您更方便的找到您需要的內容。

·         AIX and UNIX 下載中心:在這裏你可以下載到可以運行在 AIX 或者是 UNIX 系統上的 IBM 服務器軟件以及工具,讓您可以提前免費試用他們的強大功能。

·         IBM Systems Magazine for AIX 中文版:本雜誌的內容更加關注於趨勢和企業級架構應用方面的內容,同時對於新興的技術、產品、應用方式等也有很深入的探討。IBM Systems Magazine 的內容都是由十分資深的業內人士撰寫的,包括 IBM 的合作伙伴、IBM 的主機工程師以及高級管理人員。所以,從這些內容中,您可以瞭解到更高層次的應用理念,讓您在選擇和應用 IBM 系統時有一個更好的認識。

討論

·         加入 developerWorks 中文社區。查看開發人員推動的博客、論壇、組和維基,並與其他 developerWorks 用戶交流。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章