頁高速緩存
頁高速緩存是Linux kernel使用的主要的磁盤緩存技術。磁盤高速緩存是一種軟件機制,它允許系統把存放在磁盤上的一些數據保留在內存中,以便對那些數據的再次訪問不再需要訪問磁盤。
Kernel在讀取磁盤時,如果數據頁不再高速緩存當中,就會將讀出的磁盤數據填充到頁高速緩存當中。通過將數據頁在高速緩存當中駐留,從而使進程再使用該頁時不再需要訪問磁盤。
Kernel在把一頁數據寫到磁盤之前,首先檢查頁是否已經在高速緩存當中,如果不在,首先會將頁數據填充到高速緩存當中。更新到磁盤I/O的動作不是立即進行的,而是會有一點延時,從而使進程有機會對寫入的數據進一步修改,這就是內核的延遲寫操作。
髒數據的同步
進程對頁高速緩衝區中的數據修改之後,數據頁被標記爲”髒數據”,即把PG_Dirty標誌置位。Linux系統允許對髒數據寫入磁盤塊設備的延遲操作,被認爲是顯著增加了系統I/O能力的一種機制。
在下列條件下,髒數據寫入磁盤:
頁高速緩存空間不足
變髒以來,太久沒有過更新
進程通過系統調用(sync(),fsync(),fdataasync())來強行對將對快設備的更新同步到磁盤。Msync系統調用用來將內存映射狀態下的髒數據刷新到磁盤。
Pdflush
Pdflush內核線程負責定期掃描緩存中的髒數據,並在合適的時候將其更新到磁盤。定時器一般是500分之一秒,可以通過/proc/sys/vm/dirty_writeback_centisecs文件調整這個值。 Pdflush線程的個數是根據情況動態調整的:
至少有2個,最多有8個pdflush線程。(通過/proc/sys/vm/nr_pdflush_threads參數)可以修改這些變量的值。
如果最近1s內,沒有空閒的pdflush線程,就創建新的。
如果pdflush的空閒時間超過了1s,就刪除一個pdflush。
Buffer/cache
Cache - 全稱page cache。當進程發起對磁盤的讀寫操作時,主要用來在內存中緩存磁盤中的數據,與磁盤的同步由pdflush負責。
Buffer – 全稱block buffer。Block buffer中存放的是bio結構體數據。BIO 結構體是VFS和 block layer之間的接口。通俗的理解,Block buffer是page cache和磁盤驅動器之間打交道的一層緩存。
系統頁高速緩存的使用情況可以通過buffer/cache的監控數據來分析。
從文件讀寫角度來看,buffer多用於緩存文件的管理信息,如目錄位置,inode信息等。Cache緩存的是文件內容。
由於CPU不能直接處理外設上的數據,buffer用來標記那些文件的位置等描述信息。Cache主要目的是增加傳輸性能,用於緩存文件內容。
Direct I/O
有一些更復雜的程序(通常稱爲自緩存應用程序),更願意自己控制I/O的傳輸過程(),通過將O_DIRECT標誌位置位,I/O數據的傳送便繞過了頁高速緩存。 出於以下原因,系統頁高速緩存技術是有害的:
處理頁高速緩存的多餘指令,降低了read(),write()的效率
Read(),write()系統調用不是在磁盤和用戶空間直接傳送,而是分成兩步:在磁盤和內核空間,>在內核空間到用戶空間。 與頁高速緩存相關的系統參數
/proc/sys/vm/dirty_background_ratio 表示系統可用內存中,最高可用於存儲 dirty 數據的百分比。The maximum of percentage of((cache+free)-mapped)。缺省10%。
/proc/sys/vm/dirty_ratio 表示進程產生的髒數據到達系統整體內存的百分比,此時觸發pdflush進程把數據回寫到磁盤。缺省設置40.
/proc/sys/vm/dirty_expire_centisecs 表示髒數據在內存中駐留超過該值,pdflush會將該數據回寫到磁盤。缺省是3000。
/proc/sys/vm/dirty_writeback_centisecs 表示pdflush週期性間隔多久處理髒數據回寫。