XFS File System
μ΄μ μ μΉ΄νμΉ΄ λΈλ‘컀 μμ
μ νλ©΄μ μ λ νμΌ μμ€ν
μ λν κΈμ μΌμλ€.
μ΄μ 리λ
μ€ μ€ν λ¦¬μ§ μͺ½μ 곡λΆνλ©΄μ xfs, ext4λ₯Ό λ€μ λ³΄κ² λμλλ°, βμ λλ§μ νλ€β λΉΌκ³ λ λ΄κ° μ΄κ²λ€μ λν΄ μ무κ²λ μ€λͺ
ν μ μλ€λ κ±Έ κΉ¨λ¬μλ€β¦;;
κ·Έλμ μ΄λ² μ£Όλ§μ xfs, ext4λ₯Ό μ λλ‘ μ΄ν΄λ³΄λ©΄μ B+Tree μλ£κ΅¬μ‘°λ 0-to-1μΌλ‘ λ€μ ꡬνν΄λ³΄λ μκ°μ κ°μ‘λ€.
μ΄μ λ xfsλ₯Ό μ λλ‘ μ΄ν΄ν΄λ³Ό λ§μμ΄ μκ²Όλ€. νλ² λ€μ¬λ€λ³΄μ.
μ°κΈ° μ±λ₯ μΈ‘λ©΄
μλ§μ CPUκ° λμμ ν° λ°μ΄ν°λ₯Ό μ¨λ λ³λͺ© μμ΄ μ²λ¦¬νμ.
1990λ λμ λν μλ²λ₯Ό μ΄μνλ€κ³ ν΄λ΄ μλ€. κ·Έλλ μ΄λ―Έ λνμλ²λ λ©ν° μ½μ΄λ‘ λμν©λλ€.
κ·Έλμ κ° CPUλ§λ€ κ°μμ μμ μ λμμ μννκ³ μμ΅λλ€.
CPU0 : λ‘κ·Έ νμΌ μμ±
CPU1 : λ°μ΄ν°λ² μ΄μ€ μ°κΈ°
CPU2 : μ΄λ―Έμ§ μ μ₯
CPU3 : λλ ν 리 μμ±
λ©ν° μ½μ΄ μλ²μμ λμμ νμΌμμ€ν μ μ κ·Όν΄ μμ μ μνν΄μΌ ν©λλ€.
νμ§λ§, νμΌμμ€ν μ΄ μ 체 μ°κΈ° μμ μ λν΄ λ¨μΌ μ μ λ½(single global lock)μ κ°μ§κ³ μλ€λ©΄, CPUκ° λμμ μμ μ μννλλΌλ μ°κΈ°λ νλ²μ ν CPUλ§ κ°λ₯ν©λλ€.
CPU0 μμ
μ€
CPU1 λκΈ°
CPU2 λκΈ°
CPU3 λκΈ°
μ΄κ²μ λμ€ν¬κ° RAIDλ‘ λ¬Άμ¬ μμ΄λ λμΌν©λλ€. RAID λμ€ν¬ μμμ νμΌμμ€ν μ΄ μ΄μλκΈ° λλ¬Έμ΄μ£ .
xfsμ μ€κ³μλ€μ βλμ€ν¬κ° λλ¦°κ² λ¬Έμ κ° μλλΌ νμΌμμ€ν μ΄ λ³λ ¬μ±μ κ°μ§μ§ μλκ² λ¬Έμ λ€βλΌκ³ 보μμ΅λλ€. κ·Έλμ νμΌμμ€ν μ Nκ°μ λ 립μ μΈ λΈλ‘μΌλ‘ λλκ³ , κ° λΈλ‘μ λν΄ λ©νλ°μ΄ν° λ½μ κ°λλ‘ λΆμ°ν©λλ€.
μ΄ λ 립μ μΈ λΈλ‘μ βAllocation Groupβμ΄λΌκ³ ν©λλ€.
CPU0 β AG0
CPU1 β AG1
CPU2 β AG2
CPU3 β AG3
κ° CPUλ κ°λ³ AGμ λμμ μ°κΈ° μμ μ μνν©λλ€. κ° AGμ λν΄μ μ°λ λκ° λμμ νμΌ μμ±, inode ν λΉ, λΈλ‘ ν λΉ, λλ ν 리 μμ λ±μ νμΌμμ€ν μ°κΈ° μμ μ μνν μ μμ΅λλ€.
μ΄κ²μ΄ λ°λ‘ βλ³λ ¬ νμΌμμ€ν βμΈ xfs μ λλ€.
μ Allocation Groupμ΄ νμνκ°?
μμ νμΌμμ€ν μ νλμ μνΌλΈλ‘μΌλ‘ κ΅¬μ± λμ΄ μμμ΅λλ€.
Filesystem
βββ Superblock
βββ Inode Table
βββ Data Blocks
βββ Free Block Bitmap
νμΌ μμ±μ νλ €λ©΄, λΉ inodeλ₯Ό μ°Ύκ³ , λΉ blockμ μ°Ύκ³ , bitmapμ μμ νκ³ , inodeλ₯Ό μμ ν΄μΌ ν©λλ€.
κ·Έλ¦¬κ³ λͺ¨λ CPUκ° λ¨μΌ κ°μ²΄μ μ κ·Όνκ³ μμ ν΄μΌ ν©λλ€. μ΄λ¬λ©΄ λ½ κ²½ν©(lock contention)μ΄ λ°μν©λλ€.
xfsλ νμΌμμ€ν μ Allocation Groupμ΄λΌλ λ¨μλ‘ μͺΌκ°°μ΅λλ€.
κ·Έλ¦¬κ³ κ° AGλ λ 립μ μΈ λ©νμ 보 κ°μ²΄λ₯Ό κ°μ§λλ€.
AG0
βββ Free Blocks
βββ Free Inodes
βββ Metadata
AG1
βββ Free Blocks
βββ Free Inodes
βββ Metadata
...
κ·Έλμ κ° CPUκ° μλ‘ λ€λ₯Έ AGμ μ°κΈ° μμ μ νλ€λ©΄, μΆ©λμ΄ λ°μνμ§ μμ΅λλ€.
AGμ λ©νλ°μ΄ν°λ B+Treeλ‘ κ΅¬ν λμ΄ μμ΅λλ€.
AG0
Free Space B+Tree
β
βββ (1000, 50)
βββ (2000, 30)
βββ (5000, 100)
Inode B+Tree
β
βββ inode 1
βββ inode 2
βββ inode 3
κ·Έλμ CPU0κ° AG0μ B+Treeλ₯Ό μμ νλ λμ, CPU1μ AG1μ B+Treeλ₯Ό μμ ν μ μμ΅λλ€.
xfsλ₯Ό μ΄ν΄ν λ, νμΌμμ€ν μ λ°μ΄ν°λ² μ΄μ€μ²λΌ μκ°νλ©΄ μ’λ μ½κ² μλΏμ΅λλ€.
- inode = DB λ μ½λ
- B+Tree = DB μΈλ±μ€
- AG = μ€λ(shard)
- CPU = λμ νΈλμμ
xfsκ³Ό κΈ°μ‘΄ ext2μ μ°¨μ΄λ Free Spaceλ₯Ό κ΄λ¦¬νλ μλ£κ΅¬μ‘°μ μμ΅λλ€.
ext2λ Free Spaceλ₯Ό bitmapμΌλ‘ κ΄λ¦¬νμ§λ§, xfsλ Free Spaceλ₯Ό B+Treeλ‘ κ΄λ¦¬ν©λλ€.
B+Treeλ‘ κ΅¬ννλ©΄, 100GB μ°μ κ³΅κ° μ°ΎκΈ° κ°μ μ§μλ₯Ό λ λΉ λ₯΄κ² μνν μ μμ΅λλ€.
Delayed Allocation
μ°κΈ° μμ²μ΄ λ€μ΄μλ μ¦μ λΈλ‘μ ν λΉνμ§ μμ.
f.write(data)μ κ°μ μΌλ°μ μΈ νμΌ μ°κΈ°λ νμΌ μμ€ν
μμ λΈλ‘ ν λΉ -> λ°μ΄ν° μ°κΈ° μμλ‘ μν λ©λλ€.
Write νμλ₯Ό Nλ² μ°μμΌλ‘ νλ€λ©΄, N x (λΈλ‘ ν λΉ -> λ°μ΄ν° μ°κΈ°)κ° μ΄λ€μ§λλ€.
μ΄λ¬λ©΄, λ°μ΄ν° Fragmentationμ΄ λ°μνκ³ , λμ€ν¬ I/Oλ λ§μμ§λ©° Metadata Udpateλ μμ£Ό λ°μν©λλ€.
Delayed Allocationμ μ΄κ±Έ μ§μ°μ²λ¦¬ν΄μ νλ²μ μννλ μμ΄λμ΄ μ λλ€.
f.write(data)κ° μνλλ©΄, μΌλ¨ λ°μ΄ν°λ₯Ό Page Cache λ©λͺ¨λ¦¬μ λ°μλ‘λλ€. λ°μ΄ν° μ
λ°μ΄νΈλ Page Cache μμμ μννκ³ Page Dirty μνλ‘ κ³μ μ
λ°μ΄νΈ ν©λλ€.
μ¬κΈ°κΉμ§λ λ©λͺ¨λ¦¬λ§ μ¬μ©ν©λλ€. κ·Έλ¬λ€κ° Page Cache EvictμΌλ‘ μΈν΄ spill to disk νκ±°λ, flush()κ° λ°μνλ©΄ μ§κΈκΉμ§ λ©λͺ¨λ¦¬μ μλ λ΄μ©μ λͺ¨μ νλ²μ λμ€ν¬ μ°κΈ°λ₯Ό μνν©λλ€.
write 4KB
write 4KB
write 4KB
write 4KB
β μμ§ λμ€ν¬ λΈλ‘ λ―Έν λΉ
(flush μμ )
16KB μ°μ κ³΅κ° ν보
μ΄λ κ² νλ©΄, λ§€λ² λ°μ΄ν° μ°κΈ°λ₯Ό ν΄μ μ£Όμκ° μ΄κ³³μ κ³³ νμ΄μ§μ§ μκ³ , μ°μλ λ°μ΄ν°λ₯Ό μ°μλ 곡κ°μ λ£μ νλ₯ μ΄ λμμ§λλ€.
κ·Έλ¦¬κ³ λΈλ‘ ν λΉμ νλ²μ μ²λ¦¬νκΈ° λλ¬Έμ, λ©νλ°μ΄ν° μ λ°μ΄νΈλ κ°μ ν©λλ€.
μ΄λ° μ§μ° μ°κΈ°λ λμ©λ μ°κΈ° μ±λ₯μ ν₯μμν΅λλ€. λ‘κ·Έ μλ², DB, μμ μ μ₯ λ±μ μν¬λ‘λλ μ°κΈ° μμ μ΄ κ³μν΄μ λ€μ΄μ΅λλ€. μ΄κ±Έ λ§€λ² μ²λ¦¬ν기보λ€λ λ¬Άμ΄μ νλ²μ μ²λ¦¬νλκ² μ΄λ μ λλ€.
Extent κΈ°λ° κ³΅κ° κ΄λ¦¬
λΈλ‘ 곡κ°μ μμμ κ³Ό μ°μλ λΈλ‘μ ν¬κΈ°λ‘ νννμ.
λΈλ‘ μ¬μ΄μ¦κ° 4KB, νμΌμ΄ 16KBλΌλ©΄ 4κ° λΈλ‘μ μ¨μΌ νλλ°, κΈ°μ‘΄ νμΌμμ€ν μ λμ€ν¬λ₯Ό λΆν ν λΈλ‘ 곡κ°μ μ΄λ κ² μ μ₯ νμ΅λλ€.
[100, 101, 102, 103]
λ§μ½, νμΌμ΄ 1GB μλ€λ©΄, 1GB / 4KB = 260K λΈλ‘μ μ«μ λ°°μ΄λ‘ κΈ°λ‘ νμ΅λλ€.
Extentμ μμ΄λμ΄λ μ°μλ λΈλ‘ 곡κ°μ νννκΈ° μν΄ (start, length) λ°©μμΌλ‘ ννν©λλ€.
κ·Έλμ 16KB νμΌμ΄ μ°μ λΈλ‘μΌλ‘ μ‘΄μ¬νλ€λ©΄, (start=1000, length=4)λ‘ νννλ©΄ λμ
λλ€.
1GB νμΌμ΄λΌλ©΄, (start=1000, length=260K)λ‘ 2-size tupleλ‘ λμ
λλ€!
λ§μ½ νμΌμ΄ μ‘°κ°λ λΈλ‘μΌλ‘ μ‘΄μ¬νλλΌλ, Extentλ‘λ (100, 3), (500, 2), (900, 4) μ΄λ κ² νννλ©΄ κ·Έλ§ μ
λλ€.
xfsμ 3κ°μ§ λͺ¨λλ₯Ό μ±ν νκΈ° λλ¬Έμ κ°νλ€
- Allocation Group
- Delayed Allocation
- Extent κΈ°λ° κ΄λ¦¬
xfsλ μμμ μ€λͺ ν 3κ°μ§ κΈ°λ²μ 1994λ μ λͺ¨λ κ°μ§κ³ μμμ΅λλ€.
extλ ext4(2008)μ΄ λμμμΌ xfsκ° μ±ν νλ μ₯μ λ€μ μ§μν©λλ€. xfsκ° 1994λ μ μΆμ λμμΌλ λ¬΄λ € 14λ μ μκ°μ΄ κ±Έλ¦°κ±°μ£ . ext4μμλ λ³λ ¬ μ°κΈ°λ₯Ό μ§μνκΈ° μμνμ§λ§, κ·Έ ꡬνμ xfsμ λΉκ΅νμ λ μ¬λ λ€λ¦ λλ€. μ΄μ¨λ ext4λ 14λ μ κΈ°λ€λ € λ³λ ¬ μ°κΈ°λ₯Ό λ¬μ±ν μνμμ.
μμ μ±
Metadata Journaling
μ λ νμΌ μμ€ν μλ μ μμ§λ§, xfsλ μ λλ§μ μ§μνλ νμΌμμ€ν μ λλ€.
κ·Έμ€μμλ λ©νλ°μ΄ν°μ λν μ λλ§μ μ§μνμ£ . μ λλ§μ λν λ΄μ©μ μμ ν¬μ€νΈμμ μμΈν μ μκΈ°μ μ¬κΈ°μμλ μΈκΈλ§ νκ³ λμ΄κ°λλ€.
ext κ³μ΄μμ ext3(2001)μ μ λλ§ κΈ°λ₯μ΄ μΆκ° λ©λλ€. μ΄κ²λ xfsκ° 1994λ λΆν° μ§μνλκ±Έ μκ°νλ©΄ λ¬΄λ € 7λ μ΄ κ±Έλ¦°κ±°μ£ .
νμ₯μ±
컀λ κ°λ°μ κ΄μ μμλ XFSλ₯Ό μ€λͺ ν λ λ³΄ν΅ βhighly scalable filesystemβ μ΄λΌκ³ λΆλ₯΄μ§, βparallel disk filesystemβ μ΄λΌκ³ λ μ λΆλ₯΄μ§ μμ΅λλ€. ν΅μ¬μ λμ€ν¬λ³΄λ€ νμ₯μ±(scalability) μ μμ΅λλ€.
xfsμ μ€κ³ λͺ©νλ βκ±°λν μμ€ν μμλ μ±λ₯μ΄ λ¬΄λμ§μ§ μλ νμΌ μμ€ν βμ λλ€. κ·Έλμ μμ€ν μ CPUκ° λμ΄λλ κ²½μ°λ₯Ό μ½κ² λμνκ³ , μ¨λΌμΈμΌλ‘ νμΌ μμ€ν ν νμ₯μ΄ κ°λ₯ν©λλ€!
μ¨λΌμΈ νμ₯
xfsλ μ΄μ μ€μΈ νμΌ μμ€ν
μ xfs_growfsλ‘ μ¨λΌμΈ νμ₯μ΄ κ°λ₯ν©λλ€.
xfsλ νμΌ μμ€ν μ νμ₯ν λ, κΈ°μ‘΄ ꡬ쑰λ₯Ό μ¬λ°°μΉ νμ§ μκ³ , λ€μ μλ‘μ΄ Allocation Groupμ μΆκ°νλ λ°©μμΌλ‘ νμ₯ ν©λλ€.
κΈ°μ‘΄ XFS
+------+------+
| AG0 | AG1 |
+------+------+
λμ€ν¬/LV νμ₯ ν
+------+------+------+------+
| AG0 | AG1 | AG2 | AG3 |
+------+------+------+------+
λ€μ AGλ₯Ό λΆμ΄λ λ°©μμ΄κΈ° λλ¬Έμ, νμΌμμ€ν μ΄ on-write/on-read μνμμλ ν¬κΈ°λ₯Ό λ리면μ κΈ°μ‘΄ λ°μ΄ν° μ μ§κ° κ°λ₯ν©λλ€.
CPU νμ₯
λμ€ν¬μ CPUλ λ 립μ μΈ μμμ΄κΈ° λλ¬Έμ, λμ€ν¬λ₯Ό μ μ§νλ©΄μ CPUλ§ μ€νμ νλκ² κ°λ₯ν©λλ€.
κ·Έλμ μ²μμλ 1 CPUλ‘ μμν μμ€ν
μ΄ 4 CPU -> 8 -> 16 -> 64 CPUκΉμ§ νμ₯ν μλ μμ£ .
CPUκ° μ¦κ°ν μλ‘ νμΌ μμ€ν μΌλ‘ λ€μ΄μ€λ μμ±/μμ /μ°κ² μμ²λ μ¦κ°νκ² λ©λλ€.
κΈ°μ‘΄μ ext2λ λ¨μΌ λ©νλ°μ΄ν° λ½μ΄ μκΈ° λλ¬Έμ, CPUκ° 2λ°° λμ΄λλλΌλ λμ€ν¬ μ°κΈ° μ±λ₯μ΄ 2λ°° λμ΄λλ κ±Έ 보μ₯νμ§ μμ΅λλ€.
νμ§λ§, xfsλ Allocation GroupμΌλ‘ λμ€ν¬λ₯Ό λΆν νκ³ λ³λ ¬ μ°κΈ°κ° κ°λ₯νκΈ° λλ¬Έμ, CPUλ₯Ό 2λ°° λ리면 λμ€ν¬ μ°κΈ° μ±λ₯λ μ νμ μΌλ‘ μ¦κ°νλ μΆμΈλ₯Ό 보μμ΅λλ€.
λ¨, CPUκ° λμ΄λλ€κ³ ν΄μ κΈ°μ‘΄μ ν λΉν AG κ°―μκ° λμ΄λλ건 μλλλ€. CPU κ°―μ <= AG κ°―μλΌλ λΆλ±μμ΄ μ μ§λλ νκ²½μμλ CPU μ½μ΄ μ¦κ°κ° λμ€ν¬ μ°κΈ° μ±λ₯κ³Ό λΉλ‘νκ² λλ€λ μλ―Έ μ
λλ€.
λ§Ίμλ§
μΉ΄νμΉ΄ λΈλ‘컀 μμ μμ μμνλ xfs μμ€ν μ λν κΆκΈμ¦μ, κ°λ°μ κΈ°μ΄λΌκ³ ν μ μλ 리λ μ€ μμ€ν κ³Ό νμΌ μμ€ν κΉμ§ λ³΄κ² λ§λ€μμ΅λλ€. μ΄μ 묡μ κΆκΈμ¦μ ν΄μ νμΌλ, λ€λ₯Έ μ¬λ°λ μ£Όμ λ€μ μ°Ύμμ λ΄μ¬ν νλ €κ³ ν©λλ€. ν μ€μμ μΌλ μ΄μ¬ν νκ³ ννν μ€λ ₯λ λ리면μ νμ΄ν !!!