ext4的延遲分配

2021-06-17 21:28:04 字數 1598 閱讀 5757

ext4檔案系統在應用程式呼叫write的時候並不為快取頁面分配對應的物理磁碟塊,當檔案的快取頁面真正要被重新整理至磁碟中時,ext4會為所有未分配物理磁碟塊的頁面快取分配盡量連續的磁碟塊。

linux檔案系統vfs層總是將應用程式的寫入請求分割成頁面(預設大小4kb)為單位,對於每個頁面,vfs會檢查其是否已經為其建立了buffer_head結構,如果沒有建立,則為其建立buffer_head,否則檢查每個buffer_head的狀態,如該buffer_head是否已經與物理磁碟塊建立對映等,這些功能是由write_begin()函式實現的,該函式是由vfs提供的乙個介面,具體檔案系統負責實現該介面,如ext3檔案系統的ext3_write_begin()。而ext4如果採用了delay allocation特性的話,其實現的函式為ext4_da_write_begin()。

以上我們確認了在ext4中延遲分配的前半部分,即應用程式將資料寫入檔案時只是簡單地將資料以頁面為單位寫入頁面快取中,而並不真正地為其分配物理磁碟塊。接下來我們要弄明白的是,ext4何時會為快取中未分配物理磁碟塊的快取分配磁碟空間。

當重新整理執行緒開始將髒的快取頁面寫回至物理磁碟時,根據我們之前的描述,回寫執行緒會以檔案為單位進行回寫,即對髒inode鍊錶上的所有髒inode依次回寫。對於每個髒inode(也即每個髒的檔案),回寫執行緒會將inode上的所有髒頁面進行回寫,這時候就需要判斷每個髒頁面的狀態了。

回寫執行緒中實現的時候將乙個檔案的髒頁面分多次進行回寫,每個回寫一部分髒頁面。關於回寫機制可參考linux的「髒頁面回寫機制」。回寫髒頁面最終呼叫到函式writepages,與writebegin一樣,它也是vfs提供的乙個虛擬介面,由具體檔案系統負責相應的實現。對於採用延遲分配的ext4檔案系統來說,該函式的具體實現是ext4_da_writepages()。該函式中實現的時候有三個要點:

要將邏輯上連續的髒且尚未建立磁碟塊對映到物理頁面形成乙個extent,以便可採用ext4的mblock分配策略提公升檔案連續性,這也是我們後面要介紹的內容;

對1中連續頁面形成的extent,為其進行磁碟塊分配,分配採用了ext4的mblock allocation策略。

提交2中的extent至bio層完成髒頁面的寫入,此時已經為尚未對映的快取頁面分配了物理磁碟塊。

上圖描述了延遲分配的核心思想:等到重新整理髒快取頁面時再建立髒頁面與物理磁碟塊之間的聯絡,而且,分配之前將邏輯上連續的檔案塊對映至物理上連續的磁碟塊。在ext4_da_writepages()函式中呼叫了三個非常重要的函式來完成上述功能:write_cache_pages_da()負責將邏輯上連續的檔案塊合併成乙個extent;mpage_da_map_blocks()負責為合併後的extent建立對映關係;mpage_da_submit_io()負責提交上面對映的extent。

ext4 關閉延遲分配

ext4的延遲分配特性 delalloc 保證檔案在磁碟中的連續,提高檔案的讀寫效能,但是卻增加了丟資料的概率。hadoop和hbase中建議將延遲分配特性關閉。可以使用下面的方法關閉延遲分配 linux檔案系統的一些概念 superblock 記錄檔案系統的整體資訊,包含inode block的大...

Ext4使用總結(四)Ext4跨命名空間 引用

呼叫端ext的載入配置 ext.loader.setconfig 在公用的命名域內,可以做action,event,logic等的處理,如下圖 在plugin中的controller資料夾中的commoncontroller中,可以定義如下的頁面引用 refs displayitem,引用了不同命名...

ext4使用總結(四)Ext4跨命名空間 引用

呼叫端ext的載入配置 ext.loader.setconfig 在公用的命名域內,可以做action,event,logic等的處理,如下圖 img 在plugin中的controller資料夾中的commoncontroller中,可以定義如下的頁面引用 refs displayitem,引用了...