日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

24丨基础篇:Linux磁盘I-O是怎么工作的(上)

發布時間:2024/9/3 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 24丨基础篇:Linux磁盘I-O是怎么工作的(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一節,我們學習了 Linux 文件系統的工作原理。簡單回顧一下,文件系統是對存儲設備上的文件,進行組織管理的一種機制。而 Linux 在各種文件系統實現上,又抽象了一層虛擬文件系統 VFS,它定義了一組,所有文件系統都支持的,數據結構和標準接口。這樣,對應用程序來說,只需要跟 VFS 提供的統一接口交互,而不需要關注文件系統的具體實現;對具體的文件系統來說,只需要按照 VFS 的標準,就可以無縫支持各種應用程序。VFS 內部又通過目錄項、索引節點、邏輯塊以及超級塊等數據結構,來管理文件。
  • 目錄項,記錄了文件的名字,以及文件與其他目錄項之間的目錄關系。
  • 索引節點,記錄了文件的元數據。
  • 邏輯塊,是由連續磁盤扇區構成的最小讀寫單元,用來存儲文件數據。
  • 超級塊,用來記錄文件系統整體的狀態,如索引節點和邏輯塊的使用情況等。
其中,目錄項是一個內存緩存;而超級塊、索引節點和邏輯塊,都是存儲在磁盤中的持久化數據。那么,進一步想,磁盤又是怎么工作的呢?又有哪些指標可以用來衡量它的性能呢?接下來,我就帶你一起看看, Linux 磁盤 I/O 的工作原理。

磁盤

磁盤是可以持久化存儲的設備,根據存儲介質的不同,常見磁盤可以分為兩類:機械磁盤和固態磁盤。

根據存儲介質

機械磁盤

第一類,機械磁盤,也稱為硬盤驅動器(Hard Disk Driver),通常縮寫為 HDD。機械磁盤主要由盤片和讀寫磁頭組成,數據就存儲在盤片的環狀磁道中。在讀寫數據前,需要移動讀寫磁頭,定位到數據所在的磁道,然后才能訪問數據。顯然,如果 I/O 請求剛好連續,那就不需要磁道尋址,自然可以獲得最佳性能。這其實就是我們熟悉的,連續 I/O 的工作原理。與之相對應的,當然就是隨機 I/O,它需要不停地移動磁頭,來定位數據位置,所以讀寫速度就會比較慢。

固態磁盤

第二類,固態磁盤(Solid State Disk),通常縮寫為 SSD,由固態電子元器件組成。固態磁盤不需要磁道尋址,所以,不管是連續 I/O,還是隨機 I/O 的性能,都比機械磁盤要好得多。其實,無論機械磁盤,還是固態磁盤,相同磁盤的隨機 I/O 都要比連續 I/O 慢很多,原因也很明顯。
  • 對機械磁盤來說,我們剛剛提到過的,由于隨機 I/O 需要更多的磁頭尋道和盤片旋轉,它的性能自然要比連續 I/O 慢。
  • 而對固態磁盤來說,雖然它的隨機性能比機械硬盤好很多,但同樣存在“先擦除再寫入”的限制。隨機讀寫會導致大量的垃圾回收,所以相對應的,隨機 I/O 的性能比起連續 I/O 來,也還是差了很多。
  • 此外,連續 I/O 還可以通過預讀的方式,來減少 I/O 請求的次數,這也是其性能優異的一個原因。很多性能優化的方案,也都會從這個角度出發,來優化 I/O 性能。
此外,機械磁盤和固態磁盤還分別有一個最小的讀寫單位。
  • 機械磁盤的最小讀寫單位是扇區,一般大小為 512 字節。
  • 而固態磁盤的最小讀寫單位是頁,通常大小是 4KB、8KB 等。
在上一節中,我也提到過,如果每次都讀寫 512 字節這么小的單位的話,效率很低。所以,文件系統會把連續的扇區或頁,組成邏輯塊,然后以邏輯塊作為最小單元來管理數據。常見的邏輯塊的大小是 4KB,也就是說,連續 8 個扇區,或者單獨的一個頁,都可以組成一個邏輯塊。

按照接口來分類

除了可以按照存儲介質來分類,另一個常見的分類方法,是按照接口來分類,比如可以把硬盤分為 IDE(Integrated Drive Electronics)、SCSI(Small Computer System Interface) 、SAS(Serial Attached SCSI) 、SATA(Serial ATA) 、FC(Fibre Channel) 等。不同的接口,往往分配不同的設備名稱。比如, IDE 設備會分配一個 hd 前綴的設備名,SCSI 和 SATA 設備會分配一個 sd 前綴的設備名。如果是多塊同類型的磁盤,就會按照 a、b、c 等的字母順序來編號。除了磁盤本身的分類外,當你把磁盤接入服務器后,按照不同的使用方式,又可以把它們劃分為多種不同的架構。最簡單的,就是直接作為獨立磁盤設備來使用。這些磁盤,往往還會根據需要,劃分為不同的邏輯分區,每個分區再用數字編號。比如我們前面多次用到的 /dev/sda ,還可以分成兩個分區 /dev/sda1 和 /dev/sda2。另一個比較常用的架構,是把多塊磁盤組合成一個邏輯磁盤,構成冗余獨立磁盤陣列,也就是 RAID(Redundant Array of Independent Disks),從而可以提高數據訪問的性能,并且增強數據存儲的可靠性。根據容量、性能和可靠性需求的不同,RAID 一般可以劃分為多個級別,如 RAID0、RAID1、RAID5、RAID10 等。
  • RAID0 有最優的讀寫性能,但不提供數據冗余的功能。
  • 而其他級別的 RAID,在提供數據冗余的基礎上,對讀寫性能也有一定程度的優化。
最后一種架構,是把這些磁盤組合成一個網絡存儲集群,再通過 NFS、SMB、iSCSI 等網絡存儲協議,暴露給服務器使用。其實在 Linux 中,磁盤實際上是作為一個塊設備來管理的,也就是以塊為單位讀寫數據,并且支持隨機讀寫。每個塊設備都會被賦予兩個設備號,分別是主、次設備號。主設備號用在驅動程序中,用來區分設備類型;而次設備號則是用來給多個同類設備編號。

通用塊層

跟我們上一節講到的虛擬文件系統 VFS 類似,為了減小不同塊設備的差異帶來的影響,Linux 通過一個統一的通用塊層,來管理各種不同的塊設備。通用塊層,其實是處在文件系統和磁盤驅動中間的一個塊設備抽象層。它主要有兩個功能 。
  • 第一個功能跟虛擬文件系統的功能類似。向上,為文件系統和應用程序,提供訪問塊設備的標準接口;向下,把各種異構的磁盤設備抽象為統一的塊設備,并提供統一框架來管理這些設備的驅動程序。
  • 第二個功能,通用塊層還會給文件系統和應用程序發來的 I/O 請求排隊,并通過重新排序、請求合并等方式,提高磁盤讀寫的效率。

四種 I/O 調度算法

其中,對 I/O 請求排序的過程,也就是我們熟悉的 I/O 調度。事實上,Linux 內核支持四種 I/O 調度算法,分別是 NONE、NOOP、CFQ 以及 DeadLine。這里我也分別介紹一下。
  • 第一種 NONE ,更確切來說,并不能算 I/O 調度算法。因為它完全不使用任何 I/O 調度器,對文件系統和應用程序的 I/O 其實不做任何處理,常用在虛擬機中(此時磁盤 I/O 調度完全由物理機負責)。
  • 第二種 NOOP ,是最簡單的一種 I/O 調度算法。它實際上是一個先入先出的隊列,只做一些最基本的請求合并,常用于 SSD 磁盤。
  • 第三種 CFQ(Completely Fair Scheduler),也被稱為完全公平調度器,是現在很多發行版的默認 I/O 調度器,它為每個進程維護了一個 I/O 調度隊列,并按照時間片來均勻分布每個進程的 I/O 請求。類似于進程 CPU 調度,CFQ 還支持進程 I/O 的優先級調度,所以它適用于運行大量進程的系統,像是桌面環境、多媒體應用等。
  • 最后一種 DeadLine 調度算法,分別為讀、寫請求創建了不同的 I/O 隊列,可以提高機械磁盤的吞吐量,并確保達到最終期限(deadline)的請求被優先處理。DeadLine 調度算法,多用在 I/O 壓力比較重的場景,比如數據庫等。

I/O 棧

清楚了磁盤和通用塊層的工作原理,再結合上一期我們講過的文件系統原理,我們就可以整體來看 Linux 存儲系統的 I/O 原理了。我們可以把 Linux 存儲系統的 I/O 棧,由上到下分為三個層次,分別是文件系統層、通用塊層和設備層。這三個 I/O 層的關系如下圖所示,這其實也是 Linux 存儲系統的 I/O 棧全景圖。(圖片來自 Linux Storage Stack Diagram )根據這張 I/O 棧的全景圖,我們可以更清楚地理解,存儲系統 I/O 的工作原理。
  • 文件系統層,包括虛擬文件系統和其他各種文件系統的具體實現。它為上層的應用程序,提供標準的文件訪問接口;對下會通過通用塊層,來存儲和管理磁盤數據。
  • 通用塊層,包括塊設備 I/O 隊列和 I/O 調度器。它會對文件系統的 I/O 請求進行排隊,再通過重新排序和請求合并,然后才要發送給下一級的設備層。
  • 設備層,包括存儲設備和相應的驅動程序,負責最終物理設備的 I/O 操作。
存儲系統的 I/O ,通常是整個系統中最慢的一環。所以, Linux 通過多種緩存機制來優化 I/O 效率。比方說,為了優化文件訪問的性能,會使用頁緩存、索引節點緩存、目錄項緩存等多種緩存機制,以減少對下層塊設備的直接調用。同樣,為了優化塊設備的訪問效率,會使用緩沖區,來緩存塊設備的數據。不過,抽象的原理講了這么多,具體操作起來,應該怎么衡量磁盤的 I/O 性能呢?我先賣個關子,下節課我們一起來看,最常用的磁盤 I/O 性能指標,以及 I/O 性能工具。

小結

在今天的文章中,我們梳理了 Linux 磁盤 I/O 的工作原理,并了解了由文件系統層、通用塊層和設備層構成的 Linux 存儲系統 I/O 棧。其中,通用塊層是 Linux 磁盤 I/O 的核心。向上,它為文件系統和應用程序,提供訪問了塊設備的標準接口;向下,把各種異構的磁盤設備,抽象為統一的塊設備,并會對文件系統和應用程序發來的 I/O 請求進行重新排序、請求合并等,提高了磁盤訪問的效率。思考最后,我想邀請你一起來聊聊,你所理解的磁盤 I/O。我相信你很可能已經碰到過,文件或者磁盤的 I/O 性能問題,你是怎么分析這些問題的呢?你可以結合今天的磁盤 I/O 原理和上一節的文件系統原理,記錄你的操作步驟,并總結出自己的思路。有一個糾正一下:ISCSI訪問的是塊設備,不是NAS。作者回復: 是的,這里有些不準確,原來的意思是想表達網絡存儲,用 NAS 這樣的專業術語就不準確了。謝謝指出。通用塊層是屬于內核調度嗎?raid 應該屬于哪一層?作者回復: 嗯,是的。RAID分軟件RAID和硬件RAID,其中軟件RAID屬于bio層

總結

以上是生活随笔為你收集整理的24丨基础篇:Linux磁盘I-O是怎么工作的(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。