幾個io術語

頁高速緩存

頁高速緩存是Linux kernel使用的主要的磁盤緩存技術。磁盤高速緩存是一種軟件機制,它允許系統把存放在磁盤上的一些數據保留在內存中,以便對那些數據的再次訪問不再需要訪問磁盤。

Kernel在讀取磁盤時,如果數據頁不再高速緩存當中,就會將讀出的磁盤數據填充到頁高速緩存當中。通過將數據頁在高速緩存當中駐留,從而使進程再使用該頁時不再需要訪問磁盤。

Kernel在把一頁數據寫到磁盤之前,首先檢查頁是否已經在高速緩存當中,如果不在,首先會將頁數據填充到高速緩存當中。更新到磁盤I/O的動作不是立即進行的,而是會有一點延時,從而使進程有機會對寫入的數據進一步修改,這就是內核的延遲寫操作。

髒數據的同步

進程對頁高速緩衝區中的數據修改之後,數據頁被標記爲”髒數據”,即把PG_Dirty標誌置位。Linux系統允許對髒數據寫入磁盤塊設備的延遲操作,被認爲是顯著增加了系統I/O能力的一種機制。

在下列條件下,髒數據寫入磁盤:

  1. 頁高速緩存空間不足

  2. 變髒以來,太久沒有過更新

  3. 進程通過系統調用(sync(),fsync(),fdataasync())來強行對將對快設備的更新同步到磁盤。Msync系統調用用來將內存映射狀態下的髒數據刷新到磁盤。

Pdflush

Pdflush內核線程負責定期掃描緩存中的髒數據,並在合適的時候將其更新到磁盤。定時器一般是500分之一秒,可以通過/proc/sys/vm/dirty_writeback_centisecs文件調整這個值。 Pdflush線程的個數是根據情況動態調整的:

  1. 至少有2個,最多有8個pdflush線程。(通過/proc/sys/vm/nr_pdflush_threads參數)可以修改這些變量的值。

  2. 如果最近1s內,沒有空閒的pdflush線程,就創建新的。

  3. 如果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數據的傳送便繞過了頁高速緩存。 出於以下原因,系統頁高速緩存技術是有害的:

  1. 處理頁高速緩存的多餘指令,降低了read(),write()的效率

  2. Read(),write()系統調用不是在磁盤和用戶空間直接傳送,而是分成兩步:在磁盤和內核空間,>在內核空間到用戶空間。 與頁高速緩存相關的系統參數

  3. /proc/sys/vm/dirty_background_ratio 表示系統可用內存中,最高可用於存儲 dirty 數據的百分比。The maximum of percentage of((cache+free)-mapped)。缺省10%。

  4. /proc/sys/vm/dirty_ratio 表示進程產生的髒數據到達系統整體內存的百分比,此時觸發pdflush進程把數據回寫到磁盤。缺省設置40.

  5. /proc/sys/vm/dirty_expire_centisecs 表示髒數據在內存中駐留超過該值,pdflush會將該數據回寫到磁盤。缺省是3000。

  6. /proc/sys/vm/dirty_writeback_centisecs 表示pdflush週期性間隔多久處理髒數據回寫。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章