日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

F2FS nat entry涉及的数据结构(linux 5.18.11)

發(fā)布時間:2023/12/8 linux 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 F2FS nat entry涉及的数据结构(linux 5.18.11) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

nat entry(簡稱ne)在代碼中涉及多個數(shù)據(jù)結(jié)構(gòu),先上圖。

圖1 ne涉及的數(shù)據(jù)結(jié)構(gòu)關(guān)系圖

大的原則

1)紅色部分是disk layout中的(持久化存儲);藍色部分是內(nèi)存數(shù)據(jù)結(jié)構(gòu)。

2)系統(tǒng)中所有的ne,緩存在nat cache中(radix tree管理),用于快速檢索ne。

3)所有clean狀態(tài)的ne,通過clean list管理。

4)一個NAT block中的所有ne,歸屬于同一個set;所有的set通過radix tree管理。引入set的目的是為了在將dirty ne刷入disk時,屬于同一個block的呢會被一起寫入block,提高性能和存儲設(shè)備壽命。

5)系統(tǒng)內(nèi)存壓力大時,f2fs_balance_fs會回收clean狀態(tài)的ne。

6)dirty ne的block add是NEW_ADDR時,說明是剛分配的,checkpoint時不需要寫回存儲設(shè)備,也是出于性能、壽命考慮。

7)journal是能用盡量用的,即使checkpoint后,journal中也會存在一些ne,這些ne還沒有寫回nat block。這也是出于性能考慮,如果不用journal緩存ne,那么ne就需要寫回nat block,這會導(dǎo)致頻繁的寫disk;而用journal則可以將所有的ne一次性寫入checkpoint的cp pack區(qū)域。

圖1執(zhí)行路徑描述

1)掛載f2fs場景。從disk layout的cp pack區(qū)域讀入journal,存于struct curseg_info->journal中。

f2fs_fill_super -->?f2fs_build_segment_manager -->?build_curseg -->?restore_curseg_summaries -->?read_compacted_summaries 或 read_normal_summaries

cp pack、compatced/normal summaries概念參考待整理文章

2)第一次訪問ne,并且disk NAT區(qū)域沒有該ne場景。在內(nèi)存中,這些ne是新創(chuàng)建的,需記錄在nat cache和clean list中。

比如在文件尾部寫新數(shù)據(jù);lseek到hole區(qū)域,等等。

eg1:在文件尾部寫新數(shù)據(jù),分配了新的block

vfs_write --> new_sync_write --> call_write_iter --> f2fs_file_write_iter -> f2fs_buffered_write_iter --> generic_perform_write --> f2fs_write_begin --> prepare_write_begin --> f2fs_get_block --> f2fs_reserve_block --> f2fs_get_dnode_of_data --> f2fs_new_node_page --> set_node_addr??--> __init_nat_entry

eg2:seek到文件的空洞區(qū)域

vfs_llseek --> f2fs_llseek --> f2fs_seek_block --> f2fs_get_dnode_of_data --> f2fs_new_node_page --> set_node_addr

3)第一次訪問ne,這個ne存在于disk NAT區(qū)域。在內(nèi)存中,這些ne是新創(chuàng)建的,需記錄在nat cache和clean list中。

比如更新文件數(shù)據(jù),,被更新的數(shù)據(jù)塊已經(jīng)存在與disk上。

vfs_write --> new_sync_write --> call_write_iter --> f2fs_file_write_iter --> f2fs_preallocate_blocks --> f2fs_map_blocks --> f2fs_get_dnode_of_data --> f2fs_new_node_page --> set_node_addr?--> __init_nat_entry

4)checkpoint時,journal(內(nèi)存)中的ne在mount讀取后一直沒訪問過,并且journal(內(nèi)存)中沒有空間容納臟ne了,journal(內(nèi)存)中的ne將被nat cache和clean list記錄起來

f2fs_write_checkpoint -->?f2fs_flush_nat_entries -->

?if (cpc->reason & CP_UMOUNT ||!__has_cursum_space(journal,nm_i->nat_cnt[DIRTY_NAT], NAT_JOURNAL))remove_nats_in_journal(sbi);

系統(tǒng)中所有的ne都會記錄在nat cache中。除非被路徑10或11回收,否則ne一直作為緩存存在系統(tǒng)中。

5)修改ne的場景,常見于做了set_node_addr操作,修改后的ne被移入dirty list

eg1:序號2中寫文件場景。f2fs lfs模式更新文件數(shù)據(jù),需新分配了一個block,所以會修改ne的block address,執(zhí)行set_node_addr。

eg2:在目錄中創(chuàng)建了一個文件。

f2fs_create --> f2fs_add_link --> f2fs_do_add_link --> f2fs_add_dentry --> f2fs_add_regular_entry --> f2fs_init_inode_metadata --> f2fs_new_inode_page --> f2fs_new_node_page --> set_node_addr --> __set_nat_cache_dirty

6)checkpoint時,journal(內(nèi)存)中沒有空間容納dirty list中的ne了,不能放入journal中的ne將被寫入page中

f2fs_write_checkpoint -->?f2fs_flush_nat_entries -->?__flush_nat_entry_set -->?

?if ((cpc->reason & CP_UMOUNT) ||!__has_cursum_space(journal, set->entry_cnt, NAT_JOURNAL))to_journal = false;if (to_journal) {down_write(&curseg->journal_rwsem);} else {/* 獲取ne所在的nat block,讀入page */page = get_next_nat_page(sbi, start_nid);if (IS_ERR(page))return PTR_ERR(page);nat_blk = page_address(page);f2fs_bug_on(sbi, !nat_blk);}……/* 更新ne信息到page */raw_ne = &nat_blk->entries[nid - start_nid];raw_nat_from_node_info(raw_ne, &ne->ni);……

7)checkpoint時,journal(內(nèi)存)中還有空間容納dirty list中的ne,dirty list中的ne移至dirty list

f2fs_write_checkpoint -->?f2fs_flush_nat_entries -->?__flush_nat_entry_set -->?

/* flush dirty nats in nat entry set */list_for_each_entry_safe(ne, cur, &set->entry_list, list) {struct f2fs_nat_entry *raw_ne;nid_t nid = nat_get_nid(ne);int offset;f2fs_bug_on(sbi, nat_get_blkaddr(ne) == NEW_ADDR);if (to_journal) {/* * 如果journal中有ne,則返回ne所在的位置偏移 * 如果journal中沒有ne,則返回journal下一個空閑位置*/offset = f2fs_lookup_journal_in_cursum(journal,NAT_JOURNAL, nid, 1);f2fs_bug_on(sbi, offset < 0);/* 獲取journal中的ne */raw_ne = &nat_in_journal(journal, offset);nid_in_journal(journal, offset) = cpu_to_le32(nid);}else {raw_ne = &nat_blk->entries[nid - start_nid];}/* 更新journal中ne信息 */raw_nat_from_node_info(raw_ne, &ne->ni);nat_reset_flag(ne);__clear_nat_cache_dirty(NM_I(sbi), set, ne);

8)checkpoint時,journal中的ne寫入cp pack區(qū)域(即持久化存儲)

f2fs_write_checkpoint --> do_checkpoint --> f2fs_write_data_summaries --> write_compacted_summaries 或?write_normal_summaries

mount f2fs時,路徑1讀取compatcted/normal?summaries到內(nèi)存中。

9)臟元數(shù)據(jù)頁寫入nat block(即持久化存儲)

worker_thread --> process_one_work --> wb_workfn --> wb_do_writeback --> wb_check_start_all或wb_check_background_flush --> wb_writeback --> __writeback_inodes_wb --> writeback_sb_inodes --> __writeback_single_inode --> do_writepages --> f2fs_write_meta_pages

kworker線程將臟頁數(shù)據(jù)寫入storage device。在大多數(shù)情況下,kworker線程周期性回寫臟頁數(shù)據(jù),但也可能因系統(tǒng)臟頁過多而主動回寫。

10)系統(tǒng)內(nèi)存壓力大時,回收clean狀態(tài)的ne

f2fs_balance_fs -->?f2fs_balance_fs_bg -->?f2fs_try_to_free_nats -->?__del_from_nat_cache -->?__free_nat_entry

只要內(nèi)存中生成ne,都會緩存在nat cache中(最大數(shù)量10萬個,見宏定義DEF_NAT_CACHE_THRESHOLD),系統(tǒng)內(nèi)存壓力大的時候,需要回收clean狀態(tài)的ne,避免f2fs對系統(tǒng)內(nèi)存的影響。checkpoint或者f2fs_write_node_pages都會觸發(fā)f2fs_balance_fs_bg,然后根據(jù)系統(tǒng)內(nèi)存使用情況決定是否回收ne。

void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi, bool from_bg) {if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))return;/* try to shrink extent cache when there is no enough memory */if (!f2fs_available_free_memory(sbi, EXTENT_CACHE))f2fs_shrink_extent_tree(sbi, EXTENT_CACHE_SHRINK_NUMBER);/* check the # of cached NAT entries */if (!f2fs_available_free_memory(sbi, NAT_ENTRIES))f2fs_try_to_free_nats(sbi, NAT_ENTRY_PER_BLOCK);

11)umount時回收ne

f2fs_put_super -->?f2fs_destroy_node_manager -->?__del_from_nat_cache -->??__free_nat_entry

總結(jié)

以上是生活随笔為你收集整理的F2FS nat entry涉及的数据结构(linux 5.18.11)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。