๋‚˜๋Š” ๋‘˜์„ ๊ตฌ๋ถ„ํ•ด์„œ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? ์™œ ์Šคํƒ€๋ฝ์Šค์—์„œ FD ์ง€ํ‘œ๋ฅผ ๋…ธ์ถœ ํ•˜๋Š”๊ฐ€?

18 minute read

๋ฆฌ๋ˆ…์Šค ์‹œํ—˜์„ ์ค€๋น„ํ•˜๋ฉด์„œ, ๊ทธ๋ฆฌ๊ณ  ์‹ค๋ฌด๋ฅผ ํ•˜๋ฉด์„œ ๋ฌด์‹ฌ์ฝ” ์ง€๋‚˜์ณค๋˜ ๊ฐœ๋…๋“ค์„ ๋‹ค์‹œ ๋ณด๋ฉฐ, โ€˜๋‚ด๊ฐ€ ์ด๊ฑธ ์–ผ๋งˆ๋‚˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?โ€™๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉฐ ๋‹ค์‹œ ๋ณด๊ณ  ์žˆ์–ด์š”. ์ด ๊ธ€์€ inode์™€ fd์˜ ๊ฐœ๋…๊ณผ ์ปจ์…‰, ์“ฐ์ž„์ƒˆ๋ฅผ ์ œ๊ฐ€ ์ดํ•ดํ•œ ๋Œ€๋กœ ๋‹ค์‹œ ์ ์–ด๋ณธ ๊ธ€์ด์˜ˆ์š”.

inode

ํŒŒ์ผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ปดํ“จํ„ฐ์—์„œ ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ ํŒŒ์ผ์— ์ ‘๊ทผํ•˜์ง€๋งŒ, ์‚ฌ์‹ค ํŒŒ์ผ ์ด๋ฆ„์€ ์ด inode๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” alias์— ๋ถˆ๊ณผ ํ•ฉ๋‹ˆ๋‹ค.

inode์—๋Š” ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํŒŒ์ผ ์‚ฌ์ด์ฆˆ
  • ํŒŒ์ผ ์˜ค๋„ˆ
  • ํŒŒ์ผ ๊ถŒํ•œ
  • ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ๋ฆฌ์ŠคํŠธ
    • ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ๋ฐ์ดํ„ฐ ๋ธ”๋ก์— ์ €์žฅ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • [์ฃผ์˜] inode์—๋Š” ํŒŒ์ผ ์ด๋ฆ„ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๊ทธ๋Ÿผ ์–ด๋””์— ์ €์žฅ? -> ๋’ค์—์„œ ๋‹ค๋ฃน๋‹ˆ๋‹ค!

๋””๋ ‰ํ† ๋ฆฌ๋„ ์‚ฌ์‹ค ํŒŒ์ผ์ด๋‹ค

ls -alh๋กœ ๋ณด์ด๋Š” ๋ชฉ๋ก์—๋Š” ํŒŒ์ผ๋งŒ ์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋””๋ ‰ํ† ๋ฆฌ๋„ ์žˆ์Šต๋‹ˆ๋‹ค!

์‚ฌ์‹ค ๋””๋ ‰ํ† ๋ฆฌ๋„ ํŒŒ์ผ ์ž…๋‹ˆ๋‹ค. ๋””๋ ‰ํ† ๋ฆฌ๋„ ์ผ๋ฐ˜ ํŒŒ์ผ๊ณผ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์ด์ฆˆ, ์˜ค๋„ˆ, ๊ถŒํ•œ ์ •๋ณด๊ฐ€ ์žˆ๊ณ , ๊ทธ๊ฒŒ ๋””๋ ‰ํ† ๋ฆฌ์˜ inode์— ๊ธฐ๋ก ๋ฉ๋‹ˆ๋‹ค.

๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก ์•ˆ์—๋Š” ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์˜ ์ด๋ฆ„๊ณผ ๊ฐ ์ด๋ฆ„์ด ๊ฐ€๋ฆฌํ‚ค๋Š” inode index ๊ฐ’์ด ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค.

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

  • inode
    • ํŒŒ์ผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ + ๋ฐ์ดํ„ฐ ๋ธ”๋ก์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ
  • directory entry
    • (filename, inode index)์˜ ๋ชจ์Œ


inode์—๋Š” ํŒŒ์ผ ์ด๋ฆ„ ์ •๋ณด๊ฐ€ ์ €์žฅ ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํŒŒ์ผ ์ด๋ฆ„ ๋ณ€๊ฒฝ(rename) ์ž‘์—…์€ ํ•ด๋‹น ํŒŒ์ผ์˜ inode๊ฐ€ ์•„๋‹ˆ๋ผ ํ•ด๋‹น ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ ํŒŒ์ผ์˜ ๋””๋ ‰ํ† ๋ฆฌ ์—”ํŠธ๋ฆฌ์—์„œ (filename, inode index) ์Œ์˜ ํŒŒ์ผ ์ด๋ฆ„ ๋ถ€๋ถ„์ด ๋ฐ”๋€Œ๋Š” ์ž‘์—… ์ž…๋‹ˆ๋‹ค.

$ mv a.txt b.txt
---
(a.txt, 100) -> (b.txt, 100)

๋””์Šคํฌ ๋ ˆ์ด์•„์›ƒ

inode๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„  ๋””์Šคํฌ ๋ ˆ์ด์•„์›ƒ๊นŒ์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋””์Šคํฌ ๋ ˆ์ด์•„์›ƒ ์œ„์—์„œ inode๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌ๋˜๋Š”์ง€ ์‚ดํŽด๋ด…์‹œ๋‹ค.

Superblock
(ํŒŒ์ผ์‹œ์Šคํ…œ ์ „์ฒด ์ •๋ณด)
inode Table
(inode๋“ค์˜ ๋ฐฐ์—ด)
Data Blocks
(์‹ค์ œ ํŒŒ์ผ ๋ฐ์ดํ„ฐ, ๋””๋ ‰ํ† ๋ฆฌ ํŒŒ์ผ)
  • ์Šˆํผ๋ธ”๋ก์ด ๋ญ”๊ฐ€์š”?
    • ํŒŒ์ผ์‹œ์Šคํ…œ ์ž์ฒด์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์˜์—ญ ์ž…๋‹ˆ๋‹ค.
    • ํŒŒ์ผ์‹œ์Šคํ…œ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ผ๊ณ  ํ•˜๋ฉดโ€ฆ
      • ์–ด๋–ค ํŒŒ์ผ ์‹œ์Šคํ…œ ํƒ€์ž…์ธ์ง€(ext4, xfs)
      • ์ด ๋ธ”๋ก ๊ฐฏ์ˆ˜, ์‚ฌ์šฉ ์ค‘์ธ ๋ธ”๋ก ์ˆ˜
      • ์ด inode ์ˆ˜, ์‚ฌ์šฉ ์ค‘์ธ inode ์ˆ˜
      • ๋ธ”๋ก ์‚ฌ์ด์ฆˆ (๋ณดํ†ต 4kb)
      • ํŒŒ์ผ์‹œ์Šคํ…œ์˜ ์ƒํƒœ (์žฅ์ƒ์ธ์ง€, ์–ธ๋งˆ์šดํŠธ ์ƒํƒœ์ธ์ง€)
    • ์Šˆํผ๋ธ”๋ก์ด ์†์ƒ๋˜๋ฉด, ํŒŒ์ผ์‹œ์Šคํ…œ ์ „์ฒด๊ฐ€ ๊ณ ์žฅ๋‚˜๊ธฐ ๋•Œ๋ฌธ์—, ํ˜„๋Œ€์˜ ํŒŒ์ผ์‹œ์Šคํ…œ์€ ์Šˆํผ๋ธ”๋ก์— ๋Œ€ํ•œ ๋ฐฑ์—…๋ณธ์„ ๋งˆ๋ จํ•ด๋‘ก๋‹ˆ๋‹ค.
  • ํŒŒ์ผ์‹œ์Šคํ…œ์˜ inode ๊ฐฏ์ˆ˜๊ฐ€ ๊ณ ์ •์ด๋ผ๊ตฌ์š”?
    • ext ๊ณ„์—ด๋งŒ ํ•ด๋‹นํ•˜๋Š” ์–˜๊ธฐ ์ž…๋‹ˆ๋‹ค.
    • ์ฒ˜์Œ ํŒŒ์ผ์‹œ์Šคํ…œ์„ ์„ธํŒ…ํ•  ๋•Œ, ์ €์žฅํ•˜๋Š” ํŒŒ์ผ์˜ ํ‰๊ท  ํฌ๊ธฐ๋ฅผ ๊ธฐ์ž… ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ํ‰๊ท ์ ์œผ๋กœ ํŒŒ์ผ ํ•˜๋‚˜๊ฐ€ 16kb ํฌ๊ธฐ๋ฅผ ๊ฐ€์งˆ๊ฑฐ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ํŒŒ์ผ์‹œ์Šคํ…œ์˜ inode ์ด ๊ฐฏ์ˆ˜๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ext ๊ณ„์—ด์€ ํ•œ๋ฒˆ inode ์ด ๊ฐฏ์ˆ˜๋ฅผ ์ •ํ•˜๋ฉด, ์ด๋Ÿ‰์„ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ํŒŒ์ผ์‹œ์Šคํ…œ ๋ณผ๋ฅจ์„ ํ™•์žฅํ•˜๋ฉด, inode ์ด ๊ฐฏ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜์ง€ ์•Š๋‚˜์š”?
    • ๋งž์•„์š”.
    • ext4์™€ xfs ๋‘˜๋‹ค ๋ธ”๋ก ๊ทธ๋ฃน๊ณผ Allocation Group ๋ธ”๋ก์— ์ •ํ•ด์ง„ inode ์ด๋Ÿ‰/์ƒํ•œ์€ ์ •ํ•ด์ ธ ์žˆ์–ด์š”.
    • ํ•˜์ง€๋งŒ, ๋ธ”๋ก&AG ๊ทธ๋ฃน ๋ณ„๋กœ ์กด์žฌํ•˜๋Š” ์ด๋Ÿ‰/์ƒํ•œ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ณผ๋ฅจ ํ™•์žฅ์œผ๋กœ ๊ทธ๋ฃน์ด ๋Š˜์–ด๋‚˜๋ฉด inode ์บํŒŒ๋„ ํ•จ๊ป˜ ๋Š˜๊ธฐ ๋•Œ๋ฌธ์—, ํŒŒ์ผ ์‹œ์Šคํ…œ ์ „์ฒด์˜ inode ์บํŒŒ๊ฐ€ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.
  • ๋ธ”๋ก ์‚ฌ์ด์ฆˆ(4kb)์™€ ํŒŒ์ผ ํ‰๊ท  ํฌ๊ธฐ(16kb) ์ฐจ์ด๊ฐ€ ๋ญ˜๊นŒ/
    • inode ์ด๋Ÿ‰์„ ์ง€์ •ํ•  ๋•Œ, ํŒŒ์ผ ํ‰๊ท  ํฌ๊ธฐ๋ฅผ 16kb๋กœ ์žก์•˜๋‹ค๋Š” ๊ฑด, ๋ธ”๋ก ์‚ฌ์ด์ฆˆ๊ฐ€ 4kb์ผ ๋•Œ, ํ•œ ํŒŒ์ผ์ด ๋ธ”๋ก 4๊ฐœ ํฌ๊ธฐ์ธ 16kb ์ˆ˜์ค€์˜ ํ‰๊ท ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฐ€์ • ์ž…๋‹ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ, 16kb ์ดํ•˜์˜ small file์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค๋ฉด, inode๊ฐ€ ๊ณ„ํš ํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์†Œ์ง„ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • xfs์—์„œ๋Š” inode ๊ฐฏ์ˆ˜๊ฐ€ ๋™์ ์ด๋‹ค?
    • ๋ณ„๋„ ๋ฌธ๋‹จ์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃฐ๊ฒŒ์š”!

xfs: inode dynamic allocation

ext4๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ํฌ๋งทํ•˜๋Š” ์‹œ์ ์— inode table์˜ ์˜์—ญ์„ ์ •์ ์œผ๋กœ ์˜ˆ์•ฝ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ inode๋ฅผ ๋ชจ๋‘ ์†Œ์ง„ํ•˜๋ฉด, ๋ฐ์ดํ„ฐ ์‹ ๊ทœ ์“ฐ๊ธฐ์™€ ํŒŒ์ผ ์ƒ์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค.

Superblock
(ํŒŒ์ผ์‹œ์Šคํ…œ ์ „์ฒด ์ •๋ณด)
B+Tree ์ธ๋ฑ์Šค
Data Blocks
(inode + ์‹ค์ œ ํŒŒ์ผ ๋ฐ์ดํ„ฐ)

๋ฐ˜๋ฉด์— xfs๋Š” inode๋ฅผ ๋™์ ์œผ๋กœ ํ• ๋‹น ํ•ฉ๋‹ˆ๋‹ค. xfs๋Š” ๋ ˆ์ด์•„์›ƒ์—์„œ ๊ณ ์ •๋œ inode table ์˜์—ญ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ํŒŒ์ผ์ด ์ƒ์„ฑ๋  ๋•Œ, ๋ฐ์ดํ„ฐ ๋ธ”๋ก ์˜์—ญ์—์„œ inode chunks๋ฅผ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

inode chunk๋Š” 64๊ฐœ์˜ inode๋ฅผ ๋ฌถ์€ ๋‹จ์œ„ ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ๋งŽ์ด ์ƒ๊ธฐ๋ฉด chunk๋ฅผ ์ถ”๊ฐ€๋กœ ํ• ๋‹นํ•˜๊ณ , inode chunk๋ฅผ ์‚ฌ์šฉ ํ–ˆ๋˜ ํŒŒ์ผ์ด ๋ชจ๋‘ ์‚ญ์ œ ๋˜๋ฉด, chunk๋ฅผ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์œผ๋กœ ๋ฐ˜ํ™˜ ํ•ฉ๋‹ˆ๋‹ค.


๊ทธ๋Ÿผ xfs๋Š” inode๋ฅผ ์–ด๋–ป๊ฒŒ ์ถ”์ ํ•˜๋Š”๊ฐ€?

์œ„์—๋„ ์ ์—ˆ๋“ฏ, xfs๋Š” inode๋ฅผ 1๊ฐœ์”ฉ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ , 64๊ฐœ ๋ฌถ์Œ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  inode chunk ๋งˆ๋‹ค 64bit์˜ bitmask๊ฐ€ ์žˆ์–ด์„œ free or used ์—ฌ๋ถ€๋ฅผ ํŠธ๋ž˜ํ‚น ํ•ฉ๋‹ˆ๋‹ค.

free mask: 1111000101000100...

ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์•„๋ฌด๋Ÿฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ํด๋ฆฐ ์ƒํƒœ์—์„œ, ๋งจ ์ฒซ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•˜๊ณ  ์‹œ์ž‘ํ•ด๋ด…์‹œ๋‹ค.

์ฒซ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒˆ๋กœ์€ inode chunk ํ• ๋‹น๋ถ€ํ„ฐ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 64๊ฐœ ์Šฌ๋กฏ์ด ๋ชจ๋‘ ๋น„์–ด ์žˆ๋Š” inode chunk๋ฅผ ๋ฐ์ดํ„ฐ๋ธ”๋ก์—์„œ ์ƒ์„ฑ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด inode chunk๋Š” inobt์™€ finobt๋ผ๋Š” inode chunk๋ฅผ ๋ชจ์€ ๊ณต๊ฐ„์— ์ถ”๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

inobt: [#0, free=1111....1111] <- ์ถ”๊ฐ€๋จ
finobt: [#0, free=1111....1111] <- ์ถ”๊ฐ€๋จ (๋นˆ ์Šฌ๋กฏ ์ƒํƒœ๋กœ ์‹œ์ž‘ํ•˜๋‹ˆ๊นŒ)

inobt๋Š” ๋ชจ๋“  inode chunk๋ฅผ ๋ชจ์•„๋‘๋Š” ๋ฐฐ์—ด์ด๊ณ , finobt๋Š” inode chunk ์ค‘ ๋นˆ ๊ณต๊ฐ„์ด ์žˆ๋Š” ๊ฒƒ๋“ค๋งŒ ๋ชจ์•„๋‘๋Š” ๋ฐฐ์—ด ์ž…๋‹ˆ๋‹ค.

์ด์ œ chunk ์ƒ์„ฑ ํ›„, ์‹ค์ œ๋กœ ํŒŒ์ผ์ด ์ƒ์„ฑ ๋˜์–ด inode ํ•˜๋‚˜๊ฐ€ ํ• ๋‹น ๋˜๋ฉด, ํ•ด๋‹น inode chunk์˜ ์Šฌ๋กฏ์— ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉ ํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

inobt: [#0, free=1111....1110] <- free mask ๊ฐฑ์‹ 
finobt: [#0, free=1111....1110] <- free mask ๊ฐฑ์‹  (์•„์ง ๋นˆ ์Šฌ๋กฏ์ด ์žˆ์Œ)

์ด ํ‘œ์‹œ๋Š” inobt์™€ finobt ์–‘์ชฝ ๋ชจ๋‘ฅ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํŒŒ์ผ ์“ฐ๊ธฐ์™€ ์ƒ์„ฑ์ด ๋ฐ˜๋ณต ๋˜๋ฉด์„œ ์ตœ์ดˆ ํ• ๋‹นํ•œ inode chunk์˜ 64๊ฐœ ์Šฌ๋กฏ์„ ๋ชจ๋‘ ์‚ฌ์šฉ ํ–ˆ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค.

inobt: [#0, free=0000....0000] <- free mask ๊ฐฑ์‹ 
finobt: (๋น„์–ด์žˆ์Œ) <- finobt์—์„œ #0๋Š” ์ œ๊ฑฐ.

inobt์— ๋ชจ๋“  ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œํ•˜๊ณ , finobt์—๋Š” ํ•ด๋‹น inode chunk๋ฅผ ์ œ๊ฑฐ ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ, ์ด ์ƒํƒœ์—์„œ ํŒŒ์ผ์ด ํ•˜๋‚˜ ์‚ญ์ œ ๋˜์–ด #0 chunk์— ๋‹ค์‹œ ๋นˆ ์Šฌ๋กฏ์ด ์ƒ๊ธฐ๋ฉด, ํ•ด๋‹น chunk๋Š” ๋‹ค์‹œ finobt์— ์ถ”๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

inobt: [#0, free=1000....0000] <- free mask ๊ฐฑ์‹ 
finobt: [#0, free=1000....0000] <- ๋นˆ ์Šฌ๋กฏ์ด ์ƒ๊ฒจ์„œ ๋‹ค์‹œ ์ถ”๊ฐ€

๋งŒ์•ฝ ๋ชจ๋“  ํŒŒ์ผ์„ ์‚ญ์ œ ํ•ด์„œ, chunk์˜ 64๊ฐœ ์Šฌ๋กฏ์ด ๋ชจ๋‘ ํ•ด์ œ ๋œ๋‹ค๋ฉด,

inobt: (empty)
finobt: (empty)

inobt์™€ finobt ๋‘˜๋‹ค์—์„œ chunk๋ฅผ ์‚ญ์ œํ•˜๊ณ , inode chunk์˜ ์ž์›์„ ํ•ด์ œํ•ด ๋ฐ์ดํ„ฐ ๋ธ”๋ก์— ๋ฐ˜ํ™˜ ํ•ฉ๋‹ˆ๋‹ค.

finobt๋Š” ์™œ ์žˆ๋Š”๊ฐ€?

xfs์—์„œ finobt๋กœ ์™œ ๋นˆ ์Šฌ๋กฏ์ด ์žˆ๋Š” chunk๋ฅผ ๋”ฐ๋กœ ๊ด€๋ฆฌํ• ๊นŒ?

์ด์œ ๋Š” ๋นˆ ์Šฌ๋กฏ์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„ ๋น ๋ฅด๊ฒŒ ํŒŒ์ผ ์ƒ์„ฑ๊ณผ ์“ฐ๊ธฐ ์œ„ํ•ด์„œ ์ž…๋‹ˆ๋‹ค.

  • ๋งŒ์•ฝ finobt๊ฐ€ ์—†์—ˆ๋‹ค๋ฉด
    • ํŒŒ์ผ ์ƒ์„ฑ ๋•Œ, ๋นˆ ์Šฌ๋กฏ์ด ์žˆ๋Š” chunk๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด inobt ์ „์ฒด๋ฅผ ํƒ์ƒ‰ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฏธ ์ƒ์„ฑ๋œ inode chunk๊ฐ€ ๋งŽ์„์ˆ˜๋ก ํƒ์ƒ‰ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง‘๋‹ˆ๋‹ค.
  • finobt๊ฐ€ ์žˆ์œผ๋ฉด
    • ํŒŒ์ผ ์ƒ์„ฑ ๋•Œ, finobt์—์„œ ํƒ์ƒ‰ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

inobt, finobt์—์„œ B+Tree์˜ ์—ญํ• 

inobt์™€ finobt๋Š” chunk๋“ค์„ inode ๋ฒˆํ˜ธ ๊ธฐ์ค€ ์ •๋ ฌ๋œ ํŠธ๋ฆฌ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ inode ๋ฒˆํ˜ธ๋กœ chunk๋ฅผ ์ฐพ์„ ๋•Œ, O(log n)์œผ๋กœ ํƒ์ƒ‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

a.txt ํŒŒ์ผ์„ ์—ด์–ด์„œ ํ•ด๋‹น ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด์„œ inode #130๋ฒˆ์— ์ ‘๊ทผ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, inobt์—์„œ #130๋ฒˆ์„ O(log N) ์†๋„๋กœ ํƒ์ƒ‰ํ•˜๊ณ , ๋””์Šคํฌ์—์„œ ํ•ด๋‹น inode ์ •๋ณด์™€ ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ B+Tree๋Š” inode๋ฅผ ๋น ๋ฅด๊ฒŒ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ์ธ๋ฑ์Šค ์—ญํ•  ์ž…๋‹ˆ๋‹ค.

xfs์—์„œ inode๊ฐ€ ๊ณ ๊ฐˆ ๋  ์ˆ˜ ์žˆ๋‚˜?

xfs๋Š” inode๋ฅผ ํ•„์š”ํ•  ๋•Œ๋งŒ ํ• ๋‹นํ•˜๋Š” ๋™์  ํ• ๋‹น ๋ฐฉ์‹์ด์ง€๋งŒ, inode๋ฅผ ๋ฌดํ•œํžˆ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

inode๋ฅผ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์—์„œ ํ• ๋‹นํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, inode๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ง€๋ฉด ๊ทธ๋งŒํผ ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ xfs์—์„œ inode ๊ณ ๊ฐˆ์„ ๋งŒ๋‚ฌ๋‹ค๋ฉด, ๋””์Šคํฌ์—์„œ ๋ฐ์ดํ„ฐ ๋ธ”๋ก ๊ณต๊ฐ„์„ ๋ชจ๋‘ ์†Œ์ง„ํ•œ ์ƒํ™ฉ์ด๋‚˜ ๋งˆ์ฐฌ๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.

ํ•˜๋“œ ๋งํฌ์™€ ์‹ฌ ๋งํฌ

ํ•˜๋“œ ๋งํฌ

  • ln a.txt b.txt
  • ์›๋ณธ๊ณผ ๋ณต์‚ฌ๋ณธ ๊ฐœ๋…์ด ์—†๋Š” ๋งํ‚น
  • ๋‘˜๋‹ค ์™„์ „ ๋™์ผํ•œ inode๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
  • rm a.txt๋กœ ํ•˜๋‚˜๋ฅผ ์‚ญ์ œํ•˜๋ฉด, b.txt๋งŒ ํ•ด๋‹น inode๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ ์ผํ•œ ํŒŒ์ผ์ด ๋ฉ๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ, ์‹ค์ œ ๋ฐ์ดํ„ฐ ์‚ญ์ œ๊ฐ€ ์ด๋ค„์ง€์ง€๋Š” ์•Š๋Š”๋ฐ, ์™œ๋ƒ๋ฉด inode์—์„œ ํ•ด๋‹น inode๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” link count๊ฐ€ 1 ์ด์ƒ์ด๋ฉด ๋ฐ์ดํ„ฐ ๋ธ”๋ก ์‚ญ์ œ๊ฐ€ ์ด๋ค„์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


์‹ฌ๋ณผ๋ฆญ ๋งํฌ

  • ln -s a.txt c.txt
  • ์‹ฌ๋งํฌ๋Š” ์ž๊ธฐ๋งŒ์˜ inode๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ls -li๋กœ ํ™•์ธํ•˜๋ฉด, ๋‘ ํŒŒ์ผ์˜ inode ๊ฐ’์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • ์‹ฌ๋งํฌ inode๋Š” ๋‚ด๋ถ€์— ๋ฐ์ดํ„ฐ ํŒŒ์ผ ๋Œ€์‹ , ์–ด๋–ค ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ๊ฒฝ๋กœ ๋ฌธ์ž์—ด์ด ์ €์žฅ ๋ฉ๋‹ˆ๋‹ค.
  • rm a.txt๋กœ ์‹ฌ๋งํฌ์˜ ์›๋ณธ ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋ฉด
    • ๊ทธ๊ฑธ ๊ฐ€๋ฆฌํ‚ค๋˜ c.txt -> a.txt (์‚ญ์ œ๋จ) ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, c.txt ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๋ฉด Broken Link ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

fd (file descriptor)

์ด๋ฒˆ ํฌ์ŠคํŠธ์˜ ๋‘๋ฒˆ์žฌ ์ฃผ์ œ์ธ fd ์ž…๋‹ˆ๋‹ค.

fd๋Š” File Descriptor์˜ ์•ฝ์–ด๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ๋ฐœ๊ธ‰ ๋ฐ›์€ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ๊ณ ์œ  ๋ฒˆํ˜ธ ์ž…๋‹ˆ๋‹ค.

ํŒŒ์ผ์™€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋„์„œ๊ด€ ๋Œ€์ถœ ์‹œ์Šคํ…œ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ,

ํŒŒ์ผ ์ฑ…
์ปค๋„ ๋„์„œ๊ด€
ํ”„๋กœ์„ธ์Šค ์‚ฌ์šฉ์ž
FD ๋Œ€์ถœ ๋ฒˆํ˜ธ

ํ”„๋กœ์„ธ์Šค๊ฐ€ fd = open("a.txt");๋กœ ํŒŒ์ผ์„ ์˜คํ”ˆ ํ•˜๋ฉด, ์ปค๋„์ด ํ•ด๋‹น ํŒŒ์ผ์— ๋Œ€ํ•ด 4๋ฒˆ ๋ฒˆํ˜ธ๋ฅผ ๋ฐœ๊ธ‰ ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ํ”„๋กœ์„ธ์Šค๋Š” ๊ทธ ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด 4๋ฒˆ ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

read(4, ...);
write(4, ...);
close(4);

์ด๋ ‡๊ฒŒ ํŒŒ์ผ๋ช… "a.txt"๋ฅผ ์“ฐ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ํŒŒ์ผ ๋ฒˆํ˜ธ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์™œ ํŒŒ์ผ๋ช…์ด ์•„๋‹ˆ๋ผ FD ๋ฒˆํ˜ธ๋ฅผ ๋ฐœ๊ธ‰ ํ•˜๊ฒŒ ๋˜์—ˆ์„๊นŒ?

ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•  ๋•Œ, ์ด๋ฆ„ ๋Œ€์‹  ์ˆซ์ž ๋ฒˆํ˜ธ๊ฐ€ ๋” ํŽธํ•˜๋‹ˆ๊นŒ? -> โŒ

ํŒŒ์ผ์„ ์—ด์—ˆ๋‹ค(open)๋Š” ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ , ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ.

๋งŒ์•ฝ ํŒŒ์ผ๋ช…์„ ์‚ฌ์šฉ ํ–ˆ๋‹ค๋ฉด,

read("a.txt", ...);
write("a.txt", ...);

์ด๋ ‡๊ฒŒ ๋งค ํ˜ธ์ถœ๋งˆ๋‹ค ์ปค๋„์ด ๊ฒฝ๋กœ ํƒ์ƒ‰, inode ์ฐพ๊ธฐ, ํŒŒ์ผ ์ƒํƒœ ์ƒ์„ฑ, ์ฝ๊ธฐ ์ˆ˜ํ–‰์„ ๋ฐ˜๋ณต ํ•ด์•ผ ํ•จ.

open()์€ ํŒŒ์ผ ์ฝ๊ธฐ๋ฅผ ์œ„ํ•œ ์ค€๋น„ ์ž‘์—… ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค์—์„œ ํŒŒ์ผ ์ ‘๊ทผ์„ ์œ„ํ•œ fd = open() ์ž‘์—…์„ 1ํšŒ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ทธ ๋’ค๋ถ€ํ„ฐ๋Š” ์ด๋ฏธ ๋กœ๋”ฉํ•œ path lookup, perm check, ์ปค๋„ ํŒŒ์ผ ๊ฐ์ฒด๋ฅผ ๋ชจ๋‘ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํŒŒ์ผ๋ช…์ด ๋ฐ”๊ท€๋”๋ผ๋„, ๊ณ„์† ๊ทธ ํŒŒ์ผ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. fd = opne("a.txt")๋กœ ์˜คํ”ˆํ•œ ํŒŒ์ผ์ด ๋‹ค๋ฅธ ๊ณณ์—์„œ mv a.txt b.txt๋กœ ์ด๋ฆ„์ด ๋ฐ”๋€Œ๋”๋ผ๋„, read(fd, ...)๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ํŒŒ์ผ์— ๊ณ„์†, ์ด์–ด์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฑด ํŒŒ์ผ๋ช…์— ๋งคํ•‘๋˜๋Š” inode๋ฅผ ๋ฏธ๋ฆฌ ์ฐพ์•„๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

fd๋Š” ์‚ฌ์‹ค์ƒ ๋ฐฐ์—ด ์ธ๋ฑ์Šค์ž„.

FD ์ •์ˆ˜๊ฐ’์€ fdtable[]๋ผ๋Š” ๋ฐฐ์—ด ๊ตฌ์กฐ์ฒด์— ์ ‘๊ทผํ•˜๋Š” ์ธ๋ฑ์Šค ์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ก  ํ…Œ์ด๋ธ”์„ HashMap<>์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด, ํŒŒ์ผ๋ช… ๋ฌธ์ž์—ด๋กœ ๋ฃฉ์—… ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์ •์ˆ˜์— ๋น„ํ•ด ๋ฃฉ์—… ์—ฐ์‚ฐ ์ฝ”์ŠคํŠธ๊ฐ€ ๋” ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  fdtable[]์€ ๊ฐ™์€ ํŒŒ์ผ์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ fd ํ• ๋‹น์ด ์ด๋ค„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fd1 = open("a.txt");
fd2 = open("a.txt");

์ด ๊ฒฝ์šฐ, ๊ฐ™์€ ํŒŒ์ผ์„ ์„œ๋กœ ๋‹ค๋ฅธ fd๋กœ ๋ฐœ๊ธ‰ ํ•œ ๊ฒƒ์ด๊ณ , ๋‘ fd๋Š” ์„œ๋กœ ๋‹ค๋ฅธ offset pointer๋ฅผ ๊ฐ€์ง€๊ณ  ๊ด€๋ฆฌ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ๊ฐ™์€ ํŒŒ์ผ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์˜์—ญ์—์„œ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ž‘์—…์„ ํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋Œ€๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ fd ๋งˆ๋‹ค ์–ด๋””๊นŒ์ง€ ์ฝ์—ˆ๋Š”์ง€์— ๋Œ€ํ•œ offset์„ ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜, ํ”„๋กœ์„ธ์Šค๋Š” ์˜คํ”ˆ ์†Œ์ผ“(socket)๋„ fd๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์†Œ์ผ“์€ ๊ฒฝ๋กœ(path)๋ผ๋Š” ๊ฐœ๋…์ด ์—†์Šต๋‹ˆ๋‹ค.

s1 = socket();
s2 = socket();

๋งŒ์•ฝ fdtable[]์ด ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ ์„ค๊ณ„ ์˜€๋‹ค๋ฉด, socket๋“ค์˜ ๊ฒฝ๋กœ๋Š” ๋ญ๋กœ ์ •ํ•ด์•ผ ํ• ๊นŒ์š”? ์ •๋ง ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ ์ „์ฒด ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐ ํ–ˆ์„ ๋•Œ, ํŒŒ์ผ/์†Œ์ผ“/ํŒŒ์ดํ”„๋ผ์ธ/ํ„ฐ๋ฏธ๋„์„ ๋ชจ๋‘ ์ถ”์ƒํ™” ํ•ด์„œ, ๋ชจ๋“  I/O Object๋ฅผ ์˜คํ”ˆ ํ•  ๋•Œ๋Š” ๋ชจ๋‘ fdtable[]์— ๊ธฐ๋กํ•˜๊ณ  fd ๋ฒˆํ˜ธ๋ฅผ ๋ฐœ๊ธ‰ ํ•˜๋Š” ์‹์œผ๋กœ ๋™์ž‘ ํ•ฉ๋‹ˆ๋‹ค.

reserved FD

์œ„์—์„œ๋„ ๋งํ–ˆ๋“ฏ FD๋Š” ์˜คํ”ˆ ํŒŒ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์†Œ์ผ“, ํŒŒ์ดํ”„๋ผ์ธ, ํ„ฐ๋ฏธ๋„์—๋„ ๋ฒˆํ˜ธ๋ฅผ ๋งค๊น๋‹ˆ๋‹ค.

์ด๋•Œ, 0/1/2๋ฒˆ FD๋Š” ์•„๋ž˜๋กœ ์˜ˆ์•ฝ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

0 = stdin
1 = stdout
2 = stderr

์™œ File Descriptor๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™์—ˆ๋‚˜?

์ปดํ“จํ„ฐ ์„ธ๊ณ„์—์„œ๋Š” ์‹๋ณ„์ž๋ฅผ โ€œDescriptorโ€๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

Memory Descriptor
Segment Descriptor
Window Descriptor
Socket Descriptor

FD๋„ ์ด ๊ด€๋ก€๋ฅผ ๋”ฐ๋ผ ์˜คํ”ˆ ํŒŒ์ผ ์‹๋ณ„์ž๋ฅผ File Descriptor๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ด๋ฆ„์€ file Descriptor ์ด์ง€๋งŒ, ํ˜„๋Œ€์—๋Š” ์ปค๋„์ด ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“  I/O ๊ฐ์ฒด๋“ค(์†Œ์ผ“, ํŒŒ์ดํ”„ ๋“ฑ๋“ฑ)์„ ์ฐธ์กฐ ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ํ˜„๋Œ€์—๋Š” File Descriptor ๋ผ๋Š” ์ด๋ฆ„๋ณด๋‹ค I/O Object Descriptor๋ผ๋Š” ํ‘œํ˜„์ด ๋” ์ •ํ™• ํ•ฉ๋‹ˆ๋‹ค.

StarRocks๋Š” CN ๋…ธ๋“œ์˜ FD ๊ฐฏ์ˆ˜๋ฅผ ์ถ”์ ํ•จ

์‚ฌ์‹ค FD๊ฐ€ ๋ญ”์ง€ ๊ฐ ์žก๊ณ  ์•Œ์•„๋ณด๊ฒŒ ๋œ ์ง„์งœ ์ด์œ ๋Š” StarRocks ์šด์˜ ํ•˜๋ฉด์„œ FD ๊ด€๋ จ๋œ ์ง€ํ‘œ๋ฅผ ๋ดค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์Šคํƒ€๋ฝ์Šค๋Š” BE/CN ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ผ๋งŒํผ์˜ FD๋ฅผ ์—ด์–ด์„œ ์‚ฌ์šฉ ์ค‘์ธ์ง€๋ฅผ Prometheus ์ง€ํ‘œ๋กœ ์ˆ˜์ง‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” FD ๊ฐฏ์ˆ˜๋Š” ์ƒํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒŒ fd_num_limit ์ง€ํ‘œ์ธ๋ฐ, ์ด๊ฒƒ ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ , fd_num_used / fd_num_limit ๋น„์œจ์ด ๋†’๊ฒŒ ๋˜๋ฉด, BE/CN ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋”์ด์ƒ ์†Œ์ผ“ ํ†ต์‹ ์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ž‘์—…์„ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Linux์—์„œ FD ํ•œ๊ณ„์— ๋„๋‹ฌํ•ด FD ํ• ๋‹น์„ ๋” ๋ชป ๋ฐ›๊ฒŒ ๋˜๋ฉด, EMFILE(Too many open files) ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  CN ๊ธฐ๋Šฅ๋“ค์ด ์˜ํ–ฅ์„ ๋ฐ›๊ฒŒ ๋˜๋Š”๋ฐ,

  • CN์€ Query๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด FE-CN, CN-CN๊ณผ brpc ์†Œ์ผ“ ํ†ต์‹ ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. FD๊ฐ€ ๋ชจ์ž๋ผ๋ฉด, socket(), connect(), accept() ๊ฐ™์€ ์†Œ์ผ“ ํ†ต์‹ ์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
  • FE๊ฐ€ ๊ณ ๊ฐˆ๋˜๋ฉด, Remote์— ์žˆ๋Š” Object Storage Scan๋„ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  Spill๋„ ์‹คํŒจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€์žฅ ๋ฌด์„œ์šด ๊ฑด, heartbeat socket ์กฐ์ฐจ ํ• ๋‹น์ด ์•ˆ ๋˜์–ด์„œ ๋…ธ๋“œ๊ฐ€ ์‹œ์Šคํ…œ์—์„œ ์ถ•์ถœ๋˜๋Š” ์ƒํ™ฉ ์ž…๋‹ˆ๋‹ค.
  • ์‹ฌ์ง€์–ด ๋กœ๊ทธ ํŒŒ์ผ ์ž‘์„ฑ๋„ ๋ชปํ•˜๊ฒŒ ๋˜์–ด ๋กœ๊ทธ๋„ ๋ชป ๋‚จ๊ธฐ๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์Šคํƒ€๋ฝ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์šด์˜ํ•  ๋•Œ, FD ์‚ฌ์šฉ ๋น„์œจ๋„ ์œ ์‹ฌํžˆ ๋ด์•ผ ํ•˜๋Š” ์ง€ํ‘œ ์ค‘ ํ•˜๋‚˜ ์ž…๋‹ˆ๋‹ค.

์Šคํƒ€๋ฝ์Šค์— FD ์ƒํ•œ์ด ์žˆ์„๊นŒ?

์Šคํƒ€๋ฝ์Šค BE conf์— min_file_descriptor_number = 60000๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์˜ FD ์ƒํ•œ์ด ์ด๊ฒƒ๋ณด๋‹ค ๋‚ฎ๋‹ค๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ธฐ๋™ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๋Š” ์žฅ์น˜ ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ๋”ฐ๋กœ ์„ค์ •ํ•˜์ง„ ์•Š์•˜์ง€๋งŒ, ์•„๋ž˜์™€ ๊ฐ™์€ ์ŠคํŽ™์œผ๋กœ FD limit์ด ์žกํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ EKS ๋…ธ๋“œ์—์„œ ์žก์•„์ค€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • fd soft limit = 65536
  • fd hart limit = 1048567

๋‘ ๊ฐ’์€ ์Šคํƒ€๋ฝ์Šค ๋…ธ๋“œ๊ฐ€ ๋…ธ์ถœํ•˜๋Š” Prometheus metric์—์„œ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™œ soft limit๊ณผ hard limit์ด ์žˆ์„๊นŒ?

์ด๊ฑด ์Šคํƒ€๋ฝ์Šค์˜ ๊ฐœ๋…์ด ์•„๋‹ˆ๊ณ  Linux์˜ ๋ฆฌ์†Œ์Šค ์ œํ•œ ๋ฐฉ์‹ ์ž…๋‹ˆ๋‹ค.

  • hard limit
    • ์ตœ๋Œ€ ํ—ˆ์šฉ์น˜ ์ž…๋‹ˆ๋‹ค.
    • ํ•„์š”ํ•˜๋ฉด soft limit์„ ์ด hard limit๊นŒ์ง€๋งŒ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • soft limit
    • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹ค์ œ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” FD์˜ ์ƒํ•œ์„  ์ž…๋‹ˆ๋‹ค.
    • ์ด๊ฑธ ๋„˜๊ฒŒ ๋˜๋ฉด, Too many open files ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์‹ค์งˆ์ ์œผ๋กœ๋Š” fd_num_used / fd_soft_limit ๋น„์œจ๋งŒ ์ž˜ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์Šคํƒ€๋ฝ์Šค ์„ฑ๋Šฅ์— fd ํŠœ๋‹์ด ์ค‘์š”ํ• ๊นŒ?

๋†‰ โŒ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

fd ์‚ฌ์šฉ ํŠœ๋‹์€ ์„ฑ๋Šฅ ๋ณด๋‹ค๋Š” ์•ˆ์ •์„ฑ ์ง€ํ‘œ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. fd soft limit์„ ๋Š˜๋ฆฐ๋‹ค๊ณ  ํ•ด์„œ ์ฟผ๋ฆฌ๊ฐ€ ๋นจ๋ผ์ง€๋Š” ๊ฒƒ๋„ ์•„๋‹™๋‹ˆ๋‹ค.

inode vs fd

์ฒ˜์Œ ์ด ๊ธ€์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ๋Š” LFCS ์‹œํ—˜์„ ์ค€๋น„ํ•˜๊ณ , ํšŒ์‚ฌ ์ผ์„ ํ•˜๋ฉด์„œ ์ด ๋‘˜์„ ๋งŒ๋‚ฌ์„ ๋•Œ, ์ € ์ž์‹ ์ด ๋‘˜์„ ์ œ๋Œ€๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ  ์„ค๋ช…ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌ ํ•ด์„œ ์ž…๋‹ˆ๋‹ค.

์ด์ œ ์™€์„œ ๋Œ์•„๋ณด๋ฉดโ€ฆ ๋‘˜์ด ์ปจ์…‰์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ํ—ท๊ฐˆ๋ฆฌ๋Š” ์˜์—ญ๋„ ์•„๋‹ˆ์—ˆ๊ตฌ์š”โ€ฆ ใ…‹ใ…‹ ๊ทธ๋ƒฅ ์ œ๊ฐ€ ์ž˜ ๋ชฐ๋ผ์„œ ํ—ท๊ฐˆ๋ ธ๋˜๊ฑฐ ๊ฐ™์•„์š”โ€ฆ ใ…‹ใ…‹

๊ทธ๋ž˜๋„ ์ด๋ฒˆ ๊ธฐํšŒ์— ๊ฐ๊ฐ์„ ์ œ๋Œ€๋กœ ์‚ดํŽด๋ณด๊ณ , ์–ด๋–ค ์˜์—ญ์—์„œ ์ €์™€ ๋งˆ์ฃผ์น  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํžˆ ํ™•์ธํ•œ ๊ฒƒ ๊ฐ™์•„ ํ›„๋ จ ํ•ฉ๋‹ˆ๋‹ค ใ…Žใ…Ž

๊ทธ๋ž˜์„œ ๋‘˜์˜ ์ฐจ์ด๋Š” ๋ญ๋ผ๊ตฌ์š”?

  • inode๋Š” ํŒŒ์ผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ €์žฅํ•œ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋‹ค.
  • fd๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์˜คํ”ˆํ•œ ํŒŒ์ผ์— ๋Œ€ํ•ด ๋ถ€์—ฌํ•œ ์‹๋ณ„์ž ์ •์ˆ˜ ๋ฒˆํ˜ธ๋‹ค.

Categories:

Updated: