inode์ fd
๋ฆฌ๋
์ค ์ํ์ ์ค๋นํ๋ฉด์, ๊ทธ๋ฆฌ๊ณ ์ค๋ฌด๋ฅผ ํ๋ฉด์ ๋ฌด์ฌ์ฝ ์ง๋์ณค๋ ๊ฐ๋
๋ค์ ๋ค์ ๋ณด๋ฉฐ, โ๋ด๊ฐ ์ด๊ฑธ ์ผ๋ง๋ ์ค๋ช
ํ ์ ์๋๊ฐ?โ๋ฅผ ์๊ฐํด๋ณด๋ฉฐ ๋ค์ ๋ณด๊ณ ์์ด์.
์ด ๊ธ์ 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๊ฐ ๊ณํ ํ๋ ๊ฒ๋ณด๋ค ๋น ๋ฅด๊ฒ ์์ง ๋ ์ ์์ต๋๋ค.
- 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๊ฐ ๋ง์์๋ก ํ์ ์๊ฐ์ด ๊ธธ์ด์ง๋๋ค.
- ํ์ผ ์์ฑ ๋, ๋น ์ฌ๋กฏ์ด ์๋ 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๋ ํ๋ก์ธ์ค๊ฐ ์คํํ ํ์ผ์ ๋ํด ๋ถ์ฌํ ์๋ณ์ ์ ์ ๋ฒํธ๋ค.