๋‚ด๊ตฌ์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ ๋ฐ Linux ํŒŒ์ผ API

ํด๋ผ์šฐ๋“œ ์‹œ์Šคํ…œ์—์„œ ๋ฐ์ดํ„ฐ ์Šคํ† ๋ฆฌ์ง€์˜ ์ง€์† ๊ฐ€๋Šฅ์„ฑ์„ ์—ฐ๊ตฌํ•˜๋ฉด์„œ ๊ธฐ๋ณธ์ ์ธ ์‚ฌํ•ญ์„ ์ดํ•ดํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ง์ ‘ ํ…Œ์ŠคํŠธํ•ด ๋ณด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜ NVMe ์‚ฌ์–‘์„ ์ฝ๊ณ  ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€์† ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ์Šคํ† ๋ฆฌ์ง€์— ๊ด€ํ•œ ๋ณด์žฅ(์ฆ‰, ์‹œ์Šคํ…œ ์žฅ์•  ํ›„ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๋ณด์žฅ)์ด ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด NMVe ๋””์Šคํฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ๋ช…๋ น์ด ๋‚ด๋ ค์ง„ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์ €์žฅ ๋งค์ฒด์— ๊ธฐ๋ก๋˜๋Š” ์ˆœ๊ฐ„๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋Š” ์†์ƒ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋žจ์€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒŒ์‹œ๋ฌผ์—์„œ๋Š” Linux ํŒŒ์ผ API๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์˜๊ตฌ ์ €์žฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ„๋‹จํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ๋ช…๋ น์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. write(), ์ด ๋ช…๋ น์ด ์™„๋ฃŒ๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋””์Šคํฌ์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ write() ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฐ์ดํ„ฐ๋ฅผ RAM์— ์žˆ๋Š” ์ปค๋„ ์บ์‹œ์—๋งŒ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์“ฐ๋„๋ก ํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ตฌ์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ ๋ฐ Linux ํŒŒ์ผ API

์ผ๋ฐ˜์ ์œผ๋กœ ์ด ์ž๋ฃŒ๋Š” ๋‚ด๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ์ฃผ์ œ์— ๋Œ€ํ•ด ๋ฐฐ์šด ๋‚ด์šฉ๊ณผ ๊ด€๋ จ๋œ ์ผ๋ จ์˜ ๋ฉ”๋ชจ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ์•„์ฃผ ๊ฐ„๋žตํ•˜๊ฒŒ ์ด์•ผ๊ธฐํ•˜๋ฉด ์ง€์† ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. fdatasync() ๋˜๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ ์—ด๊ธฐ O_DSYNC. ์ฝ”๋“œ์—์„œ ๋””์Šคํฌ๋กœ ์ด๋™ํ•˜๋Š” ๋™์•ˆ ๋ฐ์ดํ„ฐ์— ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ดํŽด๋ณด์„ธ์š”. ์ด ์กฐ.

write() ํ•จ์ˆ˜ ์‚ฌ์šฉ์˜ ํŠน์ง•

์‹œ์Šคํ…œ ํ˜ธ์ถœ write() ํ‘œ์ค€์— ์ •์˜๋˜์–ด ์žˆ์Œ IEEE POSIX ํŒŒ์ผ ์„ค๋ช…์ž์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋ ค๋Š” ์‹œ๋„๋กœ. ์„ฑ๊ณต์ ์ธ ์ž‘์—… ์™„๋ฃŒ ํ›„ write() ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์ž‘์—…์€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ์—์„œ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ด์ „์— ๊ธฐ๋ก๋œ ๋ฐ”์ดํŠธ๋ฅผ ์ •ํ™•ํžˆ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์— POSIX ํ‘œ์ค€์˜ ๊ด€๋ จ ์„น์…˜). ์—ฌ๊ธฐ์—, ์Šค๋ ˆ๋“œ๊ฐ€ ์ผ๋ฐ˜ ํŒŒ์ผ ์ž‘์—…๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„น์…˜์—๋Š” ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ๊ฐ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ ํ˜ธ์ถœ์€ ๋‹ค๋ฅธ ํ˜ธ์ถœ์˜ ์ง€์ •๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์ „ํ˜€ ํ™•์ธํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ๋ฉ”๋ชจ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ. ์ด๋Š” ๋ชจ๋“  ํŒŒ์ผ I/O ์ž‘์—…์ด ์ž‘์—… ์ค‘์ธ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์ž ๊ธˆ์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒฐ๋ก ์œผ๋กœ โ€‹โ€‹์ด์–ด์ง‘๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ˆ˜์ˆ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? write() ์›์ž์ž…๋‹ˆ๊นŒ? ๊ธฐ์ˆ ์ ์ธ ๊ด€์ ์—์„œ ๋ณด๋ฉด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์ž‘์—…์€ ์ž‘์„ฑ๋œ ๋‚ด์šฉ์„ ๋ชจ๋‘ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ „ํ˜€ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. write(). ํ•˜์ง€๋งŒ ์ˆ˜์ˆ ์€ write(), ํ‘œ์ค€์— ๋”ฐ๋ผ ๊ทธ๋…€๊ฐ€ ๊ธฐ๋กํ•˜๋„๋ก ์š”์ฒญ๋ฐ›์€ ๋ชจ๋“  ๊ฒƒ์„ ๊ธฐ๋กํ•˜์—ฌ ๋๋‚  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋งŒ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋™์ผํ•œ ํŒŒ์ผ ์„ค๋ช…์ž๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ํŒŒ์ผ์— ๊ฐ๊ฐ 1024๋ฐ”์ดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์ŠคํŠธ๋ฆผ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€์˜ ๊ด€์ ์—์„œ ๊ฐ ์“ฐ๊ธฐ ์ž‘์—…์ด ํŒŒ์ผ์— XNUMX๋ฐ”์ดํŠธ๋งŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ์›์ž์„ฑ์œผ๋กœ ์œ ์ง€๋˜์ง€๋งŒ ์™„๋ฃŒ๋˜๋ฉด ํŒŒ์ผ์— ์“ฐ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋’ค์ฃฝ๋ฐ•์ฃฝ์ด ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์— ๋Œ€ํ•œ ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ํ† ๋ก .

fsync() ๋ฐ fdatasync() ํ•จ์ˆ˜

๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ๋กœ ํ”Œ๋Ÿฌ์‹œํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. fsync(). ์ด ๊ธฐ๋Šฅ์€ ์šด์˜ ์ฒด์ œ์— ์ˆ˜์ •๋œ ๋ชจ๋“  ๋ธ”๋ก์„ ์บ์‹œ์—์„œ ๋””์Šคํฌ๋กœ ์ด๋™ํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํŒŒ์ผ์˜ ๋ชจ๋“  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(์•ก์„ธ์Šค ์‹œ๊ฐ„, ํŒŒ์ผ ์ˆ˜์ • ์‹œ๊ฐ„ ๋“ฑ)๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. fdatasync(). ์— ๋•๋‹ค ์— fdatasync() ์ด ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜๋Š” ๋™์•ˆ "๋‹ค์Œ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์ž‘์—…์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ" ๋งŒํผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ๋””์Šคํฌ์— ์ €์žฅ๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ด€์‹ฌ์„ ๊ฐ–๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ์ด๋Ÿฌํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜ ํ›„์— ํŒŒ์ผ์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, ์ƒˆ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ๋‹ค์Œ์„ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. fsync() ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•ด. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹คํŒจ ํ›„ ์ด ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” UNIX์—์„œ๋Š” ํ•˜๋“œ ๋งํฌ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ํŒŒ์ผ์ด ์—ฌ๋Ÿฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ „ํ™”ํ•  ๋•Œ fsync() ์–ด๋–ค ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ์ดํ„ฐ๋„ ๋””์Šคํฌ๋กœ ํ”Œ๋Ÿฌ์‹œํ•ด์•ผ ํ•˜๋Š”์ง€ ํŒŒ์ผ์ด ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค(์—ฌ๊ธฐ์— ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ext4 ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ž๋™์œผ๋กœ ์ ์šฉํ•˜๋‹ค fsync() ํ•ด๋‹น ํŒŒ์ผ์ด ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋‹ค์–‘ํ•œ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ์šฉํ–ˆ๋‹ค ๋ธ”๋ก ์ถ”์  ext4 ๋ฐ XFS ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋””์Šคํฌ ์ž‘์—…์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ํŒŒ์ผ ๋‚ด์šฉ๊ณผ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ €๋„ ๋ชจ๋‘์— ๋Œ€ํ•ด ๋””์Šคํฌ์— ์ผ๋ฐ˜ ์“ฐ๊ธฐ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ , ์บ์‹œ๋ฅผ ํ”Œ๋Ÿฌ์‹œํ•˜๊ณ , ์ €๋„์— FUA(Force Unit Access, ๋””์Šคํฌ์— ์ง์ ‘ ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ, ์บ์‹œ ์šฐํšŒ) ์“ฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์•„๋งˆ๋„ ๊ฑฐ๋ž˜๊ฐ€ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. FUA๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋“œ๋ผ์ด๋ธŒ์—์„œ๋Š” ์บ์‹œ ํ”Œ๋Ÿฌ์‹œ๊ฐ€ ๋‘ ๋ฒˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์‹คํ—˜์— ๋”ฐ๋ฅด๋ฉด fdatasync() ์กฐ๊ธˆ ๋” ๋น ๋ฅด๊ฒŒ fsync(). ๊ณต์ต์‚ฌ์—… blktrace ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค fdatasync() ์ผ๋ฐ˜์ ์œผ๋กœ ๋””์Šคํฌ์— ๋” ์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์”๋‹ˆ๋‹ค(ext4์˜ ๊ฒฝ์šฐ). fsync() 20KiB๋ฅผ ์“ฐ๊ณ  fdatasync() - 16KiB). ๋˜ํ•œ XFS๊ฐ€ ext4๋ณด๋‹ค ์•ฝ๊ฐ„ ๋น ๋ฅด๋‹ค๋Š” ๊ฒƒ๋„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ ๋„์›€์œผ๋กœ blktrace ๊ทธ๊ฑธ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์—ˆ์–ด fdatasync() ๋” ์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ํ”Œ๋Ÿฌ์‹œํ•ฉ๋‹ˆ๋‹ค(XFS์˜ ๊ฒฝ์šฐ 4KiB).

fsync() ์‚ฌ์šฉ ์‹œ ๋ชจํ˜ธํ•œ ์ƒํ™ฉ

์„ธ ๊ฐ€์ง€ ๋ชจํ˜ธํ•œ ์ƒํ™ฉ์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. fsync()๋‚ด๊ฐ€ ์‹ค์ œ๋กœ ๋งŒ๋‚œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์‚ฌ๊ฑด์€ 2008๋…„์— ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹น์‹œ ๋งŽ์€ ์ˆ˜์˜ ํŒŒ์ผ์ด ๋””์Šคํฌ์— ๊ธฐ๋ก๋˜๋Š” ๊ฒฝ์šฐ Firefox 3 ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ "์ •์ง€"๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ด ์ƒํƒœ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ฐœ์ƒํ•œ ๊ฐ ๋ณ€๊ฒฝ ํ›„ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. fsync()์ด๋Š” ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ext3 ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋œ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. fsync() ํ•ด๋‹น ํŒŒ์ผ๊ณผ ๊ด€๋ จ๋œ ํŽ˜์ด์ง€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  "๋”ํ‹ฐ" ํŽ˜์ด์ง€๋ฅผ ๋””์Šคํฌ์— ํ”Œ๋Ÿฌ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, Firefox์—์„œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž๊ธฐ ๋””์Šคํฌ์— ๊ธฐ๋ก๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” ๋ช‡ ์ดˆ๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ… ๊ทธ๊ฒƒ ์ž๋ฃŒ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ๋น„๋™๊ธฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, Firefox๋Š” ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ์—„๊ฒฉํ•œ ์Šคํ† ๋ฆฌ์ง€ ์ง€์†์„ฑ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉฐ ext3 ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋Šฅ์€ ์ด ๋ฌธ์ œ๋ฅผ ์•…ํ™”์‹œํ‚ฌ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” 2009๋…„์— ๋ฐœ์ƒํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‹œ์Šคํ…œ ์ถฉ๋Œ ํ›„ ์ƒˆ๋กœ์šด ext4 ํŒŒ์ผ ์‹œ์Šคํ…œ ์‚ฌ์šฉ์ž๋Š” ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๋งŽ์€ ํŒŒ์ผ์˜ ๊ธธ์ด๊ฐ€ 3์ด๋ผ๋Š” ์‚ฌ์‹ค์— ์ง๋ฉดํ–ˆ์ง€๋งŒ ์ด์ „ ext3 ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋‹จ๋ฝ์—์„œ๋Š” extXNUMX๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ํ”Œ๋Ÿฌ์‹œํ•˜์—ฌ ์†๋„๊ฐ€ ํฌ๊ฒŒ ๋Š๋ ค์ง€๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. fsync(). ์ƒํ™ฉ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ext4์—์„œ๋Š” ํŠน์ • ํŒŒ์ผ๊ณผ ๊ด€๋ จ๋œ ๋”ํ‹ฐ ํŽ˜์ด์ง€๋งŒ ๋””์Šคํฌ์— ํ”Œ๋Ÿฌ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋Š” ext3๋ณด๋‹ค ํ›จ์”ฌ ์˜ค๋žซ๋™์•ˆ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋Š” 30์ดˆ ๋™์•ˆ ์ด ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋ฉฐ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. dirty_expire_centisecs; ์—ฌ๊ธฐ์— ์ด์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ž๋ฃŒ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ์ด๋Š” ์˜ค๋ฅ˜ ๋ฐœ์ƒ ํ›„ ๋ณต๊ตฌํ•  ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. fsync() ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์˜ค๋ฅ˜์˜ ๊ฒฐ๊ณผ๋กœ๋ถ€ํ„ฐ ์ตœ๋Œ€ํ•œ ๋ณดํ˜ธํ•ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ. ๊ธฐ๋Šฅ fsync() ext4์„ ์‚ฌ์šฉํ•  ๋•Œ๋ณด๋‹ค ext3๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ›จ์”ฌ ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋‹จ์ ์€ ์ด์ „๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜์™€ ๊ฐ™์€ ์ผ๋ถ€ ์ž‘์—…์˜ ์‹คํ–‰ ์†๋„๊ฐ€ ๋Š๋ ค์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์„ธ๋ถ€์ •๋ณด ๋ณด๊ธฐ ์—ฌ๊ธฐ์— ะธ ์—ฌ๊ธฐ์—.

์— ๊ด€ํ•œ ์„ธ ๋ฒˆ์งธ ๋ฌธ์ œ fsync(), 2018๋…„์— ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ PostgreSQL ํ”„๋กœ์ ํŠธ์˜ ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. fsync() ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด "๋”ํ‹ฐ" ํŽ˜์ด์ง€๋ฅผ "๊นจ๋—ํ•จ"์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. fsync() ๊ทธ๋Ÿฌํ•œ ํŽ˜์ด์ง€์—๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด ๋•Œ๋ฌธ์— ์ˆ˜์ •๋œ ํŽ˜์ด์ง€๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ณ  ๋””์Šคํฌ์— ๊ธฐ๋ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋””์Šคํฌ์— ๊ธฐ๋ก๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์‹ค์ œ ์žฌ์•™์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‹คํŒจ fsync() ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ ์šฉํ•ด๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๊ฑฐ์˜ ์•„๋ฌด ๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜๋ฉด PostgreSQL๊ณผ ๊ธฐํƒ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—, "์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด fsync ์˜ค๋ฅ˜๋กœ๋ถ€ํ„ฐ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?"์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์ƒ์˜ ์†”๋ฃจ์…˜์€ ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ Direct I/O๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. O_SYNC ์•„๋‹ˆ๋ฉด ๊นƒ๋ฐœ๋กœ O_DSYNC. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ์€ ํŠน์ • ์“ฐ๊ธฐ ์ž‘์—… ์ค‘์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜์ง€๋งŒ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฒ„ํผ ์ž์ฒด๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ ์—ฌ๊ธฐ์— ะธ ์—ฌ๊ธฐ์—.

O_SYNC ๋ฐ O_DSYNC ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์—ด๊ธฐ

์˜๊ตฌ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ์ œ๊ณตํ•˜๋Š” Linux ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•œ ๋…ผ์˜๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๋Š” ๊นƒ๋ฐœ์˜ ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค O_SYNC ๋˜๋Š” ํ”Œ๋ž˜๊ทธ O_DSYNC ์‹œ์Šคํ…œ ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์—ด ๋•Œ ์—ด๋‹ค(). ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์ž‘์—…์ด ๋งˆ์น˜ ๊ฐ ๋ช…๋ น ์ดํ›„์ฒ˜๋Ÿผ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. write() ์‹œ์Šคํ…œ์— ๊ฐ๊ฐ ๋ช…๋ น์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. fsync() ะธ fdatasync(). ์— POSIX ์‚ฌ์–‘ ์ด๋ฅผ "๋™๊ธฐํ™”๋œ I/O ํŒŒ์ผ ๋ฌด๊ฒฐ์„ฑ ์™„๋ฃŒ" ๋ฐ "๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์™„๋ฃŒ"๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐœ๊ฐ€ ์•„๋‹Œ ํ•œ ๊ฐœ์˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: write() ะธ fdatasync()). ์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€ ํ•ด๋‹น ํŒŒ์ผ ์„ค๋ช…์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์“ฐ๊ธฐ๊ฐ€ ๋™๊ธฐํ™”๋˜์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

O_DIRECT ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ ์ง์ ‘ I/O ์‚ฌ์šฉ

์‹œ์Šคํ…œ ํ˜ธ์ถœ open() ๊นƒ๋ฐœ์„ ์ง€์ง€ํ•˜๋‹ค O_DIRECT๋Š” ์šด์˜ ์ฒด์ œ ์บ์‹œ๋ฅผ ์šฐํšŒํ•˜์—ฌ ๋””์Šคํฌ์™€ ์ง์ ‘ ์ƒํ˜ธ ์ž‘์šฉํ•˜์—ฌ I/O ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‹คํ–‰๋œ ์“ฐ๊ธฐ ๋ช…๋ น์ด ๋””์Šคํฌ ์ž‘์—…์„ ์œ„ํ•œ ๋ช…๋ น์œผ๋กœ ์ง์ ‘ ๋ณ€ํ™˜๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๊ธฐ๋Šฅ์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. fsync() ๋˜๋Š” fdatasync(). ์‚ฌ์‹ค์€ ๋””์Šคํฌ ์ž์ฒด๊ฐ€ ์—ฐ๊ธฐ ๋˜๋Š” ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ๋ช…๋ น. ๊ทธ๋ฆฌ๊ณ  ๋” ๋‚˜์œ ๊ฒƒ์€ ์–ด๋–ค ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ˆ˜ํ–‰๋˜๋Š” I/O ์ž‘์—…์ด O_DIRECT, ๋ฐฉ์†ก ๊ธฐ์กด์˜ ๋ฒ„ํผ ์ž‘์—…์œผ๋กœ. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์—ฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. O_DSYNC, ์ด๋Š” ๊ฐ ์“ฐ๊ธฐ ์ž‘์—… ๋’ค์— ํ˜ธ์ถœ์ด ๋’ค๋”ฐ๋ฅธ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. fdatasync().

XFS ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ์ตœ๊ทผ์— "๋น ๋ฅธ ๊ฒฝ๋กœ"๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. O_DIRECT|O_DSYNC-๋ฐ์ดํ„ฐ ๊ธฐ๋ก. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ธ”๋ก์„ ๋ฎ์–ด์“ฐ๋Š” ๊ฒฝ์šฐ O_DIRECT|O_DSYNC, ๊ทธ๋Ÿฌ๋ฉด XFS๋Š” ์บ์‹œ๋ฅผ ํ”Œ๋Ÿฌ์‹œํ•˜๋Š” ๋Œ€์‹  ์žฅ์น˜๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ FUA ์“ฐ๊ธฐ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. blktrace Linux 5.4/Ubuntu 20.04 ์‹œ์Šคํ…œ์—์„œ. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์‚ฌ์šฉ ์‹œ ์ตœ์†Œํ•œ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋””์Šคํฌ์— ๊ธฐ๋ก๋˜๊ณ  ๋‘ ๊ฐ€์ง€ ์ž‘์—…(์บ์‹œ ์“ฐ๊ธฐ ๋ฐ ํ”Œ๋Ÿฌ์‹œ)์ด ์•„๋‹Œ ํ•œ ๊ฐ€์ง€ ์ž‘์—…์ด ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ํŒจ์น˜ 2018 ์ปค๋„์€ ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ตœ์ ํ™”๋ฅผ ๋‹ค๋ฅธ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์ง€๋งŒ, ์ œ๊ฐ€ ์•„๋Š” ํ•œ XFS๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์ด๋ฅผ ์ง€์›ํ•˜๋Š” ์œ ์ผํ•œ ํŒŒ์ผ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

sync_file_range() ํ•จ์ˆ˜

๋ฆฌ๋ˆ…์Šค์—๋Š” ์‹œ์Šคํ…œ ์ฝœ์ด ์žˆ๋‹ค sync_file_range(), ์ „์ฒด ํŒŒ์ผ์ด ์•„๋‹Œ ํŒŒ์ผ์˜ ์ผ๋ถ€๋งŒ ๋””์Šคํฌ์— ํ”Œ๋Ÿฌ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ˜ธ์ถœ์€ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํ”Œ๋Ÿฌ์‹œ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ธ์ฆ์„œ์—๋Š” sync_file_range() ์ด ๋ช…๋ น์€ "๋งค์šฐ ์œ„ํ—˜ํ•˜๋‹ค"๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ๋ฐ ์œ„ํ—˜ sync_file_range() ์— ์•„์ฃผ ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์žฌ๋ฃŒ. ํŠนํžˆ ์ด ํ˜ธ์ถœ์€ RocksDB๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋„์ด "๋”ํ‹ฐ" ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ํ”Œ๋Ÿฌ์‹œํ•˜๋Š” ์‹œ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์‹œ์— ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. fdatasync(). ์— ์•”ํ˜ธ RocksDB์—๋Š” ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. sync_file_range() ZFS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ๋กœ ํ”Œ๋Ÿฌ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ์—๋Š” ๋ฒ„๊ทธ๊ฐ€ ํฌํ•จ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ง€์†์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ

์ง€์†์ ์ธ I/O ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„ธ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ๋‹ค๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. fsync() ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ•จ์ˆ˜ ํ˜ธ์ถœ fdatasync() ๋˜๋Š” fsync() ๊ธฐ๋Šฅ ํ›„ write() (์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. fdatasync()).
  2. ํ”Œ๋ž˜๊ทธ๋กœ ์—ด๋ฆฐ ํŒŒ์ผ ์„ค๋ช…์ž ์ž‘์—…ํ•˜๊ธฐ O_DSYNC ๋˜๋Š” O_SYNC (๋” ๋‚˜์€-ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ O_DSYNC).
  3. ๋ช…๋ น ์‚ฌ์šฉ pwritev2() ๊นƒ๋ฐœ์ด ๋‹ฌ๋ฆฐ RWF_DSYNC ๋˜๋Š” RWF_SYNC (๋ฐ”๋žŒ์งํ•˜๊ฒŒ๋Š” ๊นƒ๋ฐœ RWF_DSYNC).

์„ฑ๋Šฅ ๋…ธํŠธ

๋‚˜๋Š” ๋‚ด๊ฐ€ ์กฐ์‚ฌํ•œ ๋‹ค์–‘ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์„ฑ๋Šฅ์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ์ธก์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ž‘์—… ์†๋„์—์„œ ๋‚ด๊ฐ€ ๋Š๋‚€ ์ฐจ์ด์ ์€ ๋งค์šฐ ์ž‘์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‚ด๊ฐ€ ํ‹€๋ ธ์„ ์ˆ˜๋„ ์žˆ๊ณ , ๋‹ค๋ฅธ ์กฐ๊ฑด์—์„œ๋Š” ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ์„ ์ˆ˜๋„ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์„ฑ๋Šฅ์— ๋” ๋งŽ์€ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€, ์„ฑ๋Šฅ์— ๋œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ์ด ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค(์„ฑ๋Šฅ ํ–ฅ์ƒ์€ 2-100%์ผ ์ˆ˜ ์žˆ์Œ). ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฒจ๋ถ€ํ•˜๋ ค๋ฉด ์‹œ์Šคํ…œ ํ˜ธ์ถœ ํ›„์—๋„ ํŒŒ์ผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. fallocate()๊ทธ๋Ÿฌ๋‚˜ ์ด ํšจ๊ณผ์˜ ํฌ๊ธฐ๋Š” ๋‹ค์–‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ƒ์˜ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์ „ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. fallocate() ํ•„์š”ํ•œ ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ๊ณต๊ฐ„์€ ๋ช…์‹œ์ ์œผ๋กœ XNUMX์œผ๋กœ ์ฑ„์›Œ์ง€๊ณ  ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. fsync(). ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ํ•ด๋‹น ๋ธ”๋ก์ด "ํ• ๋‹น๋˜์ง€ ์•Š์Œ"์ด ์•„๋‹ˆ๋ผ "ํ• ๋‹น๋จ"์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์•ฝ๊ฐ„(์•ฝ 2%) ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๋ถ€ ๋””์Šคํฌ๋Š” ๋‹ค๋ฅธ ๋””์Šคํฌ๋ณด๋‹ค ์ฒซ ๋ฒˆ์งธ ๋ธ”๋ก ์•ก์„ธ์Šค ์ž‘์—…์ด ๋Š๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ณต๊ฐ„์„ 100์œผ๋กœ ์ฑ„์šฐ๋ฉด ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ(์•ฝ XNUMX%) ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด๊ฒƒ์€ ๋””์Šคํฌ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. AWS EBS (๋น„๊ณต์‹ ๋ฐ์ดํ„ฐ๋ผ ํ™•์ธํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.) ๋ณด๊ด€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€ GCP ์˜๊ตฌ ๋””์Šคํฌ (๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์ด๋ฏธ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ํ™•์ธ๋œ ๊ณต์‹ ์ •๋ณด์ž…๋‹ˆ๋‹ค). ๋‹ค๋ฅธ ์ „๋ฌธ๊ฐ€๋“ค๋„ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ๊ณ  ๊ด€์ธก, ๋‹ค์–‘ํ•œ ๋””์Šคํฌ์™€ ๊ด€๋ จ๋ฉ๋‹ˆ๋‹ค.
  2. ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์ ์„์ˆ˜๋ก ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค(์ด๋“์€ ์•ฝ 5%์ผ ์ˆ˜ ์žˆ์Œ). ๋„์ „์ธ ๊ฒƒ ๊ฐ™๋„ค์š” open() ๊นƒ๋ฐœ์ด ๋‹ฌ๋ฆฐ O_DSYNC ๋˜๋Š” ์ „ํ™” pwritev2() ๊นƒ๋ฐœ์ด ๋‹ฌ๋ฆฐ RWF_SYNC ๋” ๋น ๋ฅธ ํ†ตํ™” fdatasync(). ์—ฌ๊ธฐ์„œ ์š”์ ์€ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋” ์ ์€ ์ˆ˜์˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ(๋‘ ๊ฐœ๊ฐ€ ์•„๋‹Œ ํ•œ ๊ฐœ ํ˜ธ์ถœ)์ด ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์—์„œ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„ฑ๋Šฅ ์ฐจ์ด๋Š” ๋งค์šฐ ์ž‘์œผ๋ฏ€๋กœ ์ด๋ฅผ ์™„์ „ํžˆ ๋ฌด์‹œํ•˜๊ณ  ๋…ผ๋ฆฌ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์† ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ์Šคํ† ๋ฆฌ์ง€ ์ฃผ์ œ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ ์šฉํ•œ ์ž๋ฃŒ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  • I/O ์•ก์„ธ์Šค ๋ฐฉ๋ฒ• โ€” ์ž…๋ ฅ/์ถœ๋ ฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ๊ธฐ๋ณธ ๊ฐœ์š”.
  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋””์Šคํฌ์— ๋„๋‹ฌํ•˜๋„๋ก ๋ณด์žฅ โ€” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋””์Šคํฌ๋กœ ์ด๋™ํ•˜๋Š” ๋™์•ˆ ๋ฐ์ดํ„ฐ์— ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.
  • ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์–ธ์ œ fsyncํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? - ์ง€์› ์‹œ๊ธฐ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€ fsync() ๋””๋ ‰ํ† ๋ฆฌ์šฉ. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ์ƒˆ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ ‡๊ฒŒ ๊ถŒ์žฅํ•˜๋Š” ์ด์œ ๋Š” Linux์—์„œ๋Š” ๋™์ผํ•œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ๋งŽ์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • Linux์˜ SQL Server: FUA ๋‚ด๋ถ€ - ๋‹ค์Œ์€ Linux ํ”Œ๋žซํผ์˜ SQL Server์—์„œ ์˜๊ตฌ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๊ฐ€ ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ Windows์™€ Linux ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๊ฐ„์˜ ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ๋น„๊ต๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. XFS์˜ FUA ์ตœ์ ํ™”์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋œ ๊ฒƒ์€ ์ด ์ž๋ฃŒ ๋•๋ถ„์ด๋ผ๊ณ  ๊ฑฐ์˜ ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋””์Šคํฌ์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฐ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ตฌ์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ ๋ฐ Linux ํŒŒ์ผ API

๋‚ด๊ตฌ์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ ๋ฐ Linux ํŒŒ์ผ API

์ถœ์ฒ˜ : habr.com