๐Ÿ’พ NAND

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๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ์บ์‹œ๋Š” ํŒŒ์ผ์‹œ์Šคํ…œ๊ณผ ๋ธ”๋ก ๊ณ„์ธต ์‚ฌ์ด์—์„œ ์™„์ถฉ ์—ญํ• ์„ ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋””์Šคํฌ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

nand_0015_vfs_fs_pagecache_blockio

๊ทธ๋ฆผ 1. OS ์Šคํ† ๋ฆฌ์ง€ ์Šคํƒ์˜ ๋„ค ๊ณ„์ธต ๊ตฌ์กฐ์™€ ๋ฐ์ดํ„ฐ ํ๋ฆ„

1. VFS (Virtual File System)

VFS๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์‹œ์Šคํ…œ๋“ค์„ ํ•˜๋‚˜์˜ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”ํ•˜๋Š” ์ปค๋„ ๊ณ„์ธต์ž…๋‹ˆ๋‹ค. ๋•๋ถ„์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ext4๋“  XFS๋“  NFS๋“  ํŒŒ์ผ์‹œ์Šคํ…œ ์ข…๋ฅ˜๋ฅผ ์•Œ ํ•„์š” ์—†์ด ๋™์ผํ•œ ์‹œ์Šคํ…œ ์ฝœ(open/read/write/close)๋กœ ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

VFS FS PageCache BlockIO

๊ทธ๋ฆผ 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)ํ•ฉ๋‹ˆ๋‹ค.

VFS FS PageCache BlockIO

๊ทธ๋ฆผ 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) ๊ตฌ์กฐ๋กœ ๋‹ค์ค‘ ์ฝ”์–ด์˜ ์š”์ฒญ์„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

VFS FS PageCache BlockIO

๊ทธ๋ฆผ 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๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ณ  ์—ฌ๋Ÿฌ ํ๋กœ ๋ถ„์‚ฐํ•ด ์žฅ์น˜ ๋ณ‘๋ ฌ์„ฑ์„ ์‚ด๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด ์Šคํƒ์€ ๋‹จ์ˆœํ•œ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹ˆ๋ผ, ์บ์‹œ ์ผ๊ด€์„ฑ๊ณผ ์žฅ์น˜ ํšจ์œจ ์‚ฌ์ด์˜ ๊ท ํ˜• ์žฅ์น˜๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.