Linux 磁碟 I O是怎麼工作的

2021-10-19 23:08:50 字數 4127 閱讀 8938

通用塊層

i/o 棧

磁碟效能指標

磁碟 i/o 觀測

程序 i/o 觀測

介質分類

磁碟是可以持久化儲存的裝置,根據儲存介質的不同,可以分為兩類:機械磁碟和固態磁碟。

機械磁碟

固態磁碟

介面分類

按照介面來分類,可以把硬碟分為 ide(integrated drive electronics)、scsi(small computer system inte***ce) 、sas(serial attached scsi) 、sata(serial ata) 、fc(fibre channel) 等。不同的介面,往往分配不同的裝置名稱。

使用分類

把磁碟接入伺服器後,按照不同的使用方式,又可以把它們劃分為多種不同的架構。

磁碟組合成乙個網路儲存集群:再通過 nfs、smb、iscsi 等網路儲存協議,暴露給伺服器使用。

在 linux 中,磁碟實際上是作為乙個塊裝置來管理的,也就是以塊為單位讀寫資料,並且支援隨機讀寫。每個塊裝置都會被賦予兩個裝置號,分別是主、次裝置號。

隨機 i/o和連續 i/o

無論機械磁碟,還是固態磁碟,相同磁碟的隨機 i/o 都要比連續 i/o 慢很多。

連續 i/o 還可以通過預讀的方式,來減少 i/o 請求的次數,這也是其效能優異的乙個原因

讀寫單位

機械磁碟和固態磁碟還分別有乙個最小的讀寫單位。

如果每次都讀寫 512 位元組這麼小的單位的話,效率很低,所以檔案系統會把連續的扇區或頁,組成邏輯塊,然後以邏輯塊作為最小單元來管理資料。常見的邏輯塊的大小是4kb,也就是說,連續 8 個扇區,或者單獨乙個頁,都可以組成乙個邏輯塊。

和虛擬檔案系統 vfs 類似,為了減小不同塊裝置的差異帶來的影響,linux 通過乙個統一的通用塊層,來管理各種不同的塊裝置。

通用塊層,處在檔案系統磁碟驅動中間的乙個塊裝置抽象層,主要有兩個功能

對 i/o 請求排序的過程,也就是我們熟悉的 i/o 排程。linux 核心支援四種 i/o 排程演算法,分別是 none、noop、cfq 、 deadline

linux 儲存系統的 i/o 棧,由上到下分為三個層次,分別是檔案系統層、通用塊層和裝置層,這三個 i/o 層的關係如下圖所示,這其實也是 linux 儲存系統的 i/o 棧全景圖。

根據這張 i/o 棧的全景圖,我們可以更清楚地理解,儲存系統 i/o 的工作原理。

儲存系統的 i/o ,通常是整個系統中最慢的一環,linux 通過多種快取機制來優化 i/o 效率。

指標磁碟效能的衡量標準,使用率、飽和度、iops、吞吐量以及響應時間等。

不要孤立地去比較某一指標,要結合讀寫比例、i/o 型別(隨機還是連續)以及 i/o 的大小,綜合分析

基準測試

基準測試一般用效能測試工具 fio ,來測試磁碟的 iops、吞吐量以及響應時間等核心指標。

基準測試時,一定要注意根據應用程式 i/o 的特點來具體評估指標,就需要測試出不同 i/o 大小(一般是 512b 至 1mb 中間的若干值)分別在隨機讀、順序讀、隨機寫、順序寫等各種場景下的效能情況。

用效能工具得到的這些指標,可以作為後續分析應用程式效能的依據。一旦發生效能問題,你就可以把它們作為磁碟效能的極限值,進而評估磁碟 i/o 的使用情況。

iostat 是最常用的磁碟 i/o 效能觀測工具,它提供了每個磁碟的使用率、iops、吞吐量等各種常見的效能指標,當然,這些指標實際上來自 /proc/diskstats。

iostat 的輸出介面如下:

# -d -x 表示顯示所有磁碟 i/o 的指標

$ iostat -d -x 1

device r/s w/s rkb/s wkb/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util

loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

loop1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

第一列的 device 表示磁碟裝置的名字

在觀測指標時,也別忘了結合請求的大小( rareq-sz 和 wareq-sz)一起分析。

從 iostat 並不能直接得到磁碟飽和度,飽和度通常也沒有其他簡單的觀測方法,不過可以把觀測到的,平均請求佇列長度或者讀寫請求完成的等待時間,跟基準測試的結果(比如通過 fio)進行對比,綜合評估磁碟的飽和情況。

iostat 只提供磁碟整體的 i/o 效能資料,缺點在於,並不能知道具體是哪些程序在進行磁碟讀寫。要觀察程序的 i/o 情況,你還可以使用 pidstat 和 iotop 這兩個工具。

pidstat 加上 -d 引數,你就可以看到程序的 i/o 情況:

$ pidstat -d 1 

13:39:51 uid pid kb_rd/s kb_wr/s kb_ccwr/s iodelay command

13:39:52 102 916 0.00 4.00 0.00 0 rsyslogd

從 pidstat 的輸出你能看到,它可以實時檢視每個程序的 i/o 情況,包括下面這些內容。

根據 i/o 大小對程序排序,也是效能分析中乙個常用的方法,iotop可以按照 i/o 大小對程序排序,然後找到 i/o 較大的那些程序。

$ iotop

total disk read : 0.00 b/s | total disk write : 7.85 k/s

actual disk read: 0.00 b/s | actual disk write: 0.00 b/s

tid prio user disk read disk write swapin io> command

15055 be/3 root 0.00 b/s 7.85 k/s 0.00 % 0.00 % systemd-journald

Linux 磁碟I O是怎麼工作的

linux 磁碟i o是怎麼工作的?vfs 內部通過目錄項 索引節點 邏輯塊以及超級塊等資料結構,來管理檔案。目錄項,記錄了檔案的名字,以及檔案與其他目錄項之間的目錄關係。索引節點,記錄了檔案的元資料。邏輯塊,是由連續磁碟扇區構成的最小讀寫單元,用來儲存檔案資料。超級塊,用來記錄檔案系統整體的狀態,...

linux 高階IO 磁碟對映IO

儲存對映io 說明 在程序的棧中開闢一塊緩衝區將之與磁碟檔案相對應,對緩衝區的更改將自動寫入磁碟檔案,這樣就可以不在使用read和write的情況下執行io mmap函式 void mmap void addr,size t len,int prot,int flag,int filedes,off...

heartbeat是怎麼工作的

因為我們要提供 高可用性 所以要考慮到 導演 突然罷工的情形 因此我們要安排兩個導演,也 就是要有兩個排程伺服器節點。這兩個節點的地位不同,其中乙個是主節點,另外乙個是輔節點 可以看成是乙個 主導演 和乙個 副導演 這兩個節點正是 用heartbeat來互相監測對方的。heartbeat可以通過乙太...