f2fs学习笔记 - 1. f2fs概述
1. 前言
本文主要從總體的角度來了解f2fs,嘗試回答下面的幾個問題來靠近它,這幾個問題包括:
- f2fs是什么?
- 為何引入f2fs?
- f2fs如何工作?
2. f2fs是什么?
F2FS (Flash Friendly File System) 是專門針對SSD、eMMC、UFS等閃存設備設計的文件系統。基于LFS,同時解決了LFS的一些問題。由三星工程師Jaegeuk Kim于2012年10月發布到Linux社區,并于2012年12月進入Linux 3.8 內核主線,初始 版本包含22個patch。初始版本kernel 3.8(2012年)的代碼量為1萬多行,22個提交,截止到kernel 5.8-rc2(2020年)的代碼量為4萬多行,2899個提交。
3. LFS特點
LFS最大的特點是以日志的形式將對文件的修改順序寫入磁盤,化隨機寫入為順序寫入,如上創建文件file1,file2,創建目錄dir1,dir2,對于FFS會有10次的隨機寫入,而對于LFS將以日志的方式一次從內存中寫入, 同時也要寫入inode map,inode map記錄了每個inode所在的block地址,索引為inode號,inode map所在的block地址被記錄在F2FS的CP區域。
Flash memory的特點
(1)Out-place 更新 (非in-place更新)
(2)隨機寫入會增加GC垃圾回收開銷
(3)順序寫入速率高于隨機寫入速率
LFS的特點
(1)Out-place更新
(2)大量的采用順序寫入
因此LFS對Flash memory是友好的文件系統 ,而f2fs基于LFS,因此也是對flash友好的文件系統
LFS的不足:
(1)針對HDD進行優化的文件系統布局
(2)仍然存在Wandering Tree(雪崩)問題
(3)沒有進行冷熱數據分離
(4)磁盤高利用率的情況下垃圾回收成本高
4. f2fs解決了哪些問題?
采用falsh友好的文件系統布局
解決了Wandering Tree(雪崩)問題
傳統的LFS索引結構,由于異地更新在修改文件數據時會引發直接或間接node以及inode和inode map的一系列修改,稱為wandering tree問題
F2FS索引結構,通過引入NAT,保存所有node的信息,間接node不再指向直接node,而是指向NAT區,解決了wandering tree問題
使用Multi-head log,同時將冷熱數據分離
main area分為node block和data block
將node block和data block進行冷熱分離
有效減少GC cost
node block與data block分離, 冷熱數據分離,將不同數據存放到不同的zone中,有利于FTL進行GC垃圾回收,如上圖,假設zone對應flash中的一個block,則zone-aware allocation可以做到冷熱數據分配到不同的zone,也就分配到不同的flash block中
采用自適應的log方式
- Normal logging
追加式logging,只會向clean segment寫入
如果沒有空閑空間,需要執行GC操作
GC操作會帶來隨機讀和順序寫開銷 - Thread logging
向dirty的segment寫入
不需要GC操作
會引起隨機寫入 - Normal logging與thread logging的切換
當空閑空間低于閥值(e.g.k=5% )將采用thread logging,否則采用normal logging
5. f2fs是如何工作的?
f2fs文件讀取(/File)
- Setp 1首先通過superblock獲取root inode號(==nid,假設為3),通過NAT獲取root inode所在的node block地址
- Setp 2 通過root inode找到root目錄的data block地址
- Setp 3 通過文件名File遍歷每一個entry,找到File對應的inode號,通過inode號(==nid)查NAT
- Setp 4 通過NAT找到File的inode所在的node block地址,它存儲了File的direct node的nid(假設為7)
- Setp 5 通過file的inode找到direct node的nid(假設為7),通過查找NAT,找到direct node的node block地址
- Setp 6 File的direct node中保存著File的data block的地址,根據這些data block地址就可以讀取到File的數據
F2FS GC垃圾回收
-
GC回收分為foreground gc和background gc
當沒有足夠空閑的segment(一般是小于reserved segments)時將啟動foreground gc
當系統沒有進行IO操作時,將啟動background gc thread,回收的時間間隔會根據invalid blocks的多少進行調整
foreground gc采用greedy算法,只考慮dirty invalid blocks數目; background gc采用cost-benefit算法,還考慮了segment的修改時間 -
Cost-benefit算法
cost_benefit = (1 - u) / 2u * age
u: 表示valid block在該section中的比例
1-u: 表示對這個section進行gc后的收益
2u: 表示對這個section的GC的開銷,讀取Valid block(1個u)然后寫入到到新的segment(再1個u)
age: 表示上一次修改距離現在的時間差
NOTE:cost_benefit值越大表示越值得回收
F2FS checkpoint
Checkpoint執行的操作:
Header和footer checkpoint page;
NAT bitmap和SIT bitmap
NAT journal和SIT journal
Active segments的summary blocks
Orphan blocks
F2FS recovery
step 1 創建dir1, file1, file2
step 2 觸發checkpoint,此時數據與元數據保持一致性狀態
step 3 更新file2, 并將記錄file2更新數據塊號的new file2 node作fsync mark標記
step 4 此時更新的new file2后并沒有執行checkpoint,發生了斷電,數據和元數據不一致
step 5 執行修復,首先通過roll-back,找到最新的穩定的checkpoint pack版本
step 6 比較file2 node和new file2 node中所記錄的data block塊號是否相等,如果不相等將執行roll-forward恢復
step 6 執行新的checkpoint
參考文檔
Lee et. al, F2FS: A New File System for Flash Storage, FAST ’15
Linux/Document/filesystems/f2fs.txt
F2FS技術拆解
F2FS源碼分析-1.3 [F2FS 元數據布局部分] Checkpoint結構
f2fs系列文章——sit/nat_version_bitmap
http://www.ssdfans.com/?p=5135 greedy和cost-and-benefit
https://github.com/jasonactions/f2fs-initial f2fs初始版本注釋
總結
以上是生活随笔為你收集整理的f2fs学习笔记 - 1. f2fs概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux一键ghost,linux 下
- 下一篇: 分离开发中的laravel