在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

磁盤(pán)I/O是怎么工作的

科技綠洲 ? 來(lái)源:Linux開(kāi)發(fā)架構(gòu)之路 ? 作者:Linux開(kāi)發(fā)架構(gòu)之路 ? 2023-11-13 11:20 ? 次閱讀

同前面講述的CPU、內(nèi)存一樣,文件系統(tǒng)和磁盤(pán)I/O,也是Linux操作系統(tǒng)最核心的功能。

  • 磁盤(pán)為系統(tǒng)提供了最基本的持久化存儲(chǔ)。
  • 文件系統(tǒng)則在磁盤(pán)基礎(chǔ)上,提供了一個(gè)用來(lái)管理文件的樹(shù)狀結(jié)構(gòu)。

文件系統(tǒng)

1. 索引節(jié)點(diǎn)和目錄項(xiàng)

Linux中的一切都由統(tǒng)一的文件系統(tǒng)來(lái)管理,包括普通的文件和目錄,以及塊設(shè)備、套接字、管道等。Linux文件系統(tǒng)為每個(gè)文件都分配了兩個(gè)數(shù)據(jù)結(jié)構(gòu),索引節(jié)點(diǎn)(index node)和目錄項(xiàng)(directory entry),主要用來(lái)記錄文件的元信息和目錄結(jié)構(gòu)。

  • 索引節(jié)點(diǎn),簡(jiǎn)稱為 inode,用來(lái)記錄文件的元數(shù)據(jù),比如inode編號(hào)、文件大小、訪問(wèn)權(quán)限、修改日期、數(shù)據(jù)的位置等。索引節(jié)點(diǎn)和文件一一對(duì)應(yīng),它跟文件內(nèi)容一樣會(huì)被持久化到磁盤(pán),所以,索引節(jié)點(diǎn)同樣占磁盤(pán)。
  • 目錄項(xiàng),簡(jiǎn)稱為dentry,用來(lái)記錄的文件的名字、索引節(jié)點(diǎn)指針以及與其他目錄項(xiàng)的關(guān)聯(lián)關(guān)系。多個(gè)關(guān)聯(lián)的目錄項(xiàng),就構(gòu)成了文件系統(tǒng)的目錄結(jié)構(gòu),它是由內(nèi)核維護(hù)的一個(gè)內(nèi)存數(shù)據(jù)結(jié)構(gòu),通常也被稱為目錄項(xiàng)緩存。

換句話說(shuō),索引節(jié)點(diǎn)是每個(gè)文件的唯一標(biāo)志,目錄項(xiàng)維護(hù)的是文件系統(tǒng)的樹(shù)狀結(jié)構(gòu)。目錄項(xiàng)和索引節(jié)點(diǎn)的關(guān)系是多對(duì)一,或者可理解為一個(gè)文件多個(gè)別名。舉個(gè)例子,通過(guò)硬鏈接為文件創(chuàng)建的別名,就會(huì)對(duì)應(yīng)不同目錄項(xiàng),這些目錄項(xiàng)本質(zhì)上是連接同一個(gè)文件,所以索引節(jié)點(diǎn)相同。

更具體地說(shuō),文件數(shù)據(jù)是怎么存儲(chǔ)的,是直接保存到磁盤(pán)的?實(shí)際上磁盤(pán)讀寫(xiě)的最小單位是扇區(qū),扇區(qū)只有512B大小,如果每次讀寫(xiě)這么小的單位,效率一定很低。所以,文件系統(tǒng)又把連續(xù)的扇區(qū)組成邏輯塊,再以邏輯塊為最小單元去管理數(shù)據(jù)。常見(jiàn)的邏輯塊大小是4KB,即連續(xù)的8個(gè)扇區(qū)。下面展示一張示意圖:

圖片

這里需要注意兩點(diǎn):

第一,目錄項(xiàng)本身在內(nèi)存中,索引節(jié)點(diǎn)在磁盤(pán)中。前面的 Buffer 和 Cache 原理中提到,為了協(xié)調(diào)慢速磁盤(pán)和快速CPU之間的性能差異,文件內(nèi)容會(huì)緩存到頁(yè)緩存 Cache中。索引節(jié)點(diǎn)自然也會(huì)緩存到內(nèi)存中,增加速文件訪問(wèn)。

第二,磁盤(pán)在執(zhí)行文件系統(tǒng)格式化時(shí),會(huì)被分成三個(gè)存儲(chǔ)區(qū)域,超級(jí)塊、索引節(jié)點(diǎn)區(qū) 和 數(shù)據(jù)塊區(qū)。其中,超級(jí)塊存儲(chǔ)整個(gè)文件系統(tǒng)狀態(tài);索引節(jié)點(diǎn)區(qū)存儲(chǔ)索引節(jié)點(diǎn);數(shù)據(jù)塊區(qū),存儲(chǔ)文件數(shù)據(jù)。

2. 虛擬文件系統(tǒng)

目錄項(xiàng)、索引節(jié)點(diǎn)、超級(jí)塊、邏輯塊構(gòu)成Linux文件系統(tǒng)四大基本要素。不過(guò),為了支持各種不同的文件系統(tǒng),Linux內(nèi)核在用戶進(jìn)程和文件系統(tǒng)中間,引入了一個(gè)抽象層,即虛擬文件系統(tǒng)VFS。VFS定義了一套所有文件系統(tǒng)都支持的數(shù)據(jù)結(jié)構(gòu)和標(biāo)準(zhǔn)接口。這樣,用戶層和內(nèi)核其他子系統(tǒng)都只需要跟 VFS 提供的統(tǒng)一接口交互就可以了,不需要關(guān)心底層各種文件系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié)。下圖很好展示了Linux文件系統(tǒng)的架構(gòu)圖,能更好的幫助理解系統(tǒng)調(diào)用、VFS、緩存、文件系統(tǒng)以及塊存儲(chǔ)之間的關(guān)系:

圖片

從圖中可以看到,在VFS下面Linux可以支持各種文件系統(tǒng),按照存儲(chǔ)位置的不同,可以分為三類:

  • 基于磁盤(pán)的文件系統(tǒng),也就是把數(shù)據(jù)直接存儲(chǔ)到計(jì)算機(jī)本地掛載的磁盤(pán)中。如 EXT4、XFS、OverlayFS等。
  • 基于內(nèi)存的文件系統(tǒng),也就是虛擬文件系統(tǒng),不需要磁盤(pán)分配任何存儲(chǔ)空間,只占用內(nèi)存。如 /proc 文件系統(tǒng)、/sys 文件系統(tǒng)(主要向用戶空間導(dǎo)出層次化的內(nèi)核對(duì)象)。
  • 網(wǎng)絡(luò)文件系統(tǒng),用來(lái)訪問(wèn)其他計(jì)算機(jī)數(shù)據(jù)的文件系統(tǒng),如 NFS、SMB、iSCSI等。

這些文件系統(tǒng),要先掛載到 VFS 目錄樹(shù)中的子目錄(掛載點(diǎn)),然后才能訪問(wèn)其中文件。比如安裝系統(tǒng)時(shí),要先掛在一個(gè)根目錄( / ),在根目錄下,再把其他文件系統(tǒng)掛在進(jìn)來(lái)。

3. 文件系統(tǒng)I/O

把文件掛到掛載點(diǎn)后,就能通過(guò)它去訪問(wèn)它管理的文件了。VFS提供的訪問(wèn)文件的標(biāo)準(zhǔn)接口,以系統(tǒng)調(diào)用的方式提供給應(yīng)用程序使用。比如,cat命令,相繼調(diào)用 open()、read()、write()。文件讀寫(xiě)方式的各種差異,也導(dǎo)致I/O 的分類多種多樣。常見(jiàn)的有,緩沖與非緩沖I/O、直接與非直接I/O、阻塞與非阻塞I/O、同步與異步I/O等。下面詳細(xì)解釋下這四種 I/O分類:

第一種,根據(jù)是否利用標(biāo)準(zhǔn)庫(kù)緩存,可以把文件I/O 分為 緩沖I/O 和 非緩沖I/O。這里的“緩沖”,其實(shí)指的是標(biāo)準(zhǔn)庫(kù)內(nèi)部實(shí)現(xiàn)的緩存。例如,很多程序遇到換行時(shí)才真正輸出,換行前的內(nèi)容,就是被標(biāo)準(zhǔn)庫(kù)暫時(shí)緩存起來(lái)。因此,緩沖I/O 指的是利用標(biāo)準(zhǔn)庫(kù)緩存來(lái)加速文件的訪問(wèn),在標(biāo)準(zhǔn)庫(kù)內(nèi)部再通過(guò)系統(tǒng)調(diào)用訪問(wèn)文件;非緩沖I/O 指的是直接通過(guò)系統(tǒng)調(diào)用訪問(wèn)文件,而不通過(guò)標(biāo)準(zhǔn)庫(kù)緩存。無(wú)論是緩沖還是非緩沖 I/O,最后都是通過(guò)系統(tǒng)調(diào)用訪問(wèn)文件。而根據(jù)前面內(nèi)容,系統(tǒng)調(diào)用后,還通過(guò)頁(yè)緩存,來(lái)減少磁盤(pán)I/O操作。

第二種,根據(jù)是否利用操作系統(tǒng)的頁(yè)緩存,可以把文件I/O 分為直接I/O 和 非直接I/O。想要實(shí)現(xiàn)直接I/O,需要在系統(tǒng)調(diào)用中指定標(biāo)志 O_DIRECT,如果不指定,默認(rèn)是非直接I/O。不過(guò)注意,這里的直接、非直接I/O,其實(shí)最終還是和文件系統(tǒng)交互。如果實(shí)在數(shù)據(jù)庫(kù)等場(chǎng)景中,還會(huì)看到,跳過(guò)文件系統(tǒng)讀寫(xiě)磁盤(pán)的情況,即裸I/O。

第三種,根據(jù)應(yīng)用程序是否阻塞自身運(yùn)行,可以把文件I/O 分為阻塞I/O 和 非阻塞I/O。在應(yīng)用程序執(zhí)行I/O 操作后,如果沒(méi)獲得響應(yīng),就阻塞當(dāng)前線程,自然不能執(zhí)行其他任務(wù),這是阻塞I/O;如果沒(méi)獲得響應(yīng),卻不阻塞當(dāng)前線程,繼續(xù)執(zhí)行其他任務(wù),隨后通過(guò)輪詢或者時(shí)間通知的形式,獲得之前調(diào)用的結(jié)果。比如,訪問(wèn)管道或者網(wǎng)絡(luò)套接字時(shí),設(shè)置 O_NONBLOCK 標(biāo)志,表示非阻塞方式訪問(wèn),若不做任何設(shè)置,默認(rèn)就是阻塞方式訪問(wèn)。

第四種,根據(jù)是否等待響應(yīng)結(jié)果,可以把文件I/O 分為同步I/O 和 異步I/O。在應(yīng)用程序執(zhí)行I/O 操作后,如果一直等到 整個(gè) I/O完成后才獲得響應(yīng),就是同步I/O;如果不等待 I/O 完成以及完成后的響應(yīng),繼續(xù)往下執(zhí)行,等到 I/O 完成后,響應(yīng)會(huì)用事件通知的方式,告訴應(yīng)用程序。比如,在操作文件時(shí),如果設(shè)置了 O_SYNC 或 O_DSYNC標(biāo)志,就代表同步I/O,后者是等待文件數(shù)據(jù)寫(xiě)入磁盤(pán)后才返回,而前者是在后者基礎(chǔ)上,要求文件元數(shù)據(jù)也要寫(xiě)入磁盤(pán)后才能返回。再比如,在訪問(wèn)管道或者網(wǎng)絡(luò)套接字時(shí),設(shè)置選項(xiàng) O_ASYNC后,就是異步 I/O內(nèi)核會(huì)通過(guò) SIGIO 或者 SIGPOLL,來(lái)通知進(jìn)程,文件是否可讀寫(xiě)。

總之,無(wú)論是普通文件和塊設(shè)備、還是網(wǎng)絡(luò)套接字和管道等,都通過(guò)統(tǒng)一的VFS接口來(lái)被訪問(wèn)。

4. 文件系統(tǒng)性能觀測(cè)

$ df /dev/sda1 
Filesystem     1K-blocks    Used Available Use% Mounted on 
/dev/sda1       30308240 3167020  27124836  11% /

$ df -h /dev/sda1 
Filesystem      Size  Used Avail Use% Mounted on 
/dev/sda1        29G  3.1G   26G  11% / 

$ df -i /dev/sda1 
Filesystem      Inodes  IUsed   IFree IUse% Mounted on 
/dev/sda1      3870720 157460 3713260    5% /

加上-i 參數(shù)查看索引節(jié)點(diǎn)的使用情況,索引節(jié)點(diǎn)的容量,(也就是 Inode個(gè)數(shù))是在格式化磁盤(pán)時(shí)設(shè)定好的,由格式化工具自動(dòng)生成。當(dāng)你發(fā)現(xiàn)索引節(jié)點(diǎn)空間不足時(shí),但磁盤(pán)空間充足時(shí),很可能是過(guò)多的小文件導(dǎo)致的,一般的刪除它們或者移到其他的索引節(jié)點(diǎn)充足的磁盤(pán)上,就能解決問(wèn)題。

接下來(lái),文件系統(tǒng)的目錄項(xiàng)和索引節(jié)點(diǎn)的緩存,如何查看呢?

實(shí)際上,內(nèi)核使用 Slab 機(jī)制,管理目錄項(xiàng)和索引節(jié)點(diǎn)的緩存。/proc/meminfo 只給出了Slab整體大小,具體到每一種Slab緩存,就要查看 /proc/slabinfo。運(yùn)行下面命令可以得到,所有目錄項(xiàng)和各種文件系統(tǒng)的索引節(jié)點(diǎn)的緩存情況:

$ cat /proc/slabinfo | grep -E '^#|dentry|inode' 
# name            < active_objs > < num_objs > < objsize > < objperslab > < pagesperslab > : tunables < limit >

dentry 行表示目錄項(xiàng)緩存,inode_cache 行,表示VFS 索引節(jié)點(diǎn)緩存,其余的則是各種文件系統(tǒng)的緩存。這里列比較多,可查詢man slabinfo。實(shí)際性能分析時(shí),更多使用 slabtop,來(lái)找到占用內(nèi)存最多的緩存類型:

# 按下c按照緩存大小排序,按下a按照活躍對(duì)象數(shù)排序 
$ slabtop 
Active / Total Objects (% used)    : 277970 / 358914 (77.4%) 
Active / Total Slabs (% used)      : 12414 / 12414 (100.0%) 
Active / Total Caches (% used)     : 83 / 135 (61.5%) 
Active / Total Size (% used)       : 57816.88K / 73307.70K (78.9%) 
Minimum / Average / Maximum Object : 0.01K / 0.20K / 22.88K 

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME 
69804  23094   0%    0.19K   3324       21     13296K dentry 
16380  15854   0%    0.59K   1260       13     10080K inode_cache 
58260  55397   0%    0.13K   1942       30      7768K kernfs_node_cache 
   485    413   0%    5.69K     97        5      3104K task_struct 
  1472   1397   0%    2.00K     92       16      2944K kmalloc-2048

從這個(gè)結(jié)果可以看到,目錄項(xiàng)和索引節(jié)點(diǎn)占用最多的 Slab緩存,但其實(shí)并不大,約23MB。

思考:find / -name file-name 命令導(dǎo)致會(huì)不會(huì)導(dǎo)致緩存升高,如果會(huì),導(dǎo)致哪類緩存升高呢?

find / -name 命令是全盤(pán)掃描(包括內(nèi)存文件系統(tǒng)、磁盤(pán)文件系統(tǒng)等),所以這里會(huì)導(dǎo)致 xfs_inode 、proc_inode_cache、dentry、 inode_cache這幾類緩存的升高,而且在下次執(zhí)行 find 命令時(shí),就會(huì)快很多,因?yàn)樗蟛糠謺?huì)直接在緩存中查找結(jié)果。這里你可以在執(zhí)行find命令前后,比較slabtop、free、vmstat輸出結(jié)果,又會(huì)有更深的理解。

磁盤(pán) I/O

1. 磁盤(pán)

首先,根據(jù)存儲(chǔ)介質(zhì)的不同,可以分為兩類,機(jī)械磁盤(pán) 和 固態(tài)磁盤(pán)。

機(jī)械磁盤(pán):也稱為硬盤(pán)驅(qū)動(dòng)器(Hard Disk Driver,縮寫(xiě)HDD),機(jī)械磁盤(pán)由盤(pán)片和讀寫(xiě)磁頭組成,數(shù)據(jù)存儲(chǔ)在盤(pán)片的環(huán)狀磁道中,最小讀寫(xiě)單位 扇區(qū),一般大小為512B。在讀寫(xiě)數(shù)據(jù)時(shí),需要移動(dòng)磁頭,定位到數(shù)據(jù)所在的盤(pán)片磁道中,然后才訪問(wèn)數(shù)據(jù)。如果 I/O 請(qǐng)求剛好連續(xù),那就不需要磁道尋址,可獲得最佳性能,這就是順序I/O 的工作原理。隨機(jī) I/O,需要不停地移動(dòng)磁頭,來(lái)定位數(shù)據(jù)位置,讀寫(xiě)速度比較慢。

固態(tài)磁盤(pán):Solid State Driver,縮寫(xiě)SSD,由固態(tài)電子元器件組成,最小讀寫(xiě)單位 頁(yè),一般大小4KB、8KB等。固態(tài)磁盤(pán)不需要磁道尋址,不管是連續(xù)I/O,還是隨機(jī)I/O的性能,都比機(jī)械磁盤(pán)好得多。

另外,相同磁盤(pán)的順序I/O 都要比 隨機(jī)I/O 快得多,原因如下:

  • 對(duì)于機(jī)械磁盤(pán)來(lái)說(shuō),隨機(jī) I/O需要更多的磁頭尋道和盤(pán)片旋轉(zhuǎn),性能比順序I/O 慢。
  • 對(duì)于固態(tài)盤(pán)來(lái)說(shuō),雖然隨機(jī)I/O 性能比機(jī)械盤(pán)好很多,但是它也會(huì)有“先擦除、再寫(xiě)入”的限制。隨機(jī)讀寫(xiě)也有大量的垃圾回收,所以還是會(huì)比順序I/O 慢很多。
  • 另外,順序I/O 可以通過(guò)預(yù)讀的方式,來(lái)減少 I/O請(qǐng)求的次數(shù),這也是其性能優(yōu)異的原因之一。

在上一節(jié)提到過(guò),如果每次都讀寫(xiě) 512B 數(shù)據(jù),效率會(huì)很低。文件系統(tǒng)會(huì)把連續(xù)的扇區(qū)或頁(yè)組成邏輯塊,作為最小單元管理數(shù)據(jù),常見(jiàn)的邏輯塊是 4KB,即連續(xù)的8個(gè)扇區(qū),或者一個(gè)頁(yè)。

其次,還可以按照接口來(lái)分類,可以把硬盤(pán)分為 IDE、SCSI、SASSATA、FC等。不同的接口,分配不同的設(shè)備名稱。比如 IDE的會(huì)分配一個(gè)前綴為 hd 的設(shè)備名,SCSI 和 SATA會(huì)分配一個(gè) sd 前綴的設(shè)備名。如果是多塊同類型的磁盤(pán),會(huì)按照a、b、c等字母順序編號(hào)。

第三,還可以根據(jù)使用方式,將磁盤(pán)劃分為不同架構(gòu)。最簡(jiǎn)單的就是,作為獨(dú)立磁盤(pán)來(lái)使用。然后再根據(jù)需要,將磁盤(pán)劃分成多個(gè)邏輯分區(qū),再給分區(qū)編號(hào)。比如前面多次用到的 /dev/sda,還可以分成兩個(gè)分區(qū) /dev/sda1 和 /dev/sda2。另一個(gè)比較常用的架構(gòu)是,將多塊磁盤(pán)組成一個(gè)邏輯磁盤(pán),構(gòu)成冗余獨(dú)立 的磁盤(pán)陣列,RAID,提高數(shù)據(jù)訪問(wèn)性能,增強(qiáng)數(shù)據(jù)存儲(chǔ)的可靠性。

根據(jù)容量、性能、可靠性的不同,RAID可以分為多個(gè)級(jí)別,如RAID0、RAID1、RAID5、RAID10等。RAID0有最優(yōu)的讀寫(xiě)性能,但不提供數(shù)據(jù)冗余的功能,其他級(jí)別的 RAID,在數(shù)據(jù)冗余的基礎(chǔ)上,對(duì)讀寫(xiě)性能有一定的優(yōu)化。

最后一種架構(gòu),把磁盤(pán)組合成網(wǎng)絡(luò)存儲(chǔ)集群,再通過(guò)NFS、SMB、iSCSI等網(wǎng)絡(luò)存儲(chǔ)協(xié)議,暴露給服務(wù)器使用。

其實(shí),在Linux下,磁盤(pán)是作為塊設(shè)備來(lái)管理的,也就是以塊為單位來(lái)讀寫(xiě)數(shù)據(jù),且支持隨機(jī)讀寫(xiě)。每個(gè)塊設(shè)備都被賦予主、次兩個(gè)設(shè)備號(hào),主設(shè)備號(hào)用在驅(qū)動(dòng)程序中區(qū)別設(shè)備類型,次設(shè)備號(hào)用來(lái)給多個(gè)同類設(shè)備編號(hào)。

2. 通用塊層

為了減少不同塊設(shè)備的差異帶來(lái)的影響,Linux通過(guò)一個(gè)統(tǒng)一的通用塊層,來(lái)管理各種不同的塊設(shè)備。通用塊層其實(shí)是處在文件系統(tǒng)和磁盤(pán)驅(qū)動(dòng)中間的一個(gè)塊設(shè)備抽象層。有兩個(gè)功能:

第一個(gè)跟虛擬文件系統(tǒng)的功能類似。向上,為文件系統(tǒng)和應(yīng)用程序,提供訪問(wèn)塊設(shè)備的標(biāo)準(zhǔn)接口;向下,把各種異構(gòu)的磁盤(pán)設(shè)備抽象成統(tǒng)一的塊設(shè)備,并提供統(tǒng)一框架來(lái)管理這些設(shè)備的驅(qū)動(dòng)程序。

第二個(gè)功能,通用塊層還給文件系統(tǒng)和應(yīng)用程序發(fā)來(lái)的I/O請(qǐng)求排隊(duì),并通過(guò)請(qǐng)求排隊(duì)、合并等,提高磁盤(pán)讀寫(xiě)的效率。

對(duì) I/O請(qǐng)求排序也是 I/O調(diào)度。事實(shí)上,Linux內(nèi)核支持四種 I/O調(diào)度算法,NONE、NOOP、CFQ、DeadLine。

NONE:確切的說(shuō)并不能算調(diào)度,因?yàn)樗耆皇褂萌魏握{(diào)度器,對(duì)文件系統(tǒng)和應(yīng)用程序的 I/O不作任何處理,常用在虛擬機(jī)中(此時(shí)磁盤(pán) I/O調(diào)度完全由物理機(jī)支持)。

NOOP:最簡(jiǎn)單的一種調(diào)度算法,是一個(gè)先進(jìn)先出的隊(duì)列,只做一些最基本的請(qǐng)求合并,常用于SSD盤(pán)。

CFQ:完全公平調(diào)度器,是現(xiàn)在很多發(fā)行版的默認(rèn) I/O調(diào)度器。它為每個(gè)進(jìn)程維護(hù)了一個(gè) I/O調(diào)度隊(duì)列,并按時(shí)間片來(lái)均勻分布每個(gè)進(jìn)程的 I/O請(qǐng)求。類似于進(jìn)程的CPU調(diào)度,CFQ調(diào)度還支持進(jìn)程 I/O的優(yōu)先級(jí)調(diào)度,所以適用運(yùn)行著大量進(jìn)程的系統(tǒng),像桌面環(huán)境、多媒體應(yīng)用等。

DeadLine:分別為讀、寫(xiě)請(qǐng)求創(chuàng)建不同的 I/O 隊(duì)列,可以提高機(jī)械磁盤(pán)的吞吐量,并確保達(dá)到最終期限的請(qǐng)求被優(yōu)先處理。這種調(diào)度算法 多用在 I/O 壓力比較大的場(chǎng)合,如數(shù)據(jù)庫(kù)等。

3. I/O棧

結(jié)合上面講的文件系統(tǒng)、磁盤(pán)和通用塊層的工作原理,我們可以整體來(lái)看 Linux存儲(chǔ)系統(tǒng)的 I/O原理了。事實(shí)上,我們可以把 Linux存儲(chǔ)系統(tǒng)的 I/O棧,由上至下分為三層:文件系統(tǒng)層、通用塊層、設(shè)備層。看圖:

圖片

根據(jù)這張全景圖,我們可以更清楚理解,存儲(chǔ)系統(tǒng)的 I/O的工作原理:

  • 文件系統(tǒng)層,包括虛擬文件系統(tǒng)和其他各種文件系統(tǒng)的具體實(shí)現(xiàn)。首先為上層的應(yīng)用程序提供標(biāo)準(zhǔn)的文件訪問(wèn)接口,對(duì)下會(huì)通過(guò)通用塊層,來(lái)存儲(chǔ)和管理磁盤(pán)數(shù)據(jù)。
  • 通用塊層,是Linux磁盤(pán) I/O的核心,包括設(shè)備 I/O隊(duì)列和 I/O調(diào)度器。會(huì)對(duì)文件系統(tǒng)的 I/O請(qǐng)求進(jìn)行排隊(duì),再通過(guò)重新排序和請(qǐng)求合并,再發(fā)給下一級(jí)設(shè)備層。
  • 設(shè)備層,包括存儲(chǔ)設(shè)備和相應(yīng)的驅(qū)動(dòng)程序,負(fù)責(zé)最終物理設(shè)備的 I/O操作。

存儲(chǔ)系統(tǒng)的 I/O,通常是整個(gè)Linux系統(tǒng)中最慢的一環(huán)。所以,Linux通過(guò)多種緩存機(jī)制來(lái)優(yōu)化 I/O 效率。比如,為了優(yōu)化文件訪問(wèn)性能,會(huì)使用頁(yè)緩存、索引節(jié)點(diǎn)緩存、目錄項(xiàng)緩存等多種緩存機(jī)制,減少對(duì)下層塊設(shè)備的直接調(diào)用。同樣,為了優(yōu)化塊設(shè)備的訪問(wèn)性能,會(huì)使用緩沖區(qū),來(lái)緩存塊設(shè)備的數(shù)據(jù)。

4. 磁盤(pán)性能指標(biāo)以及觀測(cè)

這里說(shuō)一下常見(jiàn)的五個(gè)指標(biāo),使用率、飽和度、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)達(dá)到100%時(shí),磁盤(pán)就無(wú)法接受新的 I/O請(qǐng)求。
  • IOPS,每秒的 I/O請(qǐng)求數(shù)。
  • 吞吐量,每秒的 I/O請(qǐng)求大小。
  • 響應(yīng)時(shí)間,從發(fā)出請(qǐng)求到收到響應(yīng)的時(shí)間間隔。

注意,使用率只考慮有沒(méi)有 I/O,而不考慮 I/O大小,即使達(dá)到100%,也有可能接受新的 I/O請(qǐng)求。在數(shù)據(jù)庫(kù)、大量小文件等這類隨機(jī)讀寫(xiě)比較多的場(chǎng)景中,IOPS更能反應(yīng)系統(tǒng)整體性能。在多媒體等順序讀寫(xiě)較多的場(chǎng)景中,吞吐量更能反應(yīng)系統(tǒng)整體性能。

一般來(lái)說(shuō),我們?cè)跒閼?yīng)用程序的服務(wù)器選型時(shí),要先對(duì)磁盤(pán) I/O的性能進(jìn)行基準(zhǔn)測(cè)試,推薦的性能測(cè)試工具 fio,來(lái)測(cè)試磁盤(pán)的 IOPS,吞吐量以及響應(yīng)時(shí)間等核心指標(biāo)。用性能工具得到的指標(biāo),作為后續(xù)分析應(yīng)用程序的性能依據(jù)。一旦發(fā)生性能問(wèn)題,就可以把它們作為磁盤(pán)性能的極限值,進(jìn)而評(píng)估磁盤(pán) I/O的使用情況。

接下來(lái)看看怎么觀測(cè)磁盤(pán) I/O?首推的工具 iostat,它提供每個(gè)磁盤(pán)的使用率、IOPS、吞吐量等各種常見(jiàn)的性能指標(biāo),當(dāng)然這些指標(biāo)來(lái)自 /proc/diskstats。iostats 的輸出界面如下:

# -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

下圖說(shuō)明了這些列的具體含義:

圖片

這些指標(biāo),你要注意,%util 磁盤(pán)使用率,r/s + w/s IOPS,rkB/s + wkB/s 吞吐量, r_await + w_await 響應(yīng)時(shí)間。另外從 iostat 并不能直接得到磁盤(pán)的飽和度,但是可以把觀測(cè)到的,平均請(qǐng)求隊(duì)列長(zhǎng)度 或者 讀寫(xiě)請(qǐng)求完成的等待時(shí)間,跟基準(zhǔn)測(cè)試的結(jié)果進(jìn)行對(duì)比,綜合來(lái)評(píng)估。

我們?cè)賮?lái)看看,每個(gè)進(jìn)程的 I/O情況。iostat只能看到磁盤(pán)整體的 I/O性能數(shù)據(jù),并不能知道具體哪些進(jìn)程 在進(jìn)行磁盤(pán)讀寫(xiě),推薦兩個(gè)工具:pidstat 和 iotop。具體使用這里略過(guò)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7085

    瀏覽量

    89203
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11322

    瀏覽量

    209861
  • 磁盤(pán)
    +關(guān)注

    關(guān)注

    1

    文章

    379

    瀏覽量

    25224
  • 文件系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    287

    瀏覽量

    19929
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    物理約束實(shí)踐:I/O約束

    I/O約束(I/O Constraints)包括I/O標(biāo)準(zhǔn)(
    的頭像 發(fā)表于 11-18 16:42 ?1152次閱讀
    物理約束實(shí)踐:<b class='flag-5'>I</b>/<b class='flag-5'>O</b>約束

    什么是磁盤(pán)I/O驅(qū)動(dòng)程序嗎?它的用途是什么?

    我正在閱讀有關(guān) FAT 文件系統(tǒng)組件的 Espressif 文檔。在這份文檔中,寫(xiě)到 FatFS 已經(jīng)擴(kuò)展了 API 函數(shù),可以在運(yùn)行時(shí)注冊(cè)磁盤(pán) I/O 驅(qū)動(dòng)程序。你能解釋一下什么是磁盤(pán)
    發(fā)表于 04-13 08:39

    一種高效的磁盤(pán)隊(duì)列I/O機(jī)制

    分析了傳統(tǒng)磁盤(pán)隊(duì)列的存儲(chǔ)管理開(kāi)銷和讀寫(xiě)性能,針對(duì)磁盤(pán)隊(duì)列I/O已成為影響消息服務(wù)器性能的首要瓶頸,提出了一種高效磁盤(pán)隊(duì)列
    發(fā)表于 05-14 19:51 ?32次下載

    數(shù)字I/O介紹

    數(shù)字I/O腳有專用和復(fù)用。數(shù)字I/O腳的功能通過(guò)9個(gè)16位控制寄存器來(lái)控制。控制寄存器分為兩類:(1)I/
    發(fā)表于 09-16 12:20 ?19次下載

    播出服務(wù)器磁盤(pán)I/O與緩存性能分析

    播出服務(wù)器磁盤(pán)I/O與緩存性能分析:針對(duì)電視臺(tái)專業(yè)播出服務(wù)器在播出質(zhì)量和播出性能上的高要求,提出了(s,S)策略下讀數(shù)據(jù)緩存和復(fù)用緩存與節(jié)目數(shù)量、節(jié)目數(shù)據(jù)速率、磁盤(pán)性能
    發(fā)表于 01-16 15:09 ?22次下載

    什么是I/O地址

    什么是I/O地址 I/O地址中I是input的簡(jiǎn)寫(xiě),O是output的簡(jiǎn)寫(xiě),也就是輸入輸出地址
    發(fā)表于 02-05 10:01 ?1349次閱讀

    通過(guò)對(duì)blktrace的輸出結(jié)果進(jìn)行分析讀、寫(xiě)操作的磁盤(pán)塊進(jìn)行I/O頻次統(tǒng)計(jì)

    通過(guò)對(duì)blktrace的輸出結(jié)果進(jìn)行分析,我們可以對(duì)特定時(shí)間段內(nèi)發(fā)生的讀、寫(xiě)操作的磁盤(pán)塊進(jìn)行I/O頻次統(tǒng)計(jì)。結(jié)合通過(guò)將磁盤(pán)I/
    的頭像 發(fā)表于 04-03 09:48 ?9652次閱讀
    通過(guò)對(duì)blktrace的輸出結(jié)果進(jìn)行分析讀、寫(xiě)操作的<b class='flag-5'>磁盤(pán)</b>塊進(jìn)行<b class='flag-5'>I</b>/<b class='flag-5'>O</b>頻次統(tǒng)計(jì)

    介紹 I/O NI系統(tǒng),C系列的I/O模塊

    內(nèi)容包括:理想的確定性以太網(wǎng)I/O,具有確定性分布式I/O的NI系統(tǒng),C系列的I/O模塊,與La
    的頭像 發(fā)表于 06-14 06:19 ?4603次閱讀
    介紹 <b class='flag-5'>I</b>/<b class='flag-5'>O</b> NI系統(tǒng),C系列的<b class='flag-5'>I</b>/<b class='flag-5'>O</b>模塊

    如何更改 Linux 的 I/O 調(diào)度器

    Linux 的 I/O 調(diào)度器是一個(gè)以塊式 I/O 訪問(wèn)存儲(chǔ)卷的進(jìn)程,有時(shí)也叫磁盤(pán)調(diào)度器。Linux I
    發(fā)表于 05-15 15:54 ?857次閱讀
    如何更改 Linux 的 <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 調(diào)度器

    新唐科技超級(jí) I/O 系列介紹

    新唐超級(jí)I/O(Super I/O)系列芯片,被廣泛的使用在主板、工業(yè)計(jì)算機(jī)、一體機(jī)(AIO)以及工作站上。除了傳統(tǒng)輸出入的功能, 例如串口
    的頭像 發(fā)表于 02-04 09:51 ?1950次閱讀
    新唐科技超級(jí) <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 系列介紹

    51單片機(jī)并行I/O工作原理

    51單片機(jī)并行I/O工作原理51單片機(jī)并行I/O工作原理P1: 僅作為雙向
    發(fā)表于 11-11 11:51 ?50次下載
    51單片機(jī)并行<b class='flag-5'>I</b>/<b class='flag-5'>O</b>口<b class='flag-5'>工作</b>原理

    STM32單片機(jī)---I/O應(yīng)用

    STM32單片機(jī)---(二)I/O應(yīng)用stm32I/O簡(jiǎn)介GPIO的8種工作模式stm32I/
    發(fā)表于 12-17 18:33 ?18次下載
    STM32單片機(jī)---<b class='flag-5'>I</b>/<b class='flag-5'>O</b>應(yīng)用

    Linux磁盤(pán)I/O的性能指標(biāo)和查看性能工具

    在我之前的文章:《探討 Linux 的磁盤(pán) I/O》中,我談到了 Linux 磁盤(pán) I/O
    的頭像 發(fā)表于 05-14 15:21 ?2656次閱讀

    查看linux系統(tǒng)磁盤(pán)io情況的辦法是什么

    談到 Linux 磁盤(pán) I/O工作原理,我們了解到 Linux 存儲(chǔ)系統(tǒng) I/O 棧由文件系
    發(fā)表于 08-01 10:14 ?2436次閱讀

    如何快速分析定位 I/O 性能問(wèn)題

    如何快速分析定位 I/O 性能問(wèn)題 1. 文件系統(tǒng) I/O性能指標(biāo) 首先,想到是存儲(chǔ)空間的使用情況,包括容量、使用量、以及剩余空間等。我們通常也稱這些為
    的頭像 發(fā)表于 11-13 14:15 ?1129次閱讀
    如何快速分析定位 <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 性能問(wèn)題
    主站蜘蛛池模板: 五月激情综合| 久久久久久国产精品mv| 国产成人精品一区二区三区| 国产手机免费视频| 日本三级香港三级人妇 m| 国产精品久久久久免费| 2018天天弄| 欧美黄色片在线播放| 777人体粉嫩u美图| 久久久久久噜噜噜久久久精品| 色噜噜狠狠网站| 亚洲欧美日本综合| 九九re热| 91拍拍在线观看| 97久草| 九九热在线视频观看| 直接看黄的网站| 亚洲一区免费观看| 69日本xxxxxxxxx98| 1024手机看片欧美日韩| 一区二区三区四区视频在线观看 | 天天爱天天做色综合| 综合免费视频| 天堂网在线资源| 手机看片国产免费| 国产精品午夜久久| 久久久国产乱子伦精品| a在线免费| 女生扒开尿口让男生舔| 亚洲人成网i8禁止| 永久免费观看黄网站| 中文字幕色综合久久| 精品一区二区国语对白| h国产| 综合色图| 全黄性色大片| 亚洲国产日韩精品怡红院| 影院成人区精品一区二区婷婷丽春院影视 | 日本动漫免费看| 成年人毛片网站| 五月天婷婷亚洲|