AIX 6.1 异步 I/O 的 配置与性能评估
幾種 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。
AIO、DIO、CIO 的區別
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 = 1aio_fsfastpath = 1 |
?
三種 I/O 方式的邏輯關系如下圖:
圖 1.I/O 方式邏輯圖
?
回頁首
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 支持邏輯圖
?
AIO 對裸設備的支持邏輯圖如下(通過 FastPath 處理 I/O):
圖 3.AIO 支持邏輯圖
?
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 1 # ioo -F -a |grep -i aio_minservers aio_minservers = 3 |
| # pstat -a |grep -c kproc |wc -l 1 |
?
從上面結果可以看出,目前系統中的 AIO 請求很少,只有一個 AIO server 在運行。而 AIO server 的數量與 kproc 的數量,是一致的。
在系統中,如果 maxreqs 和 maxservers 設置的太低低,可能會造成數據庫報錯或者宕機,查看 Oracle 的 bdump 文件可以發現如下報錯:
圖 4.Oracle 報錯
?
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 性能監控
?
在上面的命令中,我采用的監控時間是 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. 參數設置建議值
| 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 用戶交流。
?
關于作者
魏新宇,任職于 IBM Adavanced Technical Skill 團隊,負責 Power 服產器產品的售前技術支持。
轉載于:https://blog.51cto.com/sjhfj/1131623
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的AIX 6.1 异步 I/O 的 配置与性能评估的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iptables的基础知识-iptabl
- 下一篇: Java内存之栈与堆