[ext4]13 空間管理

來源:互聯網
上載者:User



作者:Younger Liu,

本作品採用知識共用署名-非商業性使用-相同方式共用 3.0 未語言版本許可協議進行許可。


    在ext4系統中,對於小檔案和大檔案的空間申請請求,都有不同的分配策略。

    對用小檔案的空間請求,ext4嘗試從一種叫per-CPU local group中分配空閑空間。Per-CPU Localgroup就是所有該CPU所執行的分配行為共用的空間,目的是保證這些小檔案的聚集在一起,便於訪問。Per-CPU Local group就是per-CPU prealloc空間。

對於大檔案的空間請求,ext4嘗試從一種叫per-inode preallo空間中分配空閑空間。這點就像Ext3系統的保留空間一樣,Ext4為每個檔案在記憶體中維護一段預分配空間,用於解決並發分配情況下的片段問題。

Ext4系統維護這兩個preallocation空間:per-inode preallocation空間和per-CPUpreallocation空間。

而大小檔案的鑒別標準,使用者自己可以通過以下介面調整:

/prof/fs/ext4/<partition>/stream_req

預設為16,單位是block;如果totalsize小於stream_req個block,則從per-CPU preallocation中分配。

這裡說明幾個關鍵詞:在本系列中,per-inode prealloc即是per-file的,也稱per-file prealloc;per-CPU prealloc即是locality group allocation。


1.  如何識別檔案是大是小?


剛才已經說過,根據檔案的大小來選擇是採用per-CPU allocation還是per-inode allocation。那麼大小檔案的鑒別標準是什麼哪?

這份工作是在ac初始化中由函數ext4_mb_group_or_file()完成的:

size = ac->ac_o_ex.fe_logical + EXT4_C2B(sbi,ac->ac_o_ex.fe_len);

        isize= (i_size_read(ac->ac_inode) + ac->ac_sb->s_blocksize - 1)

                  >>bsbits;

        /*don't use group allocation for large files */

        size= max(size, isize);

        if(size > sbi->s_mb_stream_request) {

                  ac->ac_flags|= EXT4_MB_STREAM_ALLOC;

                  return;

        }

 

        BUG_ON(ac->ac_lg!= NULL);

        /*

         * locality group prealloc space are per cpu.The reason for having

         * per cpu locality group is to reduce thecontention between block

         * request from multiple CPUs.

         */

        ac->ac_lg= __this_cpu_ptr(sbi->s_locality_groups);

 

        /*we're going to use group allocation */

        ac->ac_flags|= EXT4_MB_HINT_GROUP_ALLOC;

1.估算出檔案的大小size:i_size或size

2.比較size與stream_req的大小;如果大於,則通過設定GROUP_ALLOC來標示per-CPU preallocation可用。

需要注意的時,並不是僅僅檢查這一項,還需要檢查以下幾項:

1.如果當前寫操作是檔案的最後的邏輯block、並且檔案系統不忙及檔案已經關閉,就不能再採取prealloc了。(該patch是Ted提交,解決問題“掛載、在目錄中寫4K檔案,卸載;重複64次導致片段化”)

        if((size == isize) &&

            !ext4_fs_is_busy(sbi) &&

           (atomic_read(&ac->ac_inode->i_writecount) == 0)) {

                  ac->ac_flags|= EXT4_MB_HINT_NOPREALLOC;

                  return;

        }

2.檢查sbi->s_mb_group_prealloc是否小於等於0,如果是,採用

    sbi->s_mb_group_prealloc表示per-CPU prealloc的空間大小;預設值是512blocks(不考bigalloc),可通過/sys/fs/ext4/<partition>/mb_group_prealloc設定。

sbi->s_mb_group_prealloc小於或等於0,表示無需per-CPU prealloc了。

        if(sbi->s_mb_group_prealloc <= 0) {

                  ac->ac_flags|= EXT4_MB_STREAM_ALLOC;

                  return;

        }

 

既然知道了什麼時候可以使用per-inode prealloc、per-CPU prealloc,那麼接下來就來分析下,如何建立。


2.  建立prealloc空間


在MultiBlockallocator分配器的主函數ext4_mb_new_blocks()中,當ac_b_ex extent的長度大於ac_o_ex extent(originextent)的長度時,multiblock allocator會調用函數ext4_mb_new_preallocation ()將多出來的空間以prealloc形式預留下來。當然,多出來的空間,multiblock allocator不捨得還給系統,只想保留下來備用;如果ac_b_exextent的長度不大於ac_o_ex extent的長度,那麼即使multiblock allocator有預留的想法,也沒有空間去prealloc了。

【註:ac_b_ex,即best found extent,用於描述在分配中發現的最佳extent,並申請之,通過multiblock allocator分配給目標inode。ac_o_ex,即origin extent,用於描述原始請求的一些資訊。這些結構體都已經在[分配機制 -關鍵的資料結構]中說明】

ext4_mb_new_preallocation()函數中會涉及inode prealloc和per-CPU prealloc。

ext4_mb_new_preallocation()代碼如下:

static int ext4_mb_new_preallocation(structext4_allocation_context *ac)

{

        interr;

 

        if(ac->ac_flags & EXT4_MB_HINT_GROUP_ALLOC)

                 err = ext4_mb_new_group_pa(ac);

        else

                  err= ext4_mb_new_inode_pa(ac);

        returnerr;

}

先來分析per-CPU prealloc空間的建立。

在函數ext4_mb_new_group_pa()中,初始化一個prealloc描述符ext4_prealloc_space pa,用於存放prealloc的資訊,完成賦值後,將將pa串連到鏈表ext4_group_info->bb_prealloc_list上。由此可見,per-CPU prealloc是具有locality的,因為prealloc是掛載到group結構體中某個鏈表上

當然,也許有要說,在初始化ext4_prealloc_space pa時有:

pa->pa_len = ac->ac_b_ex.fe_len;

        pa->pa_free= pa->pa_len;

這一點無需擔心,pa_free會在ac釋放時更新為空白閑空間的長度。

   下面再說一下per-inode的建立,即函數ext4_mb_new_inode_pa()。

在per-inode prealloc初始化中,還的得必須關注一個extent描述符ac->ac_g_ex,該extent執行個體是描述由ext4_mb_normalize_request()normalize後goal extent。

首先比較分配的最佳ac_b_ex與目標ac_g_ex的長度,如果小於後者,說沒有達標所要求的則需要更新ac_b_ex的起始邏輯塊地址;如果不小於後者,則不但將該prealloc空間添加到鏈表ext4_group_info->bb_prealloc_list,也會添加到ext4_inode_info->i_prealloc_list鏈表中。

此時per-inode prealloc也初始化完畢。 


  空間有了,那就分析如何使用吧。

 

3.  Prealloc空間的使用


multiblock allocator在分配塊時,首先考慮的都是prealloc空間,調用函數ext4_mb_use_preallocated()。

從prealloc空間中分配塊時,分配器先查看per-inode prealloc空間,即搜尋鏈表ext4_inode_info ->i_prealloc_list,這個鏈表中包含於該inode有關的所有的prealloc空間。

使用prealloce空間,是基於_logical_起始block的:只有當指定的邏輯塊號落在了prealloc空間範圍之內,分配器才會使用prealloc空間,這樣可以保證檔案空間物理地址的連續性。

如果在per-inode prealloc空間中沒有找到可用blocks,並且per-CPU preallocation分配器是可用的,則嘗試從locality group prealloc空間中進行分配,就是per-CPUprealloc list:

ext4_sb_info.s_locality_groups[smp_processor_id()]

per-CPU locality group的存在,可以減少CPU之間在空間分配過程中的資源競爭。 


   Prealloc空間畢竟是預留但未用的空間,所以必須是要釋放的。

4.  釋放prealloc空間

Prealloc空間有兩種:per-inode prealloc空間、per-CPU prealloc空間。在建立那節已經討論,per-CPU prealloc空間可以通過ext4_group_info->bb_prealloc_list檢索到,通過inode無法檢索;而per-inode prealloc空間不但串連到ext4_inode_info-> i_prealloc_list鏈表上,也會串連到ext4_group_info->bb_prealloc_list鏈表中檢索到。

1.釋放指定的prealloc空間,調用ext4_mb_release_inode_pa()或ext4_mb_release_group_pa()函數實現。

2.基於給定的inode,銷毀所有未用的prealloc空間,可使用函數ext4_discard_preallocations(),其思想如下:將inode的i_prealloc_list鏈表上所有的prealloc空間移動到鏈表list上,之所以使用臨時鏈表,減少競爭帶來耗時。然後基於臨時鏈表,先將prealloc空間從所屬的ext4_group_info->bb_prealloc_list上刪除,然後調用ext4_mb_release_inode_pa()釋放該prealloc空間,然後從臨時鏈表上將該prealloc空間節點刪除。

3.基於給定的group,銷毀與其有關的所有未用的prealloc空間,調用函數ext4_mb_discard_group_preallocations()實現,其思想與(2)方法一致。 

關於Prealloc機制,就分析到此吧。


作者:Younger Liu,

本作品採用知識共用署名-非商業性使用-相同方式共用 3.0 未語言版本許可協議進行許可。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.