25 | 基础篇:Linux 磁盘I/O是怎么工作的(下)
生活随笔
收集整理的這篇文章主要介紹了
25 | 基础篇:Linux 磁盘I/O是怎么工作的(下)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
上一節(jié)我們學(xué)習(xí)了 Linux 磁盤(pán) I/O 的工作原理,并了解了由文件系統(tǒng)層、通用塊層和設(shè)備層構(gòu)成的 Linux 存儲(chǔ)系統(tǒng) I/O 棧。其中,通用塊層是 Linux 磁盤(pán) I/O 的核心。向上,它為文件系統(tǒng)和應(yīng)用程序,提供訪問(wèn)了塊設(shè)備的標(biāo)準(zhǔn)接口;向下,把各種異構(gòu)的磁盤(pán)設(shè)備,抽象為統(tǒng)一的塊設(shè)備,并會(huì)對(duì)文件系統(tǒng)和應(yīng)用程序發(fā)來(lái)的 I/O 請(qǐng)求,進(jìn)行重新排序、請(qǐng)求合并等,提高了磁盤(pán)訪問(wèn)的效率。掌握了磁盤(pán) I/O 的工作原理,你估計(jì)迫不及待想知道,怎么才能衡量磁盤(pán)的 I/O 性能。接下來(lái),我們就來(lái)看看,磁盤(pán)的性能指標(biāo),以及觀測(cè)這些指標(biāo)的方法。
磁盤(pán)性能指標(biāo)
說(shuō)到磁盤(pán)性能的衡量標(biāo)準(zhǔn),必須要提到五個(gè)常見(jiàn)指標(biāo),也就是我們經(jīng)常用到的,使用率、飽和度、IOPS、吞吐量以及響應(yīng)時(shí)間等。這五個(gè)指標(biāo),是衡量磁盤(pán)性能的基本指標(biāo)。- 使用率,是指磁盤(pán)處理 I/O 的時(shí)間百分比。過(guò)高的使用率(比如超過(guò) 80%),通常意味著磁盤(pán) I/O 存在性能瓶頸。
- 飽和度,是指磁盤(pán)處理 I/O 的繁忙程度。過(guò)高的飽和度,意味著磁盤(pán)存在嚴(yán)重的性能瓶頸。當(dāng)飽和度為 100% 時(shí),磁盤(pán)無(wú)法接受新的 I/O 請(qǐng)求。
- IOPS(Input/Output Per Second),是指每秒的 I/O 請(qǐng)求數(shù)。
- 吞吐量,是指每秒的 I/O 請(qǐng)求大小。
- 響應(yīng)時(shí)間,是指 I/O 請(qǐng)求從發(fā)出到收到響應(yīng)的間隔時(shí)間。
性能測(cè)試工具 fio
這一方面,我推薦用性能測(cè)試工具 fio ,來(lái)測(cè)試磁盤(pán)的 IOPS、吞吐量以及響應(yīng)時(shí)間等核心指標(biāo)。但還是那句話,因地制宜,靈活選取。在基準(zhǔn)測(cè)試時(shí),一定要注意根據(jù)應(yīng)用程序 I/O 的特點(diǎn),來(lái)具體評(píng)估指標(biāo)。當(dāng)然,這就需要你測(cè)試出,不同 I/O 大小(一般是 512B 至 1MB 中間的若干值)分別在隨機(jī)讀、順序讀、隨機(jī)寫(xiě)、順序?qū)懙雀鞣N場(chǎng)景下的性能情況。用性能工具得到的這些指標(biāo),可以作為后續(xù)分析應(yīng)用程序性能的依據(jù)。一旦發(fā)生性能問(wèn)題,你就可以把它們作為磁盤(pán)性能的極限值,進(jìn)而評(píng)估磁盤(pán) I/O 的使用情況。了解磁盤(pán)的性能指標(biāo),只是我們 I/O 性能測(cè)試的第一步。接下來(lái),又該用什么方法來(lái)觀測(cè)它們呢?這里,我給你介紹幾個(gè)常用的 I/O 性能觀測(cè)方法。磁盤(pán) I/O 觀測(cè)
第一個(gè)要觀測(cè)的,是每塊磁盤(pán)的使用情況。iostat?
iostat 是最常用的磁盤(pán) I/O 性能觀測(cè)工具,它提供了每個(gè)磁盤(pán)的使用率、IOPS、吞吐量等各種常見(jiàn)的性能指標(biāo),當(dāng)然,這些指標(biāo)實(shí)際上來(lái)自 /proc/diskstats。iostat 的輸出界面如下。# -d -x 表示顯示所有磁盤(pán) I/O 的指標(biā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從這里你可以看到,iostat 提供了非常豐富的性能指標(biāo)。第一列的 Device 表示磁盤(pán)設(shè)備的名字,其他各列指標(biāo),雖然數(shù)量較多,但是每個(gè)指標(biāo)的含義都很重要。為了方便你理解,我把它們總結(jié)成了一個(gè)表格。這些指標(biāo)中,你要注意:- %util ,就是我們前面提到的磁盤(pán) I/O 使用率;
- r/s+ w/s ,就是 IOPS;
- rkB/s+wkB/s ,就是吞吐量;
- r_await+w_await ,就是響應(yīng)時(shí)間。
進(jìn)程 I/O 觀測(cè)
除了每塊磁盤(pán)的 I/O 情況,每個(gè)進(jìn)程的 I/O 情況也是我們需要關(guān)注的重點(diǎn)。pidstat?
上面提到的 iostat 只提供磁盤(pán)整體的 I/O 性能數(shù)據(jù),缺點(diǎn)在于,并不能知道具體是哪些進(jìn)程在進(jìn)行磁盤(pán)讀寫(xiě)。要觀察進(jìn)程的 I/O 情況,你還可以使用 pidstat 和 iotop 這兩個(gè)工具。pidstat 是我們的老朋友了,這里我就不再啰嗦它的功能了。給它加上 -d 參數(shù),你就可以看到進(jìn)程的 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 的輸出你能看到,它可以實(shí)時(shí)查看每個(gè)進(jìn)程的 I/O 情況,包括下面這些內(nèi)容。- 用戶(hù) ID(UID)和進(jìn)程 ID(PID) 。
- 每秒讀取的數(shù)據(jù)大小(kB_rd/s) ,單位是 KB。
- 每秒發(fā)出的寫(xiě)請(qǐng)求數(shù)據(jù)大小(kB_wr/s) ,單位是 KB。
- 每秒取消的寫(xiě)請(qǐng)求數(shù)據(jù)大小(kB_ccwr/s) ,單位是 KB。
- 塊 I/O 延遲(iodelay),包括等待同步塊 I/O 和換入塊 I/O 結(jié)束的時(shí)間,單位是時(shí)鐘周期。
iotop
除了可以用 pidstat 實(shí)時(shí)查看,根據(jù) I/O 大小對(duì)進(jìn)程排序,也是性能分析中一個(gè)常用的方法。這一點(diǎn),我推薦另一個(gè)工具, iotop。它是一個(gè)類(lèi)似于 top 的工具,你可以按照 I/O 大小對(duì)進(jìn)程排序,然后找到 I/O 較大的那些進(jìn)程。iotop 的輸出如下所示:$ 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從這個(gè)輸出,你可以看到,前兩行分別表示,進(jìn)程的磁盤(pán)讀寫(xiě)大小總數(shù)和磁盤(pán)真實(shí)的讀寫(xiě)大小總數(shù)。因?yàn)榫彺妗⒕彌_區(qū)、I/O 合并等因素的影響,它們可能并不相等。剩下的部分,則是從各個(gè)角度來(lái)分別表示進(jìn)程的 I/O 情況,包括線程 ID、I/O 優(yōu)先級(jí)、每秒讀磁盤(pán)的大小、每秒寫(xiě)磁盤(pán)的大小、換入和等待 I/O 的時(shí)鐘百分比等。這兩個(gè)工具,是我們分析磁盤(pán) I/O 性能時(shí)最常用到的。你先了解它們的功能和指標(biāo)含義,具體的使用方法,接下來(lái)的案例實(shí)戰(zhàn)中我們一起學(xué)習(xí)。小結(jié)
今天,我們梳理了 Linux 磁盤(pán) I/O 的性能指標(biāo)和性能工具。我們通常用 IOPS、吞吐量、使用率、飽和度以及響應(yīng)時(shí)間等幾個(gè)指標(biāo),來(lái)評(píng)估磁盤(pán)的 I/O 性能。你可以用 iostat 獲得磁盤(pán)的 I/O 情況,也可以用 pidstat、iotop 等觀察進(jìn)程的 I/O 情況。不過(guò)在分析這些性能指標(biāo)時(shí),你要注意結(jié)合讀寫(xiě)比例、I/O 類(lèi)型以及 I/O 大小等,進(jìn)行綜合分析。思考最后,我想請(qǐng)你一起來(lái)聊聊,你碰到過(guò)的磁盤(pán) I/O 問(wèn)題。在碰到磁盤(pán) I/O 性能問(wèn)題時(shí),你是怎么分析和定位的呢?你可以結(jié)合今天學(xué)到的磁盤(pán) I/O 指標(biāo)和工具,以及上一節(jié)學(xué)過(guò)的磁盤(pán) I/O 原理,來(lái)總結(jié)你的思路。總結(jié)
以上是生活随笔為你收集整理的25 | 基础篇:Linux 磁盘I/O是怎么工作的(下)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 24丨基础篇:Linux磁盘I-O是怎么
- 下一篇: 09 | 基础篇:怎么理解Linux软中