6.1 磁盤I/O介紹
一般來(lái)說(shuō),Linux磁盤的每個(gè)分區(qū)要么包含一個(gè)文件系統(tǒng),要么包含一個(gè)交換分區(qū)。這些分區(qū)被掛載到Linux根文件系統(tǒng),該系統(tǒng)由/etc/fstab指定。這些被掛載的文件系統(tǒng)包含了應(yīng)用程序要讀寫的文件。
當(dāng)一個(gè)應(yīng)用程序進(jìn)行讀寫時(shí),Linux內(nèi)核可以在其高速緩存或者緩沖區(qū)中保存文件的副本,并且可以在不訪問(wèn)磁盤的情況下返回被請(qǐng)求的信息。但是,如果Linux內(nèi)核沒(méi)有在內(nèi)存中保存數(shù)據(jù)副本,那它就向磁盤I/O隊(duì)列添加一個(gè)請(qǐng)求。若Linux內(nèi)核注意到多個(gè)請(qǐng)求都指向磁盤內(nèi)相鄰的區(qū)域,它會(huì)把它們合并為一個(gè)大的請(qǐng)求。這種合并能消除第二次請(qǐng)求的尋道時(shí)間,以此提高磁盤的整體性能。當(dāng)請(qǐng)求被放入磁盤隊(duì)列,而磁盤當(dāng)前不忙時(shí),它就開(kāi)始為I/O請(qǐng)求服務(wù)。如果磁盤正忙,則請(qǐng)求就在隊(duì)列中等待,直到該設(shè)備可用,請(qǐng)求將被服務(wù)。
6.2 磁盤I/O性能工具
6.2.1 vmstat
語(yǔ)法:
vmstat [-D] [-d] [-p partition] [interval count]
vmstat選項(xiàng)說(shuō)明
| 選項(xiàng) | 說(shuō)明 |
|---|---|
| -D | 顯示Linux I/O子系統(tǒng)的統(tǒng)計(jì)信息,顯示的是系統(tǒng)啟動(dòng)以來(lái)的總信息 |
| -d | 按每interval一個(gè)樣本的速率顯示單個(gè)磁盤的統(tǒng)計(jì)數(shù)據(jù),顯示的是系統(tǒng)啟動(dòng)以來(lái)的總信息。 |
| -p partition | 按照每interval一個(gè)采樣的速率顯示給定分區(qū)性能統(tǒng)計(jì)數(shù)據(jù),顯示的是系統(tǒng)啟動(dòng)以來(lái)的總信息。 |
| interval | 采樣之間的頻率 |
| count | 所取的樣本總數(shù) |
vmstat默認(rèn)顯示的信息:
vmstat –D 顯示的信息
部分統(tǒng)計(jì)信息說(shuō)明
| 輸出 | 說(shuō)明 |
|---|---|
| disks | 系統(tǒng)中磁盤的總數(shù) |
| partitions | 系統(tǒng)中分區(qū)的總數(shù) |
| total reads | 讀請(qǐng)求的總數(shù) |
| merged reads | 為了提升性能而被合并的不同讀請(qǐng)求的數(shù)量,這些讀請(qǐng)求訪問(wèn)的是磁盤上的相鄰位置。 |
| writes | 寫請(qǐng)求的總數(shù) |
| inprogress IO | 當(dāng)前正在處理的I/O總數(shù) |
vmstat –d部分統(tǒng)計(jì)信息說(shuō)明
| 輸出 | 說(shuō)明 |
|---|---|
| reads:total | 讀請(qǐng)求的總數(shù) |
| reads:merged | 為了提升性能而被合并的不同讀請(qǐng)求的數(shù)量 |
| reads:sectors | 從磁盤讀取的扇區(qū)的總數(shù) |
| ms | 磁盤讀所花費(fèi)的時(shí)間 |
vmstat –d 顯示的信息:
6.2.2 iostat
與vmstat相似,但它是一個(gè)專門用于顯示磁盤I/O子系統(tǒng)統(tǒng)計(jì)信息的工具。iostat提供的信息細(xì)化到每個(gè)設(shè)備和每個(gè)分區(qū)從特定磁盤讀寫了多少個(gè)塊。此外,iostat還可以提供大量的信息來(lái)顯示磁盤是如何被利用的,以及Linux花費(fèi)了多長(zhǎng)時(shí)間來(lái)等待將請(qǐng)求提交到磁盤。
iostat命令行選項(xiàng)
| 選項(xiàng) | 說(shuō)明 |
|---|---|
| -d | 只顯示磁盤I/O的統(tǒng)計(jì)信息,而不是默認(rèn)信息。 |
| -k | 按KB顯示統(tǒng)計(jì)數(shù)據(jù),而不是按塊顯示 |
| -x | 顯示拓展性能I/O統(tǒng)計(jì)信息 |
| device | 若指定設(shè)備,則iostat只顯示該設(shè)備的信息 |
iostat設(shè)備統(tǒng)計(jì)信息
| 輸出 | 說(shuō)明 |
|---|---|
| tps | 每秒傳輸次數(shù),該項(xiàng)為每秒對(duì)設(shè)備/分區(qū)讀寫請(qǐng)求的次數(shù) |
| Blk_read/s | 每秒讀取磁盤塊的速率 |
| Blk_wrtn/s | 每秒寫入磁盤塊的速率 |
| Blk_read | 在時(shí)間間隔內(nèi)讀取塊的總數(shù)量 |
| Blk_wrtn | 在時(shí)間間隔內(nèi)寫入塊的總數(shù)量 |
iostat –d 顯示:
6.2.3 sar
6.2.4 lsof
lsof提供了一種方法來(lái)確定哪些進(jìn)程打開(kāi)了一個(gè)特定的文件,除了跟蹤單個(gè)文件的用戶外,lsof還可以顯示使用了特定目錄下的進(jìn)程。
語(yǔ)法
**lsof [-r delay] [+D directory] [+d directory] [file]**
lsof命令選項(xiàng)說(shuō)明
| 選項(xiàng) | 說(shuō)明 |
|---|---|
| r delay | 使得lsof每間隔delay秒輸出一次統(tǒng)計(jì)數(shù)據(jù) |
| D directory | 使得lsof遞歸搜索給定目錄下的所有文件,并報(bào)告哪些進(jìn)程正在使用 |
| d directory | 使得lsof報(bào)告哪些進(jìn)程正在使用給定目錄下的文件 |
lsof顯示訪問(wèn)了/usr/bin下所有文件的進(jìn)程