3)Linux I/O分類
Linux I/O分類請參見表3-12所示,
表3-12 Linux I/O分類
分類标準 | 分類名 | 解釋 | 縮寫 |
---|---|---|---|
是否利用作業系統的頁緩存 | 直接I/O | 讀寫操作<—>檔案系統來通路檔案 | |
非直接I/O | 讀寫操作<—>系統的頁緩存<—>寫入磁盤 | ||
是否等待響應結果 | 裸I/O | 跳過檔案系統,直接通路磁盤 | O_DIRECT |
同步I/O | 等到整個I/O完成後才獲得I/O響應 | O_SYNC | |
異步I/O | 不用等待完成和完成後的響應,完成後以通知的方式告知 | O_ASYNC | |
是否利用标準庫緩存 | 緩沖I/O | 用标準庫(資料<—>流緩存區<—>核心緩存區<—>磁盤) | Buffered I/O |
非緩沖I/O | 不用标準庫(資料<—>核心緩存區<—>磁盤) | NoBuffered I/O | |
是否阻塞自身的運作 | 阻塞I/O | 沒有獲得響應,就會阻塞目前的程序 | O_BLOCK |
非阻塞I/O | 沒有獲得響應,不會阻塞目前的程序,通過輪詢 | O_NONBLOCK |
下面對這幾種分類。
•緩沖I/O。
緩沖I/O是指通過标準庫緩存來加速檔案的通路,而标準庫内部再通過系統排程通路檔案。帶緩存I/O也叫标準I/O,它符合ANSI C的标準I/O處理,是不依賴系統核心的,是以移植性是比較強的,在使用标準I/O操作的時候為了減少對read()、write()系統調用次數,帶緩存I/O就是在使用者層再建立一個緩存區,這個緩存區的配置設定和優化長度等細節都是标準I/O庫處理好的,使用者不用去關心。
•非緩沖 I/O。
非緩沖 I/O是指直接通過系統調用來通路檔案,不再經過标準庫緩存。它不是直接對磁盤檔案進行讀取操作,比如read()、write()函數,都屬于系統調用,在使用者層是沒有緩存的,是以稱作無緩存I/O。但對于核心而言,還是進行了緩存,隻是使用者層看不到。
•阻塞I/O。
阻塞I/O程序發起請求後,如果核心沒有準備好資料,程序就會被block住,進入等待階段,一旦等待核心将資料準備好,傳回資料,解除阻塞。
•非阻塞I/O。
非阻塞I/O程序發起請求後,如果核心沒有準備好資料,直接傳回一個error資訊,程序不需要阻塞等待,然後程序會輪詢發送請求,如此往複,一直等到核心準備好資料,才把資料拷貝并傳回給程序,結束到此輪詢。非阻塞I/O隻有是檢查無資料的時候是非阻塞的,在資料到達的時候依然要等待複制資料到使用者空間。
非阻塞又分為異步非阻塞(I/O複用)和異步非阻塞(信号驅動式I/O)。
Ø異步非阻塞(I/O複用)。
異步非阻塞(I/O複用)由Linux提供select/poll,程序通過将一個或多個fd傳遞給select或poll系統調用,阻塞在select;這樣select/poll可以幫助偵測多個fd是否就緒。但是select/poll是順序掃描fd是否就緒,并且支援的fd數量是有限的。Linux還提供了一個epoll系統調用,epoll是基于事件驅動方式的,而不是順序掃描,當有fd就緒時,立即調用函數rollback。
Ø異步非阻塞(信号驅動式I/O)。
異步非阻塞(信号驅動式I/O)是指在核心在描述符就緒時發送SIGIO信号通知程序,程序通過信号處理函數接收資料。
•同步I/O。
同步I/O是指I/O請求導緻請求程序阻塞,直到I/O操作完成。阻塞I/O模型、非阻塞I/O模型、異步非阻塞(I/O複用)、異步非阻塞(信号驅動式I/O)都屬于同步I/O
•異步I/O。
異步I/O程序是指I/O請求發生,發起請求,核心資料已經準備好,并且複制到使用者程序空間後執行事先指定好的函數。異步I/O不會導緻請求程序阻塞。隻有異步I/O模型是才是真正意義上的非阻塞I/O。
•裸I/O。
裸I/O是指不通過檔案系統,直接通路磁盤。
•直接 I/O。
直接 I/O是指不通過作業系統的頁緩存,直接跟檔案系統的互動來通路檔案。
•非直接 I/O。
非直接 I/O是指檔案讀寫的時候,先要經過系統的頁緩存,然後再由核心或額外的系統調用,真正寫入磁盤。
4)磁盤的性能名額
Linux的磁盤性能名額包括以下内容。
•使用率。
是指磁盤處理 I/O 的時間百分比。過高的使用率(比如超過 80%),通常意味着磁盤 I/O 存在性能瓶頸。
•飽和度。
是指磁盤處理 I/O 的繁忙程度。過高的飽和度,意味着磁盤存在嚴重的性能瓶頸。當飽和度為 100% 時,磁盤無法接受新的 I/O 請求。
•IOPS。(Input/Output Per Second)。
是指每秒的 I/O 請求數。多用于資料庫、大量小檔案等這類随機讀寫。
•吞吐率。
是指每秒的 I/O 請求大小。多用于多媒體等順序讀寫。
•響應時間。
是指 I/O 請求從發出到收到響應的間隔時間。
① 磁盤操作活動進行監視
對系統的磁盤操作活動進行監視需要使用iostat工具(需要安裝sysstat插件)。它的特點是彙報磁盤活動統計情況,同時也會彙報出CPU使用情況。iostat名額實際上來自/proc/diskstats。經常結合-x -d參數使用,表示顯示所有磁盤的I/O的名額。
# iostat -d -x 1
Linux 4.15.0-66-generic (ubuntu) 12/10/2019_x86_64_(4 CPU)
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_awaitaqu-sz rareq-sz wareq-sz svctm %util
loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 2.80 0.00 0.00 2.35 0.00 0.00 0.00
loop1 0.01 0.00 0.02 0.00 0.00 0.00 0.00 0.00 1.08 0.00 0.00 1.80 0.00 0.08 0.00
loop2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 5.37 0.00 0.00 2.76 0.00 0.00 0.00
loop3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 4.60 0.00 0.00 2.42 0.00 0.08 0.00
loop4 0.01 0.00 0.08 0.00 0.00 0.00 0.00 0.00 2.28 0.00 0.00 7.57 0.00 0.36 0.00
loop5 0.42 0.00 0.46 0.00 0.00 0.00 0.00 0.00 0.54 0.00 0.00 1.11 0.00 0.02 0.00
loop6 0.02 0.00 0.03 0.00 0.00 0.00 0.00 0.00 0.44 0.00 0.00 1.59 0.00 0.04 0.00
loop7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 5.17 0.00 0.00 2.83 0.00 0.00 0.00
其中參數解讀如表3-13所示。
表3-13 iostat參數
性能名額 | 含義 | 注釋 |
---|---|---|
r/s | 每秒發送給磁盤的讀請求數 | 合并後的請求數 |
w/s | 每秒發送給磁盤的寫請求數 | 合并後的請求數 |
rkB/s | 每秒從磁盤讀取的數量 | 機關(kB) |
wkB/s | 每秒從磁盤寫入的數量 | 機關(kB) |
rrqm/s | 每秒合并的讀請求數 | %rrqm表示合并的讀請求數的百分比 |
wrqm/s | 每秒合并的寫請求數 | %wrqm表示合并的寫請求數的百分比 |
r_await | 讀請求處理完成的等待時間 | 包括隊列中的等待時間和裝置實際處理的時間,機關(毫秒) |
w_await | 寫請求處理完成的等待時間 | 包括隊列中的等待時間和裝置實際處理的時間,機關(毫秒) |
apu-sz | 平均請求隊列的長度 | 舊版中為angqu-sz |
rareq-sz | 平均讀請求大小 | 機關(kB) |
wareq-sz | 平均寫請求大小 | 機關(kB) |
svctm | 處理I/O請求所需要的平均時間 | 不包含等待時間,機關(毫秒),估算值,不保證完全準确 |
%util | 磁盤處理I/O的時間百分比 | 即使用率,由于并行I/O的存在,100%不一定表明磁盤I/O飽和 |
在這裡,對應上面提到的性能名額與這裡的參數如下。
•IOPS 。即r/s+ w/s。
•吞吐量。即rkB/s+wkB/s。
•響應時間。r_await+w_await。
•使用率。%util。
iostat
Linux 4.15.0-66-generic (ubuntu) 12/10/2019_x86_64_(4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.93 0.25 0.72 0.07 0.00 98.03
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
loop0 0.00 0.00 0.00 47 0
…
•如果%iowait的值過高,表示硬碟存在I/O瓶頸。
•如果%idle值高但系統響應慢時,可能是CPU等待配置設定記憶體,應加大記憶體容量。
•如果%idle值持續低于10,表明CPU處理能力相對較低,系統中最需要解決的資源是CPU。
•%util接近100%,說明産生的I/O請求太多,I/O系統已經滿負荷。