一文解決擴(kuò)展用戶文件系統(tǒng)框架(ExtFUSE)整理
Extension Framework for File Systems in User space(簡(jiǎn)稱ExtFUSE)
1.FUSE 是什么?
FUSE是開(kāi)發(fā)用戶文件系統(tǒng)的最新框架。Fuse框架理論上包含一個(gè)內(nèi)核模塊(fuse.ko)和一個(gè)用戶空間守護(hù)進(jìn)程(下文稱FUSE file-system daemon,其基于libfuse庫(kù)實(shí)現(xiàn))。
但FUSE 框架具體包含了 3 個(gè)組件:
內(nèi)核模塊 fuse.ko :用來(lái)接收 vfs 傳遞下來(lái)的 IO 請(qǐng)求,并且把這個(gè) IO 封裝之后通過(guò)管道發(fā)送到用戶態(tài);
用戶態(tài) lib 庫(kù) libfuse :解析內(nèi)核態(tài)轉(zhuǎn)發(fā)出來(lái)的協(xié)議包,拆解成常規(guī)的 IO 請(qǐng)求;
mount 工具:fusermount
內(nèi)核模塊fuse.ko
內(nèi)核模塊fuse.ko加載時(shí)被注冊(cè)成 Linux 虛擬文件系統(tǒng)的一個(gè) fuse 文件系統(tǒng)驅(qū)動(dòng)。此外,還注冊(cè)了一個(gè)/dev/fuse的塊設(shè)備。該塊設(shè)備作為FUSE file-system daemon與內(nèi)核通信的橋梁,F(xiàn)USE file-system daemon通過(guò)/dev/fuse讀取fuse request,處理后將reply寫入/dev/fuse。
libfuse庫(kù)
該庫(kù)為開(kāi)發(fā)者提供了兩組不同的API。首先,一個(gè)fuse_lowlevel_ops接口,該接口導(dǎo)出所有VFS操作,例如查找路徑到inode映射。它被需要訪問(wèn)低級(jí)抽象的文件系統(tǒng)使用(例如,inodes)用于自定義優(yōu)化。第二,一個(gè)構(gòu)建在低級(jí)API之上的高級(jí)fuse_operations接口。它隱藏了復(fù)雜的抽象,并提供了一個(gè)簡(jiǎn)單的API,便于開(kāi)發(fā)。根據(jù)它們的特定用例,開(kāi)發(fā)人員可以采用這兩組API中的任何一種。此外,這兩組API中的許多操作都是可選的。
(1)struct fuse_lowlevel_ops的成員如下所示,其中init方法在其它所有方法之前調(diào)用,用于初始化文件系統(tǒng),fuse已經(jīng)實(shí)現(xiàn),destroy則是在文件系統(tǒng)被卸載時(shí)做一些清理工作。用于大多數(shù)請(qǐng)求的參數(shù)都是fuse_ino_t類型的ino,而文件系統(tǒng)提供給用戶的視圖是以文件名呈現(xiàn)的,故lookup是實(shí)現(xiàn)文件系統(tǒng)的關(guān)鍵,它在parent中查找名字name對(duì)應(yīng)的文件,并返回相應(yīng)的信息,可使用fuse_reply_entry或fuse_reply_err作為請(qǐng)求的返回。
用戶實(shí)現(xiàn)的接口是如何跟這個(gè)結(jié)構(gòu)關(guān)聯(lián)起來(lái)的?
FUSE中已經(jīng)實(shí)現(xiàn)了一組接口,在fuse_lowlevel.c中,定義了一個(gè)靜態(tài)的結(jié)構(gòu)數(shù)組,該數(shù)組的元素為一組(函數(shù),名字)的結(jié)構(gòu),但沒(méi)做什么實(shí)際的工作,當(dāng)FUSE用戶空間的FUSE file-system daemon從/fuse/dev中讀取到請(qǐng)求之后,它通過(guò)請(qǐng)求號(hào)來(lái)判別各個(gè)請(qǐng)求,并調(diào)用這里相應(yīng)的處理函數(shù),如讀取到read調(diào)用時(shí),會(huì)調(diào)用do_read進(jìn)行處理。
接下來(lái)以do_read()的實(shí)現(xiàn)為例:
(2)FUSE提供了一組更簡(jiǎn)單的接口fuse_operations,詳細(xì)說(shuō)明請(qǐng)參考fuse.h。這組接口的參數(shù)跟Unix提供的系統(tǒng)調(diào)用的參數(shù)很類似,開(kāi)發(fā)者更易理解,F(xiàn)USE想開(kāi)發(fā)者屏蔽了底層的相關(guān)對(duì)象,直接以文件名作為參數(shù),只有開(kāi)發(fā)者按照自己的方式,把這組接口實(shí)現(xiàn)就可以。
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ?


FUSE的核心機(jī)制:內(nèi)核-用戶通信

在FUSE中,內(nèi)核和用戶空間之間的通信是通過(guò)一種稱為"通信通道"(Communication Channel)的機(jī)制來(lái)實(shí)現(xiàn)的。這個(gè)通道是在內(nèi)核和用戶空間之間建立的一個(gè)基于內(nèi)存的、虛擬的、雙向的通信管道,可以通過(guò)它進(jìn)行數(shù)據(jù)的傳輸和命令的交互。它是FUSE實(shí)現(xiàn)的核心部分,負(fù)責(zé)傳遞文件系統(tǒng)操作請(qǐng)求和操作結(jié)果,是FUSE實(shí)現(xiàn)用戶空間和內(nèi)核之間交互的核心機(jī)制。
具體來(lái)說(shuō),當(dāng)用戶空間的FUSE文件系統(tǒng)需要向內(nèi)核發(fā)送一個(gè)請(qǐng)求時(shí),它會(huì)通過(guò)一個(gè)特殊的虛設(shè)備文件(/dev/fuse)向內(nèi)核發(fā)起請(qǐng)求,并等待內(nèi)核的響應(yīng)。內(nèi)核在接收到請(qǐng)求后,會(huì)通過(guò)FUSE通信通道將請(qǐng)求傳輸給用戶空間的FUSE進(jìn)程,F(xiàn)USE進(jìn)程收到請(qǐng)求后進(jìn)行相應(yīng)的處理,并將處理結(jié)果返回給內(nèi)核,最終內(nèi)核再將處理結(jié)果傳遞給FUSE文件系統(tǒng)。
需要注意的是,F(xiàn)USE通信通道是一種基于內(nèi)存的通信方式,因此數(shù)據(jù)的傳輸速度非???。同時(shí),F(xiàn)USE還支持多個(gè)文件系統(tǒng)同時(shí)掛載的情況,每個(gè)文件系統(tǒng)都可以擁有自己的通信通道,以保證并發(fā)訪問(wèn)的效率。
用戶文件系統(tǒng)(FUSE)的實(shí)現(xiàn)過(guò)程:
當(dāng)application掛載(fusermount)到fuse文件系統(tǒng)上,并且執(zhí)行一些系統(tǒng)調(diào)用時(shí),VFS會(huì)將這些操作發(fā)送至fuse driver,fuse driver創(chuàng)建了一個(gè)fuse request結(jié)構(gòu)體,并把request保存在請(qǐng)求隊(duì)列中。此時(shí),執(zhí)行操作的進(jìn)程會(huì)被阻塞,同時(shí)fuse daemon通過(guò)讀取/dev/fuse將request從內(nèi)核隊(duì)列中取出,并且提交操作到底層文件系統(tǒng)中(例如 EXT4 或 F2FS)。當(dāng)處理完請(qǐng)求后,fuse daemon會(huì)將reply寫回/dev/fuse,fuse driver此時(shí)把requset標(biāo)記為completed,最終喚醒用戶進(jìn)程。
內(nèi)核文件系統(tǒng)的實(shí)現(xiàn)過(guò)程:
在用戶態(tài)發(fā)出應(yīng)用命令之后,調(diào)用read()(此處以讀取文件為例)系統(tǒng)調(diào)用,傳遞給VFS層的sys_read()函數(shù),sys_read()根據(jù)文件fd指定的索引,從當(dāng)前進(jìn)程描述符中取出相應(yīng)的file對(duì)象,并調(diào)用vfs_read執(zhí)行相應(yīng)文件的file->f_op.read()讀取操作,之后通過(guò)ext2_file_operations()結(jié)構(gòu)(此處以EXT2文件系統(tǒng)為例)調(diào)用do_sync_read(),do_sync_read()函數(shù)會(huì)執(zhí)行page cache操作及一系列判斷,最終生成BIO。接著執(zhí)行mpage_submit_bio()函數(shù)調(diào)用通用處理層的入口函數(shù)——generic_make_request(),將bio傳送到IO調(diào)度層進(jìn)行處理。IO調(diào)度層對(duì)bio進(jìn)行合并、排序,以提高IO效率,然后,調(diào)用設(shè)備驅(qū)動(dòng)層的回調(diào)函數(shù),request_fn,轉(zhuǎn)到設(shè)備驅(qū)動(dòng)層處理。設(shè)備驅(qū)動(dòng)層中的request函數(shù)對(duì)請(qǐng)求隊(duì)列中每個(gè)bio進(jìn)行分別處理,根據(jù)bio中的信息向磁盤控制器發(fā)送命令,處理完成后,調(diào)用完成函數(shù)end_bio以通知上層完成。
用戶文件系統(tǒng)與內(nèi)核文件系統(tǒng)區(qū)別:
1) FUSE除了能夠使用普通用戶進(jìn)行掛載外,文件系統(tǒng)的元數(shù)據(jù)和數(shù)據(jù)操作也都是由用戶空間的進(jìn)程來(lái)實(shí)現(xiàn),并且能夠使用內(nèi)核文件系統(tǒng)的接口進(jìn)行訪問(wèn);
2) FUSE的引入極大的方便了文件系統(tǒng)的開(kāi)發(fā)和調(diào)試,相對(duì)于復(fù)雜的內(nèi)核文件系統(tǒng),無(wú)需編寫任何內(nèi)核代碼,無(wú)需重新編譯內(nèi)核,維護(hù)上也由此變得簡(jiǎn)單,
FUSE內(nèi)核隊(duì)列

FUSE在內(nèi)核中維護(hù)了五個(gè)隊(duì)列,分別為:Backgroud、Pending、Processing、Interrupts、Forgets。一個(gè)請(qǐng)求在任何時(shí)候只會(huì)存在于一個(gè)隊(duì)列中。
1) Backgroud:background 隊(duì)列用于暫存異步請(qǐng)求。在默認(rèn)情況下,只有讀請(qǐng)求進(jìn)入 background 隊(duì)列;當(dāng)writeback cache啟用時(shí),寫請(qǐng)求也會(huì)進(jìn)入 background 隊(duì)列。當(dāng)開(kāi)啟writeback cache時(shí),來(lái)自用戶進(jìn)程的寫請(qǐng)求會(huì)先在頁(yè)緩存中累積,然后當(dāng)bdflush 線程被喚醒時(shí)會(huì)下刷臟頁(yè)。在下刷臟頁(yè)時(shí),F(xiàn)USE會(huì)構(gòu)造異步請(qǐng)求,并將它們放入 background 隊(duì)列中。
2) Pending:同步請(qǐng)求(例如,元數(shù)據(jù))放在 pending 隊(duì)列中,并且pending隊(duì)列會(huì)周期性接收來(lái)自background 的請(qǐng)求。但是pending隊(duì)列中異步請(qǐng)求的個(gè)數(shù)最大為max_background(最大為12),當(dāng)pending隊(duì)列的異步請(qǐng)求未達(dá)到12時(shí),background隊(duì)列的請(qǐng)求將被移動(dòng)到pending隊(duì)列中。這樣做的目的是為了控制pending隊(duì)列中異步請(qǐng)求的個(gè)數(shù),防止在突發(fā)大量異步請(qǐng)求的情況下,阻塞了同步請(qǐng)求。
3) Processing:當(dāng)pending隊(duì)列中的請(qǐng)求被轉(zhuǎn)發(fā)到fuse daemon的同時(shí),也被移動(dòng)到processing隊(duì)列。所以processing隊(duì)列中的請(qǐng)求,表示正在被處理fuse daemon處理的請(qǐng)求。當(dāng)fuse daemon真正處理完請(qǐng)求,通過(guò)/dev/fuse下發(fā)reply時(shí),該請(qǐng)求將從processing隊(duì)列中刪除。
4) Interrupts:用于存放中斷請(qǐng)求,比如當(dāng)發(fā)送的請(qǐng)求被用戶取消時(shí),內(nèi)核會(huì)發(fā)送一個(gè)Interrupts請(qǐng)求,來(lái)取消已被發(fā)送的請(qǐng)求。中斷請(qǐng)求的優(yōu)先級(jí)最高,Interrupts中的請(qǐng)求會(huì)最先得到處理。
5) Forgets:forget請(qǐng)求用于刪除dcache中緩存的inode。
2.ExtFUSE:使用eBPF優(yōu)化FUSE的性能

ExtFUSE的實(shí)現(xiàn)框架圖如上所示,它由三個(gè)核心組件啟用,即內(nèi)核文件系統(tǒng)(驅(qū)動(dòng)程序)、用戶庫(kù)(libExtFUSE)和內(nèi)核內(nèi)eBPF虛擬機(jī)運(yùn)行時(shí)(VM)。
ExtFUSE驅(qū)動(dòng)程序使用插入技術(shù)在低級(jí)文件系統(tǒng)操作中與FUSE兼容。然而,與FUSE驅(qū)動(dòng)程序只是將文件系統(tǒng)請(qǐng)求打包轉(zhuǎn)發(fā)到用戶空間不同,ExtFUSE驅(qū)動(dòng)程序能夠直接將請(qǐng)求傳遞到內(nèi)核處理程序(擴(kuò)展)。它還可以將一些受限的請(qǐng)求集(例如,讀、寫)轉(zhuǎn)發(fā)到主機(jī)(下)文件系統(tǒng)(如果存在的話)。后者對(duì)于在主機(jī)文件系統(tǒng)之上添加精簡(jiǎn)功能的可堆疊用戶文件系統(tǒng)是必需的。libExtFUSE導(dǎo)出一組api和抽象,用于在內(nèi)核中服務(wù)請(qǐng)求,隱藏底層實(shí)現(xiàn)細(xì)節(jié)。
libExtFUSE的使用是可選的,獨(dú)立于lifuse。向libfuse注冊(cè)的現(xiàn)有文件系統(tǒng)處理程序繼續(xù)駐留在用戶空間中。因此,它們的調(diào)用會(huì)引起上下文切換,因此,我們將它們的執(zhí)行稱為慢路徑。使用ExtFUSE,用戶空間還可以注冊(cè)內(nèi)核擴(kuò)展,當(dāng)從VFS接收到文件系統(tǒng)請(qǐng)求時(shí)立即調(diào)用這些擴(kuò)展,以便允許在內(nèi)核中提供這些擴(kuò)展。我們將內(nèi)核內(nèi)執(zhí)行稱為快速路徑。根據(jù)快速路徑的返回值,可以將請(qǐng)求標(biāo)記為已服務(wù),或者通過(guò)慢路徑將請(qǐng)求發(fā)送到用戶空間守護(hù)進(jìn)程,以便根據(jù)需要進(jìn)行復(fù)雜的處理??焖俾窂竭€可以返回一個(gè)特殊值,指示ExtFUSE驅(qū)動(dòng)程序插入并將請(qǐng)求轉(zhuǎn)發(fā)到下層文件系統(tǒng)。但是,此特性僅適用于可堆疊的用戶文件系統(tǒng),并且在內(nèi)核中加載擴(kuò)展時(shí)進(jìn)行驗(yàn)證。
ExtFUSE的擴(kuò)展核心機(jī)制:eBPF map通信
eBPF map是eBPF(擴(kuò)展伯克利數(shù)據(jù)包過(guò)濾器)框架中用于存儲(chǔ)和檢索數(shù)據(jù)的內(nèi)存數(shù)據(jù)結(jié)構(gòu)。eBPF是一種技術(shù),允許在內(nèi)核中安全地執(zhí)行用戶定義的代碼,而map是eBPF運(yùn)行時(shí)環(huán)境的關(guān)鍵組成部分。 eBPF map可以被視為鍵值存儲(chǔ)。它們用于在內(nèi)核和用戶空間中運(yùn)行的eBPF程序之間傳遞數(shù)據(jù),以及在不同的eBPF程序之間傳遞數(shù)據(jù)。可以使用BPF系統(tǒng)調(diào)用創(chuàng)建和操作映射。
eBPF map數(shù)據(jù)結(jié)構(gòu)定義時(shí)一般包括以下四個(gè)要素:
map_type: map類型
key_size: map鍵大小
value_size: map值的大小
max_entries: map的元素最大容量
例如:
有以下幾種類型的eBPF map,包括:
1) Hash map:這是最常用的eBPF映射類型。它們使用哈希表數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)數(shù)據(jù)的高效存儲(chǔ)和檢索。
2) Array map:這些映射將數(shù)據(jù)存儲(chǔ)在數(shù)組中,并可以使用索引進(jìn)行訪問(wèn)。
3) Per-CPU map:這些映射允許對(duì)每個(gè)CPU數(shù)據(jù)進(jìn)行高效的存儲(chǔ)和檢索。它們對(duì)于在多個(gè)CPU之間并行化工作非常有用。
4) LRU map:這些映射實(shí)現(xiàn)了最近最少使用的逐出策略,允許高效地存儲(chǔ)和檢索頻繁訪問(wèn)的數(shù)據(jù)。
5) Stack map:這些映射允許從棧中推入和彈出數(shù)據(jù)。
eBPF map是內(nèi)核應(yīng)用程序開(kāi)發(fā)人員的強(qiáng)大工具。它們?cè)试S在內(nèi)核和用戶空間之間以及不同的eBPF程序之間進(jìn)行高效和安全的數(shù)據(jù)共享。
eBPF map的更多信息詳見(jiàn)于:(https://blog.csdn.net/qq_18643341/article/details/125233822)
ExtFUSE的工作流程
為了了解ExtFUSE如何促進(jìn)可擴(kuò)展用戶文件系統(tǒng)的實(shí)現(xiàn),我們?cè)敿?xì)描述了其工作流。在裝入用戶文件系統(tǒng)后,F(xiàn)USE驅(qū)動(dòng)程序會(huì)向用戶空間守護(hù)進(jìn)程發(fā)送FUSE_INIT請(qǐng)求。此時(shí),用戶守護(hù)進(jìn)程通過(guò)在請(qǐng)求參數(shù)中查找FUSE_CAP_EXTFUSE標(biāo)志來(lái)檢查操作系統(tǒng)內(nèi)核是否支持ExtFUSE框架。如果受到支持,守護(hù)進(jìn)程必須調(diào)用libExtFUSE init API來(lái)將包含專門處理程序(擴(kuò)展)的eBPF程序加載到內(nèi)核中,并向ExtFUSE驅(qū)動(dòng)程序注冊(cè)它們。這是通過(guò)使用bpf_load_prog系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn)的,它會(huì)調(diào)用eBPF驗(yàn)證器來(lái)檢查擴(kuò)展的完整性。如果失敗,該程序?qū)⒈粊G棄,并通知用戶空間守護(hù)進(jìn)程出現(xiàn)錯(cuò)誤。然后,守護(hù)進(jìn)程可以退出或繼續(xù)使用默認(rèn)的FUSE功能。如果驗(yàn)證步驟成功,并且啟用了JIT引擎,則JIT編譯器將處理擴(kuò)展,以生成根據(jù)需要準(zhǔn)備執(zhí)行的機(jī)器裝配代碼。
擴(kuò)展被安裝在一個(gè)bpf_prog_type映射(稱為擴(kuò)展映射)中,它可以有效地充當(dāng)一個(gè)跳轉(zhuǎn)表。為了調(diào)用擴(kuò)展,F(xiàn)USE驅(qū)動(dòng)程序只需使用FUSE操作代碼(例如,F(xiàn)USE_OPEN)作為擴(kuò)展映射的索引來(lái)執(zhí)行bpf_tail_call(跳遠(yuǎn))。一旦加載了eBPF程序,守護(hù)進(jìn)程必須通過(guò)reply包含到擴(kuò)展映射的標(biāo)識(shí)符的FUSE_INIT來(lái)通知ExtFUSE驅(qū)動(dòng)程序有關(guān)內(nèi)核擴(kuò)展。
一旦收到通知,ExtFUSE就可以在運(yùn)行時(shí)在eBPF VM環(huán)境下安全地加載和執(zhí)行擴(kuò)展。每個(gè)請(qǐng)求首先傳遞到快速路徑,快速路徑可以決定 (1)服務(wù)它(例如,使用在快速路徑和慢路徑之間共享的數(shù)據(jù)),(2)將請(qǐng)求傳遞到較低的文件系統(tǒng)(例如,在修改參數(shù)或執(zhí)行訪問(wèn)檢查之后),或 (3)根據(jù)需要采用慢路徑并將請(qǐng)求傳遞到用戶空間進(jìn)行復(fù)雜的處理邏輯(例如,數(shù)據(jù)加密)。由于執(zhí)行路徑是按請(qǐng)求獨(dú)立選擇的,并且總是首先調(diào)用快速路徑,因此內(nèi)核擴(kuò)展和用戶守護(hù)進(jìn)程可以協(xié)同工作,同步對(duì)請(qǐng)求和共享數(shù)據(jù)結(jié)構(gòu)的訪問(wèn)。需要注意的是,ExtFUSE驅(qū)動(dòng)程序僅充當(dāng)FUSE驅(qū)動(dòng)程序和內(nèi)核擴(kuò)展之間的薄插入層,在某些情況下,還充當(dāng)FUSE驅(qū)動(dòng)程序和底層文件系統(tǒng)之間的薄插入層。因此,它不執(zhí)行任何I/O操作,也不嘗試自己為請(qǐng)求提供服務(wù)。
性能優(yōu)化

優(yōu)化的結(jié)果如上圖所示。圖中顯示了對(duì)內(nèi)核做編譯操作和解壓縮操作的測(cè)試情況下監(jiān)測(cè)應(yīng)用層操作的對(duì)比。文件系統(tǒng)使用的是作者開(kāi)發(fā)的用戶態(tài)文件系統(tǒng)StackFS,AllOpt表示對(duì)READ和WRITE操作也在內(nèi)核中進(jìn)行了直接返回,而不發(fā)到應(yīng)用層。MDOpt操作表示只是對(duì)元數(shù)據(jù)在內(nèi)核中直接返回,Opt是原始的FUSE,不做eBPF的優(yōu)化。
優(yōu)化結(jié)果:
1) 在內(nèi)核的編譯測(cè)試中,可以看到getattr,getxattr,lookup的用戶態(tài)操作都降低了很多。
2) 在內(nèi)核的解壓縮測(cè)試中,可以看到需要在用戶態(tài)處理的getattr,getxattr元數(shù)據(jù)操作明顯減少。
ExtFUSE框架的具體實(shí)現(xiàn)
Extfuse的eBPF框架分為4個(gè)部分:
1) linux內(nèi)核增加ExtFUSE的eBPF的程序類型;2) 在FUSE的內(nèi)核中增加ebfp的掛載點(diǎn)以及相應(yīng)的鉤子函數(shù),并增加輔助函數(shù);3)設(shè)計(jì)相應(yīng)的eBPF掛載函數(shù);4)在用戶態(tài)文件系統(tǒng)建立與內(nèi)核共同使用的eBPF map。并在相關(guān)的元數(shù)據(jù)操作中維護(hù)eBPF map。
ExtFUSE框架的優(yōu)勢(shì)和劣勢(shì)
使用eBPF函數(shù)可以降低元數(shù)據(jù)操作使用用戶態(tài)文件系統(tǒng)接口的頻率,如果能根據(jù)文件系統(tǒng)或者應(yīng)用的操作提前預(yù)加載相關(guān)的元數(shù)據(jù)確實(shí)能降低用戶態(tài)文件系統(tǒng)的元數(shù)據(jù)開(kāi)銷,提升文件操作的性能。
存在的問(wèn)題是需要對(duì)FUSE的內(nèi)核做改動(dòng)以及l(fā)inux的內(nèi)核bpf部分做相應(yīng)的修改,優(yōu)化場(chǎng)景會(huì)有比較的的限制。
ExtFUSE總結(jié)
Extfuse框架提供了優(yōu)化FUSE文件系統(tǒng)開(kāi)銷的思路,通過(guò)使用eBPF提供的hash map建立了inode cache,降低了元數(shù)據(jù)操作的開(kāi)銷,用戶態(tài)文件系統(tǒng)可以通過(guò)統(tǒng)計(jì)以及預(yù)測(cè)app的行為來(lái)預(yù)加載inode cache到VFS中,從而提升了文件系統(tǒng)的元數(shù)據(jù)操作性能。用戶態(tài)文件系統(tǒng)需要改動(dòng)的地方也不多,主要是維護(hù)用戶態(tài)與內(nèi)核態(tài)共享的eBPF hash map (用于存放inode cache)。不過(guò)由于它目前對(duì)linux內(nèi)核和FUSE模塊還是有一些改動(dòng),增加了使用的難度,降低了使用場(chǎng)景。
原文作者:Linux內(nèi)核之旅
