VFS FS PageCache BlockIO
๋ฆฌ๋ ์ค ์คํ ๋ฆฌ์ง ์คํ ์์ธ ๋ถ์
VFS ยท File System ยท Page Cache ยท Block I/O Layer
์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์ผ์ ์ฝ๊ณ ์ธ ๋, ๊ทธ ์์ฒญ์ ์ฌ๋ฌ ์ปค๋ ๊ณ์ธต์ ๊ฑฐ์ณ ์ ์ฅ์ฅ์น์ ๋๋ฌํฉ๋๋ค. ๋ณธ ๋ฌธ์๋ ๊ทธ ํต์ฌ ๋ค ๊ณ์ธต โ VFS(๊ฐ์ ํ์ผ์์คํ ), ํ์ผ์์คํ (FS), ํ์ด์ง ์บ์(Page Cache), ๋ธ๋ก I/O ๋ ์ด์ด(Block I/O Layer) โ ์ ์ญํ ๊ณผ ๋์ ์๋ฆฌ๋ฅผ ๋ถ์ํฉ๋๋ค.
VFS๋ ๊ฒฝ๋ก ํ์๊ณผ ํ์ผ ๊ฐ์ฒด ์์ฑ์ ๋งก๊ณ , ํ์ผ์์คํ ์ ์ด๋ฆ์ ๋ ผ๋ฆฌ ๋ธ๋ก ์ฃผ์๋ก ๋ฐ๊ฟ๋๋ค. ํ์ด์ง ์บ์๋ read/write๋ฅผ DRAM์์ ํก์ํ๊ณ , ๋ธ๋ก I/O ๋ ์ด์ด๋ bio์ request๋ฅผ ๋ณํฉํด ์ฅ์น ํ๋ก ๋ด๋ ค๋ณด๋ ๋๋ค. buffered I/O๋ ์ด ๊ฒฝ๋ก๋ฅผ ๋ชจ๋ ์ง๋๊ฐ์ง๋ง direct I/O๋ ํ์ด์ง ์บ์๋ฅผ ์ฐํํ๋ฏ๋ก ์ฑ๋ฅ๊ณผ ์ผ๊ด์ฑ์ ์ ์ถฉ์ ์ด ๋ฌ๋ผ์ง๋๋ค.
์ ์ฒด ๊ตฌ์กฐ ๊ฐ์
๋ค ๊ณ์ธต์ ์์์ ์๋๋ก VFS โ ํ์ผ์์คํ โ (ํ์ด์ง ์บ์) โ ๋ธ๋ก I/O ๋ ์ด์ด ์์ผ๋ก ์์ฌ ์์ต๋๋ค. ์ ๊ณ์ธต์ ํ์ผยท๋ฐ์ดํธ ๋จ์๋ก ์ถ์์ ์ผ๋ก ๋์ํ๊ณ , ์๋๋ก ๋ด๋ ค๊ฐ์๋ก ๋ธ๋ก(LBA) ๋จ์์ ๊ตฌ์ฒด์ ์ธ I/O๋ก ๋ณํ๋ฉ๋๋ค. ํ์ด์ง ์บ์๋ ํ์ผ์์คํ ๊ณผ ๋ธ๋ก ๊ณ์ธต ์ฌ์ด์์ ์์ถฉ ์ญํ ์ ํ์ฌ ๋ถํ์ํ ๋์คํฌ ์ ๊ทผ์ ์ฐจ๋จํฉ๋๋ค.
๊ทธ๋ฆผ 1. OS ์คํ ๋ฆฌ์ง ์คํ์ ๋ค ๊ณ์ธต ๊ตฌ์กฐ์ ๋ฐ์ดํฐ ํ๋ฆ
1. VFS (Virtual File System)
VFS๋ ์๋ก ๋ค๋ฅธ ํ์ผ์์คํ ๋ค์ ํ๋์ ๊ณตํต ์ธํฐํ์ด์ค๋ก ์ถ์ํํ๋ ์ปค๋ ๊ณ์ธต์ ๋๋ค. ๋๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ext4๋ XFS๋ NFS๋ ํ์ผ์์คํ ์ข ๋ฅ๋ฅผ ์ ํ์ ์์ด ๋์ผํ ์์คํ ์ฝ(open/read/write/close)๋ก ํ์ผ์ ๋ค๋ฃฐ ์ ์์ต๋๋ค.
๊ทธ๋ฆผ 2. VFS์ ๋ค ๊ฐ์ง ํต์ฌ ๊ฐ์ฒด์ ๊ด๊ณ
VFS ํต์ฌ ๊ฐ์ฒด
ํ๋ก์ธ์ค๊ฐ ํ์ผ์ ์ด๋ฉด file ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ , dentry๋ก ๊ฒฝ๋ก๋ฅผ ํด์ํด inode๋ฅผ ์ฐพ์ ์ค์ ํ์ผ์ ์๋ณํฉ๋๋ค. inode๋ ๋ฐ์ดํฐ ๋ธ๋ก์ ๋ฌผ๋ฆฌ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ, superblock์ด ๊ทธ ํ์ผ์์คํ ์ ์ฒด๋ฅผ ๊ด์ฅํฉ๋๋ค.
dcache์ ๋จ๋ dentry๋ RAM์๋ง ์กด์ฌํ๋ ๊ฒฝ๋ก ํ์ ์บ์์ด๊ณ , inode๋ ํ์ผ์ ํฌ๊ธฐยท๊ถํยท์๊ฐ ์ ๋ณด์ ๋ธ๋ก ์์น๋ฅผ ๋ด๋ ์ค์ฒด์ ๋๋ค.
VFS์ ์ด์
-
ํฌ๋ช ์ฑ โ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ผ์์คํ ์ข ๋ฅ๋ฅผ ๋ชฐ๋ผ๋ ๋์ผํ ์์คํ ์ฝ์ ์ฌ์ฉํฉ๋๋ค.
-
ํ์ฅ์ฑ โ ์ ํ์ผ์์คํ ๋ VFS ์ธํฐํ์ด์ค๋ง ๊ตฌํํ๋ฉด ์ปค๋์ ํตํฉ๋ฉ๋๋ค.
-
ํตํฉ โ ๋์คํฌ FS, ๋คํธ์ํฌ FS(NFS), ๊ฐ์ FS(/proc, tmpfs)๋ฅผ ๋ชจ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ทจ๊ธํฉ๋๋ค.
2. ํ์ผ์์คํ (File System)
ํ์ผ์์คํ ์ VFS๊ฐ ์ ์ํ ์ธํฐํ์ด์ค์ ์ค์ ๊ตฌํ์ฒด๋ก, ํ์ผ์ด๋ผ๋ ์ถ์์ ๊ฐ๋ ์ ์ ์ฅ์ฅ์น์ ๋ ผ๋ฆฌ ๋ธ๋ก(LBA)์ ๋งคํํฉ๋๋ค. ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ, inode ํ ์ด๋ธ, ๋ฐ์ดํฐ ๋ธ๋ก ๋ฐฐ์น, ๊ทธ๋ฆฌ๊ณ ์ผ๊ด์ฑ์ ์ํ ์ ๋๋ง์ ๋ด๋นํฉ๋๋ค.
ํ์ผ์์คํ ์ ํต์ฌ ์ญํ
-
ํ์ผโ๋ธ๋ก ๋งคํ โ ํ์ผ์ ๋ฐ์ดํธ ์คํ์ ์ ์ ์ฅ์ฅ์น์ ๋ ผ๋ฆฌ ๋ธ๋ก ๋ฒํธ๋ก ๋ณํํฉ๋๋ค.
-
๋ฉํ๋ฐ์ดํฐ ๊ด๋ฆฌ โ inode, ๋๋ ํฐ๋ฆฌ ์ํธ๋ฆฌ, ๋นํธ๋งต ๋ฑ์ผ๋ก ํ์ผ ๊ตฌ์กฐ๋ฅผ ์ ์งํฉ๋๋ค.
-
์ ๋๋ง(Journaling) โ ์ฐ๊ธฐ ์์ ์ ๋จผ์ ์ ๋์ ๊ธฐ๋กํ ๋ค ๋ณธ ์์ญ์ ๋ฐ์ํ์ฌ, ๊ฐ์์ค๋ฌ์ด ์ ์ ์ฅ์ ์๋ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
-
๊ณต๊ฐ ํ ๋น โ ๋น ๋ธ๋ก์ ์ถ์ ํ๊ณ ํ์ผ ํ์ฅ ์ ํจ์จ์ ์ผ๋ก ํ ๋นํฉ๋๋ค(extent, ๋นํธ๋งต ๋ฑ).
์ฃผ์ ํ์ผ์์คํ ๋น๊ต
ํนํ F2FS๋ NAND ํ๋์์ โ๋ฎ์ด์ฐ๊ธฐ ๋ถ๊ฐยท์์ฐจ ์ฐ๊ธฐ ์ ํธโ ํน์ฑ์ ๋ง์ถฐ ์ค๊ณ๋ ๋ก๊ทธ ๊ตฌ์กฐ ํ์ผ์์คํ ์ผ๋ก, SSD์ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ถ๋ด์ ์ค์ด๋ ๋ฐฉํฅ์ผ๋ก ๋์ํฉ๋๋ค.
3. ํ์ด์ง ์บ์ (Page Cache)
ํ์ด์ง ์บ์๋ ์ต๊ทผ ์ ๊ทผํ ํ์ผ ๋ฐ์ดํฐ๋ฅผ DRAM์ ๋ณด๊ดํ๋ ์ปค๋์ ์บ์์ ๋๋ค. ์ฝ๊ธฐ๋ ์บ์์์ ์ฆ์ ๋ฐํํ์ฌ ๋์คํฌ ์ ๊ทผ์ ๊ฑด๋๋ฐ๊ณ , ์ฐ๊ธฐ๋ ์ผ๋จ ์บ์์ ๊ธฐ๋กํ ๋ค ๋์ค์ ๋ชจ์์ ๋์คํฌ์ ๋ฐ์(write-back)ํฉ๋๋ค.
๊ทธ๋ฆผ 3. ํ์ด์ง ์บ์์ ์ฝ๊ธฐ(ํํธ/๋ฏธ์ค)์ ์ฐ๊ธฐ(write-back) ๋์
์ฝ๊ธฐ ๋์
-
์บ์ ํํธ โ ์์ฒญํ ๋ฐ์ดํฐ๊ฐ ์บ์์ ์์ผ๋ฉด ๋์คํฌ ์ ๊ทผ ์์ด ์ฆ์ ๋ฐํํฉ๋๋ค(์์ญ ns).
-
์บ์ ๋ฏธ์ค โ ์บ์์ ์์ผ๋ฉด ๋์คํฌ์์ ์ฝ์ด ์บ์์ ์ ์ฌํ ๋ค ๋ฐํํ๋ฉฐ, ์ดํ ์ ๊ทผ์ ํํธ๊ฐ ๋ฉ๋๋ค. read-ahead๋ก ์ด์ด์ง ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ๋ฐ์ ํ๊ธฐ๋ ํฉ๋๋ค.
์ฐ๊ธฐ ๋์ (Write-back)
-
write() ํธ์ถ ์ ๋ฐ์ดํฐ๋ฅผ ํ์ด์ง ์บ์์ ๊ธฐ๋กํ๊ณ ์ฆ์ ๋ฐํํฉ๋๋ค(๋์คํฌ ๊ธฐ๋ก์ ๊ธฐ๋ค๋ฆฌ์ง ์์).
-
ํด๋น ํ์ด์ง๋ฅผ dirty๋ก ํ์ํ๊ณ , ์ปค๋์ writeback ์ค๋ ๋๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ๋์คํฌ์ ๊ธฐ๋กํฉ๋๋ค.
-
fsync()/sync ํธ์ถ ์ dirty page๋ฅผ ๊ฐ์ ๋ก ๋์คํฌ์ flushํ์ฌ ์์์ฑ์ ๋ณด์ฅํฉ๋๋ค.
ํจ๊ณผ์ ์ํ
-
ํจ๊ณผ โ ๋ฐ๋ณต ์ฝ๊ธฐ๋ ์บ์ ํํธ๋ก ์ฆ์ ๋ฐํ๋๊ณ , ์์ ์ฐ๊ธฐ๋ write-back์ผ๋ก ๋ชจ์๋ค๊ฐ ๋ด๋ ค๊ฐ๋ฏ๋ก ๋์คํฌ I/O ํ์์ ์ง์ฐ์ด ์ค์ด๋ญ๋๋ค.
-
์ํ โ dirty page๋ fsync()/fdatasync() ์ ๊น์ง ์์์ ์ด์ง ์์ผ๋ฉฐ, ์ ์ ์ฅ์ ๊ฐ ๋๋ฉด ์์ง ๊ธฐ๋ก๋์ง ์์ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง ์ ์์ต๋๋ค.
-
ํ์ โ ๋ฉ๋ชจ๋ฆฌ ์๋ฐ์ด ์๊ธฐ๋ฉด ํด๋ฆฐ ํ์ด์ง๋ถํฐ ํ์๋๊ณ , dirty ํ์ด์ง๋ ๋จผ์ writeback๋ ๋ค reclaim๋ฉ๋๋ค.
-
์์ธ ๊ฒฝ๋ก โ ์์ํ ๋ฎ์ ์ง์ฐ์ด๋ ์์ธก ๊ฐ๋ฅํ flush๊ฐ ์ค์ํ๋ฉด direct I/O๋ O_DIRECT๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
4. ๋ธ๋ก I/O ๋ ์ด์ด (Block I/O Layer)
๋ธ๋ก I/O ๋ ์ด์ด๋ ์์ ๊ณ์ธต์ I/O ์์ฒญ์ bio ๊ตฌ์กฐ์ฒด๋ก ํํํ์ฌ ๋ธ๋ก ์ฅ์น์ ์ ๋ฌํฉ๋๋ค. ์ด ๊ณผ์ ์์ ์ธ์ ํ ์์ฒญ์ ๋ณํฉยท์ ๋ ฌํ๊ณ , ๋ฉํฐํ(blk-mq) ๊ตฌ์กฐ๋ก ๋ค์ค ์ฝ์ด์ ์์ฒญ์ ๋ณ๋ ฌ ์ฒ๋ฆฌํฉ๋๋ค.
๊ทธ๋ฆผ 4. ๋ธ๋ก I/O ๋ ์ด์ด์ ์์ฒญ ๋ณํฉยท์ ๋ ฌ๊ณผ ๋ฉํฐํ(blk-mq) ๊ตฌ์กฐ
ํต์ฌ ์ญํ
-
์ถ์ํ โ ๋ชจ๋ I/O ์์ฒญ์ bio ๊ตฌ์กฐ์ฒด๋ก ํต์ผํด ํํํ๋ฏ๋ก, ์ด๋ค ๋ธ๋ก ์ฅ์น๋ ๋์ผํ ์ธํฐํ์ด์ค๋ก ๋ค๋ฃน๋๋ค.
-
๋ณํฉ(Merge) โ ์ฐ์๋ LBA์ ๋ํ ์์ฒญ์ ํ๋๋ก ํฉ์ณ I/O ํ์๋ฅผ ์ค์ ๋๋ค.
-
์ ๋ ฌ(Sort) โ HDD์์๋ ํค๋ ์ด๋์ ์ค์ด๊ธฐ ์ํด LBA ์์ผ๋ก ์ ๋ ฌํ์ง๋ง, SSD๋ ํ์ ์๊ฐ์ด ์์ด ์ ๋ ฌ์ ์ต์ํํ๊ฑฐ๋ ์๋ตํฉ๋๋ค.
-
๋ฉํฐํ(blk-mq) โ ์ฝ์ด๋ณ ์ํํธ์จ์ด ํ์ ์ฅ์น์ ํ๋์จ์ด ํ(NVMe SQ)๋ฅผ 2๋จ๊ณ๋ก ๋์ด, ๋จ์ผ ํ์ ๋ฝ ๊ฒฝ์ ๋ณ๋ชฉ์ ์ ๊ฑฐํ๊ณ ๊ณ IOPS๋ก ํ์ฅํฉ๋๋ค.
I/O ์ค์ผ์ค๋ฌ
๋ธ๋ก ๋ ์ด์ด๋ ์์ฒญ ์ฒ๋ฆฌ ์์๋ฅผ ๊ฒฐ์ ํ๋ I/O ์ค์ผ์ค๋ฌ์ ์ฐ๋ํฉ๋๋ค. ์ฅ์น ํน์ฑ์ ๋ง๋ ์ค์ผ์ค๋ฌ๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
SSD์ NVMe์์๋ ๋ณํฉ ๋น์ฉ์ด ๋ฎ์ none์ด๋ mq-deadline ๊ฐ์ ๊ฐ๋ฒผ์ด ์ ์ฑ ์ด ์์ฃผ ์ฐ์ด๊ณ , HDD์์๋ ์์ ์ฌ๋ฐฐ์น์ ์ด๋์ด ๋ ํฝ๋๋ค.
bio์ request
bio๋ ์ฐ์๋ I/O ๊ตฌ๊ฐ์ ํํํ๋ ๋จ์์ด๊ณ , ๋ธ๋ก ๊ณ์ธต์ ์ฌ๋ฌ bio๋ฅผ request๋ก ๋ฌถ์ด ์ฅ์น ๋๋ผ์ด๋ฒ์ ๋๊น๋๋ค. blk-mq๋ ์ํํธ์จ์ด staging queue์ ํ๋์จ์ด dispatch queue๋ฅผ ๋ถ๋ฆฌํด ๋ณ๋ ฌ์ฑ์ ๋์ ๋๋ค.
5. ์ข ํฉ โ read()/write() ์ ์ฒด ๊ฒฝ๋ก
์ฝ๊ธฐ ๊ฒฝ๋ก
์ ํ๋ฆฌ์ผ์ด์ read() โ VFS๊ฐ file/inode๋ก ์์ฒญ ํด์ โ ํ์ผ์์คํ ์ด ํ์ผ ์คํ์ ์ ๋ ผ๋ฆฌ ๋ธ๋ก์ผ๋ก ๋ณํ โ ํ์ด์ง ์บ์ ํ์ธ(ํํธ๋ฉด ์ฆ์ ๋ฐํ) โ ๋ฏธ์ค๋ฉด ๋ธ๋ก I/O ๋ ์ด์ด๊ฐ bio ์์ฑ โ I/O ์ค์ผ์ค๋ฌยท๋๋ผ์ด๋ฒ๋ฅผ ๊ฑฐ์ณ ์ ์ฅ์ฅ์น์์ ์ฝ๊ธฐ โ ํ์ด์ง ์บ์์ ์ ์ฌ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐํ.
read(fd)
โ VFS๊ฐ fd โ struct file โ inode โ i_mapping(address_space) ํ๋
โ ํ์ผ ์คํ์ ์ ํ์ด์ง ์ธ๋ฑ์ค๋ก ๋ณํ
โ address_space์ ํ์ด์ง ํธ๋ฆฌ์์ ์กฐํ โ ์ฌ๊ธฐ๊ฐ "ํ์ด์ง ์บ์ ์ฃผ์"๋ก ์ฐพ๋ ์ง์ (VFS)
โโ ์์ผ๋ฉด (ํํธ): ์ฆ์ ๋ฐํ, FSยท๋ธ๋ก ๋ ์ด์ด ์ ๊ฐ
โโ ์์ผ๋ฉด (๋ฏธ์ค): ํ์ผ์์คํ ํธ์ถ โ
์ฐ๊ธฐ ๊ฒฝ๋ก
์ ํ๋ฆฌ์ผ์ด์ write() โ VFSยทํ์ผ์์คํ ์ ๊ฑฐ์ณ ํ์ด์ง ์บ์์ ๊ธฐ๋กํ๊ณ ์ฆ์ ๋ฐํ(dirty ํ์) โ writeback ์ค๋ ๋๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ๋๋ fsync ์ dirty page๋ฅผ ๋ชจ์ ๋ธ๋ก I/O ๋ ์ด์ด๋ก ์ ๋ฌ โ ๋ณํฉยท์ ๋ ฌ ํ ๋๋ผ์ด๋ฒ๋ฅผ ๊ฑฐ์ณ ์ ์ฅ์ฅ์น์ ๊ธฐ๋ก โ ์ ๋๋ง์ผ๋ก ์ผ๊ด์ฑ ๋ณด์ฅ.
buffered I/O, direct I/O, mmap ๋น๊ต
| ๋ฐฉ์ | ์ฃผ ๊ฒฝ๋ก | ํน์ง |
|---|---|---|
| buffered I/O | VFS โ FS โ Page Cache โ Block I/O | ์บ์ ํํธ๊ฐ ๋น ๋ฅด๊ณ ์์ ์ฐ๊ธฐ๋ฅผ ๋ฌถ๊ธฐ ์ฝ์ต๋๋ค. |
| direct I/O | VFS โ FS โ Block I/O | page cache๋ฅผ ์ฐํํด ์บ์ ์ค์ผ์ ์ค์ด์ง๋ง, ์ฑ์ด ์ง์ฐ๊ณผ ์ ๋ ฌ์ ์ง์ ๊ฐ๋นํด์ผ ํฉ๋๋ค. |
| mmap | VFS โ Page Cache | ํ์ผ ํ์ด์ง๋ฅผ ์ฃผ์ ๊ณต๊ฐ์ ์ง์ ๋งคํํด ์ฝ๊ธฐ ์ ๊ทผ์ ๋จ์ํํฉ๋๋ค. |
๊ณ์ธต๋ณ ํต์ ๋จ์ ์์ฝ
ํต์ฌ ์ ๋ฆฌ โ ์ ๊ณ์ธต(VFSยทFS)์ ํ์ผยท๋ฐ์ดํธ ๋จ์๋ก ์ถ์์ ์ผ๋ก ๋์ํ๊ณ , ์๋ ๊ณ์ธต(๋ธ๋ก I/O)์ ๋ธ๋ก(LBA) ๋จ์๋ก ๊ตฌ์ฒดํ๋ฉ๋๋ค. ํ์ด์ง ์บ์๊ฐ ๊ทธ ์ฌ์ด์์ ์์ถฉ ์ญํ ์ ํ์ฌ ์ค์ ๋์คํฌ I/O๋ฅผ ํฌ๊ฒ ์ค์ด๋ ๊ฒ์ด ์ ์ฒด ์คํ ์ฑ๋ฅ์ ํต์ฌ์ ๋๋ค.
| ๊ฐ์ฒด | ์ญํ | ์ฃผ์ ์ ๋ณด |
|---|---|---|
| superblock | ๋ง์ดํธ๋ ํ์ผ์์คํ ์ ์ฒด๋ฅผ ํํ | FS ์ข ๋ฅ, ๋ธ๋ก ํฌ๊ธฐ, ๋ง์ดํธ ์ต์ |
| inode | ํ์ผ/๋๋ ํฐ๋ฆฌ ํ๋์ ๋ฉํ๋ฐ์ดํฐ | ํฌ๊ธฐ, ๊ถํ, ํ์์คํฌํ, ๋ฐ์ดํฐ ๋ธ๋ก ์์น |
| dentry | ๋๋ ํฐ๋ฆฌ ์ํธ๋ฆฌ (์ด๋ฆโinode ์ฐ๊ฒฐ) | ๊ฒฝ๋ก ํ์ ๊ฒฐ๊ณผ ์บ์ (์: /home/user/a.txt) |
| file | ํ๋ก์ธ์ค๊ฐ ์ฐ ํ์ผ์ ์ธ์คํด์ค | ํ์ฌ ์คํ์ , ์ ๊ทผ ๋ชจ๋, fd์ ์ฐ๊ฒฐ |
| ํ์ผ์์คํ | ํน์ง | ์ ํฉ ์ฉ๋ |
|---|---|---|
| ext4 | ์ฑ์ยท์์ , extent ๊ธฐ๋ฐ, ์ ๋๋ง | ๋ฒ์ฉ ๋ฆฌ๋ ์ค ๊ธฐ๋ณธ |
| XFS | ๋์ฉ๋ยท๊ณ ๋ณ๋ ฌ I/O ๊ฐ์ , ํ์ฅ์ฑ ์ฐ์ | ์๋ฒ, ๋์ฉ๋ ์คํ ๋ฆฌ์ง |
| F2FS | ๋ก๊ทธ ๊ตฌ์กฐ, NAND ์์ฐจ ์ฐ๊ธฐ ์ต์ ํ | ๋ชจ๋ฐ์ผ/SSD ํ๋์ |
| Btrfs | CoW, ์ค๋ ์ท, ์ฒดํฌ์ฌ, ํ๋ง | ์ค๋ ์ทยท๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์ค์ |
| ์ธก๋ฉด | ๋ด์ฉ |
|---|---|
| ํจ๊ณผ | ๋ฐ๋ณต ์ฝ๊ธฐ ๊ฐ์, ์์ ์ฐ๊ธฐ ๋ณํฉ โ ๋์คํฌ I/O ํ์ ๊ฐ์, ์ฒด๊ฐ ์ฑ๋ฅ ๋ํญ ํฅ์ |
| ์ํ | write-back์ ๋์คํฌ ๊ธฐ๋ก ์ ์ ์ ์ฅ์ ์ ๋ฐ์ดํฐ ์ ์ค ๊ฐ๋ฅ โ ์ ๋๋งยทfsync๋ก ๋ณด์ |
| ๋ฉ๋ชจ๋ฆฌ ์๋ฐ ์ | ํด๋ฆฐ ํ์ด์ง๋ฅผ ์ฐ์ ํ์(reclaim), dirty ํ์ด์ง๋ ๋จผ์ ๊ธฐ๋ก ํ ํ์ |
| ์ค์ผ์ค๋ฌ | ํน์ง | SSD ์ ํฉ์ฑ |
|---|---|---|
| none | ์ค์ผ์ค๋ง ๊ฑฐ์ ์์ด ์ฆ์ ์ ๋ฌ | NVMe SSD ๊ธฐ๋ณธ ๊ถ์ฅ |
| mq-deadline | ์ง์ฐ์๊ฐ ์ํ ๋ณด์ฅ, ๊ฐ๋ฒผ์ด ์ ๋ ฌ | ํผํฉ ์ํฌ๋ก๋ |
| kyber | ์ง์ฐ์๊ฐ ๋ชฉํ ๊ธฐ๋ฐ ์ ์ ์ ์ด | ๊ณ ์ฑ๋ฅ NVMe |
| BFQ | ๊ณต์ ์ฑ ์ค์ฌ, ๋ฐ์คํฌํ ๋ฐ์์ฑ | ์ค๋ฒํค๋ ํผ |
| ๊ณ์ธต | ์ฃผ ํต์ ๋จ์ | ํต์ฌ ์ฑ ์ |
|---|---|---|
| VFS | ํ์ผ / ๊ฐ์ฒด | ๊ณตํต ์ธํฐํ์ด์ค ์ถ์ํ |
| ํ์ผ์์คํ | ํ์ผ โ ๋ ผ๋ฆฌ ๋ธ๋ก | ๋งคํ, ๋ฉํ๋ฐ์ดํฐ, ์ ๋๋ง |
| ํ์ด์ง ์บ์ | ํ์ด์ง (๋ณดํต 4KB) | ์ฝ๊ธฐ/์ฐ๊ธฐ ๋ฒํผ๋ง |
| ๋ธ๋ก I/O | ๋ธ๋ก (LBA) | bio ๋ณํฉยท์ ๋ ฌ, ๋ฉํฐํ |
6. ์ฅ๋จ์
์ฅ์
-
VFS๊ฐ ํ์ผ์์คํ ์ข ๋ฅ๋ฅผ ์จ๊ฒจ์ ์ ํ๋ฆฌ์ผ์ด์ ์ open/read/write/close๋ง์ผ๋ก ๋ค์ํ ์ ์ฅ์๋ฅผ ๋ค๋ฃฐ ์ ์์ต๋๋ค.
-
ํ์ด์ง ์บ์๋ DRAM์์ ๋ฐ๋ณต ์ ๊ทผ์ ํก์ํ๊ณ write-back์ผ๋ก ์์ ์ฐ๊ธฐ๋ฅผ ๋ณํฉํด ์ฒด๊ฐ ์ฑ๋ฅ์ ๋์ ๋๋ค.
-
blk-mq๋ ์ฝ์ด๋ณ ์ํํธ์จ์ด ํ์ ์ฅ์น ํ๋์จ์ด ํ๋ฅผ ๋ถ๋ฆฌํด NVMe ๊ฐ์ ๊ณ IOPS ์ฅ์น์์ ๋ณ๋ ฌ์ฑ์ ์ด๋ฆฝ๋๋ค.
-
F2FS ๊ฐ์ ํ๋์ ์นํ์ ํ์ผ์์คํ ๊ณผ ๊ฒฐํฉํ๋ฉด NAND์ ์์ฐจ ์ฐ๊ธฐ ์ฑํฅ์ ๋ ์ ํ์ฉํ ์ ์์ต๋๋ค.
ํ๊ณ
-
buffered I/O๋ flush ์ ๊น์ง ๋ฐ์ดํฐ๊ฐ ์์์ ์ด์ง ์์์ ์ ์ ์ฅ์ ์ ์ทจ์ฝํฉ๋๋ค.
-
dirty page๊ฐ ๋ง์์ง๋ฉด writeback๊ณผ reclaim์ด ๊ฒน์น๋ฉฐ ์ง์ฐ์ด ํ ์ ์์ต๋๋ค.
-
HDD์ ์ ๋ฆฌํ ์ ๋ ฌ ์ ์ฑ ์ SSD/NVMe์์๋ ์คํ๋ ค ์ค๋ฒํค๋๊ฐ ๋ ์ ์์ต๋๋ค.
-
direct I/O๋ page cache๋ฅผ ์ฐํํ์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๋ ฌ๊ณผ ์ผ๊ด์ฑ ๊ด๋ฆฌ๋ฅผ ๋ ๋ง์ด ๋ ์์ต๋๋ค.
7. ๊ด๋ จ ๊ธฐ์
-
NAND NVMe SSD Analysis: FTL, NVMe, OS I/O ์คํ์ ์ ์ฒด ์ฐ๊ฒฐ
-
FTL WearLeveling GarbageCollection: ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ ์๋ช ๊ด๋ฆฌ
-
SSD Internal Parallelism: ์ฑ๋, ๋ค์ด, ํ๋ ์ธ ๋ณ๋ ฌ์ฑ
-
Memory Controller: DRAM ์ง์ฐ๊ณผ ๋์ญํญ์ด page cache์ ์ฃผ๋ ์ํฅ
-
NVMe Architecture: submission/completion queue์ ํธ์คํธ ์ธํฐํ์ด์ค
-
Linux VFS: dentry, inode, file, superblock ์ค๋ช
-
blk-mq: ๋ฉํฐํ ๋ธ๋ก I/O์ software queue / hardware queue ๊ตฌ์กฐ
-
F2FS: log-structured ์ค๊ณ, background cleaning, discard
-
fsync(2): buffered write์ ์์์ฑ ๊ฒฝ๊ณ
8. ํต์ฌ ์ ๋ฆฌ
VFS๋ ํ์ผ ์ด๋ฆ์ ๊ณตํต ์ธํฐํ์ด์ค๋ก ๋ฌถ๊ณ , ํ์ผ์์คํ ์ ๊ทธ ์ด๋ฆ์ ๋ธ๋ก ์ฃผ์๋ก ๋ฒ์ญํฉ๋๋ค. ํ์ด์ง ์บ์๋ DRAM์์ ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ฅผ ๋ฐ์ ์ฑ๋ฅ์ ๋์ด์ฌ๋ฆฌ์ง๋ง, ์ค์ ์์์ฑ์ fsync์ writeback ์์ ์ ํ๋ณด๋ฉ๋๋ค. ๋ธ๋ก I/O์ blk-mq๋ bio๋ฅผ ๋ณํฉํ๊ณ ์ฌ๋ฌ ํ๋ก ๋ถ์ฐํด ์ฅ์น ๋ณ๋ ฌ์ฑ์ ์ด๋ฆฝ๋๋ค. ๊ทธ๋์ ์ด ์คํ์ ๋จ์ํ ๊ฒฝ๋ก๊ฐ ์๋๋ผ, ์บ์ ์ผ๊ด์ฑ๊ณผ ์ฅ์น ํจ์จ ์ฌ์ด์ ๊ท ํ ์ฅ์น๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.