硬盤性能提升100倍的秘密:看懂順序I/O的魔力
I/O緩存
局部性原理
局部性原理(Principle of Locality)指在程序執行過程中,傾向于訪問某些局部特定的數據或指令,而不是隨機地訪問整個內存空間。這是緩存技術得以有效的根本原因。
1)時間局部性(Temporal Locality):如果一個數據項被訪問,那么在不久的將來它很可能被再次訪問(如循環中的變量、常用函數)。
2)空間局部性(Spatial Locality):如果一個數據項被訪問,那么物理地址鄰近它的數據項也很可能在不久的將來被訪問(如順序執行的指令、數組元素的遍歷)。
局部性原理,很好平衡了存儲介質的存取速率和成本的問題。以計算機存儲層次為例,寄存器緩存高速緩存的數據,高速緩存 L1~L3層視具體實現彼此緩存或直接緩存內存的數據,而內存往往緩存來自本地硬盤的數據。
Page Cache

操作系統內核為了提升磁盤I/O性能,利用主存中的一部分空間作為磁盤數據的緩存,這就是Page Cache(在Linux中如此稱呼,也稱Buffer Cache)。它位于應用程序的read/write系統調用與底層塊設備驅動之間,利用局部性原理工作。
1)當一個數據頁被從硬盤讀取到內存時,它被存儲在Page Cache中。如果這個數據頁在近期內被再次訪問(時間局部性),那么可以直接從Page Cache中讀取,而無需再次訪問硬盤。
2)當一個數據頁被讀取時,操作系統通常會預讀取一些附近的數據頁(空間局部性),并將它們也存儲在Page Cache中,以便后續的訪問。
Page Cache的大小是根據當前系統的可用內存和工作負載動態調整的,此外還會通過頁面置換算法如 LRU (Least Recently Used)定期淘汰舊的數據頁。Page Cache可以大大減少硬盤I/O,從而提高系統的性能。
Page Cache支持寫回(Write-back)和寫穿(Write-through)兩種策略:
1)在寫回策略中,當程序寫入數據時,數據首先被寫入Page Cache,然后在適當的時機被寫入硬盤。
2)在寫穿策略中,數據同時被寫入Page Cache和硬盤。
Linux下默認使用寫回策略,即文件操作的寫只寫到Page Cache就返回。Page Cache中被修改的內存頁稱之為臟頁(Dirty Page),臟頁在特定的時候被一個叫做pdflush(Page Dirty Flush)的內核線程寫入硬盤,寫入的時機和條件如下:
1)當空閑內存低于一個特定的閾值時。
2)當臟頁在內存中駐留時間超過一個特定的閾值時。
3)用戶進程調用sync()、fsync(fd)、fdatasync(fd)系統調用時。
順序I/O

順序I/O(Sequential I/O)是一種數據訪問模式,其中數據按照連續的順序進行讀取或寫入。這與隨機I/O(Random I/O)形成對比,隨機I/O是指數據的訪問位置在存儲設備上是隨機分布的。
順序I/O的性能之所以高,主要是因為它能夠最大化利用存儲設備的局部性原理,并且減少了尋道時間和旋轉延遲。
1)局部性原理:在順序I/O中,數據是連續讀取或寫入的,Page Cache可以將文件的連續數據塊緩存在內存中,以提供快速的連續讀取。此外Page Cache可以將內存中緩存的連續數據,比如按頁大小批次刷新到硬盤。這樣可以減少頻繁的硬盤寫入操作。
2)減少機械硬盤的尋道時間和旋轉延遲:尋道操作指磁頭移動到硬盤的正確軌道的過程,旋轉延遲指磁頭等待硬盤旋轉到正確位置的時間。在順序I/O中,由于數據是連續存儲的,因此可以大大減少尋道時間和旋轉延遲,從而提高I/O性能。
3)雖然固態硬盤沒有機械部件,隨機讀性能遠好于機械硬盤,但順序I/O仍然更優。這是因為固態硬盤內部以頁(Page,如4KB/8KB/16KB)為單位讀寫,以塊(Block,通常包含多個頁,如128-512KB)為單位擦除。隨機寫小數據塊可能導致“讀-修改-擦除-寫”的復雜流程,引發寫放大。順序寫則能更高效地利用NAND閃存的特性,減少內部管理開銷。
內存訪問速度和硬盤訪問速度的對比結果。
1)硬盤訪問時間等于尋道時間+旋轉時間+傳輸時間的總和。
尋道時間:8ms~12ms;
旋轉時間:7200轉/min:半周4ms;
傳輸時間:50M/s,約0.3ms 。
2)性能量級對比:硬盤隨機I/O ? 硬盤順序I/O(尤其對HDD) ≈ 內存隨機I/O? 內存順序I/O(內存的順序訪問也能受益于處理器 Cache Line的填充等)。
3)機械硬盤和固態硬盤構成:
機械硬盤:核心是高速旋轉的磁盤盤片(表面覆蓋磁性材料)和在盤片上移動的磁頭臂。通過改變磁性材料的極性來存儲0和1。
固態硬盤:核心是NAND閃存顆粒(Flash Memory)陣列,由主控芯片負責管理數據的讀寫、磨損均衡、垃圾回收等。通過在浮柵中存儲電荷來表示0和1。

未完待續
很高興與你相遇!如果你喜歡本文內容,記得關注哦!!!
本文來自博客園,作者:poemyang,轉載請注明原文鏈接:http://www.rzrgm.cn/poemyang/p/19038725
浙公網安備 33010602011771號