[운영체제] Fast File System (FFS) | 디스크의 물리적 구조를 고려한 성능 최적화

 파일 시스템의 성능을 높이자

지난번 VSFS(Very Simple File System)를 공부하며 파일 시스템의 논리적인 뼈대를 세웠다. 하지만 '구현 가능하다'는 것과 '잘 동작한다'는 것은 완전히 다른 문제다. 초기 유닉스 파일 시스템은 단순했지만, 성능은 처참했다. 디스크를 마치 RAM처럼 임의 접근(Random Access) 가능한 장치로 취급했기 때문이다. (Random Access가 안되는 건 지난번에 HDD에 관해 다루며 확인 바 있다)

Fast File System (FFS)은 이 문제를 해결하기 위해 "소프트웨어가 하드웨어의 물리적 특성을 이해해야 한다(Disk Awareness)"는 철학을 도입했다. 오늘은 FFS가 어떻게 디스크의 물리적 구조를 고려하여 I/O 성능을 획기적으로 개선했는지, 그 사고의 흐름을 정리해 본다.



1. Problem: 디스크는 RAM이 아니다

기존 파일 시스템(Old Unix File System)의 가장 큰 문제는 데이터가 디스크 전체에 흩어져 있다는 점(Fragmentation)이었다. 아이노드(inode)와 데이터 블록이 서로 멀리 떨어져 있다면, 파일을 읽기 위해 디스크 헤드는 끊임없이 움직여야 한다(Seek Time 증가). 디스크의 기계적인 움직임은 전자적인 처리 속도에 비해 영겁의 시간이나 다름없다. (마찬가지로 지난시간 참고)

"데이터를 논리적으로 잘 정리하는 것만으로는 부족하다. 물리적으로 '어디에' 둘 것인가가 성능을 결정한다."

Fragmentation


 

2. Solution: 실린더 그룹 (Cylinder Group)

FFS의 핵심 아이디어는 디스크를 실린더 그룹(Cylinder Group)이라는 영역으로 잘게 쪼개는 것이었다. 현대 파일 시스템에서는 이를 블록 그룹(Block Group)이라고도 부른다.

Cylinder Group

  • 구조: 여러 개의 연속된 실린더를 하나의 그룹으로 묶는다.

  • 목적: 관련된 데이터(아이노드와 데이터 블록)를 같은 그룹 안에 배치하여, 헤드 이동 거리를 최소화한다.

    Cylinder Group composed of 8 blocks

  • 구성: 각 그룹은 자신만의 슈퍼블록(사본), 아이노드 비트맵, 데이터 비트맵, 아이노드 테이블, 데이터 영역을 가진다. 마치 작은 파일 시스템(Mini-FS)들이 모여있는 형태다.
    (지난 시간에 본 VSFS는 Globally 1개였음)

Data Structure for Cylinder Group




3. 할당 정책 (Allocation Policies)

구역을 나누었으니, 이제 "어디에 저장할 것인가?"에 대한 규칙이 필요하다. FFS는 '관련된 것은 함께(Keep related stuff together)'라는 단순하면서도 강력한 원칙을 세웠다.

3.1 디렉터리 배치: 부하 분산

디렉터리는 서로 멀리 떨어뜨려 놓는 것이 유리하다.

  • 할당된 디렉터리 수가 적고, 사용 가능한 아이노드가 많은 그룹을 찾는다.

  • 새 디렉터리를 그곳에 배치한다.

  • 이는 특정 그룹에만 데이터가 쏠리는 것을 방지하고, 전체 디스크를 고르게 활용하게 한다.


3.2 파일 배치: 지역성(Locality) 극대화

반면, 파일은 철저히 지역성을 따르도록 설계했다.

  1. 데이터와 메타데이터의 근접성: 파일의 데이터 블록은 그 파일의 아이노드와 같은 그룹에 할당한다.

  2. 파일 간의 근접성: 같은 디렉터리에 있는 파일들은 서로 연관될 가능성이 높다(예: 소스 코드 파일들). 따라서 같은 디렉터리 내의 파일들은 동일한 그룹에 배치한다.

이 전략 덕분에 ls 명령어로 디렉터리를 읽거나, 특정 디렉터리 내의 파일들을 연속으로 읽을 때 헤드 이동이 획기적으로 줄어든다.

(참고) SEER trace



4. 예외 처리: 대용량 파일 (The Large-File Exception)

여기서 한 가지 딜레마가 생긴다. 만약 파일 하나가 너무 커서 그룹 하나를 꽉 채워버린다면? 그 디렉터리에 생성될 다른 파일들은 다른 그룹으로 쫓겨나게 되고, 지역성이 깨진다.

FFS는 이를 해결하기 위해 청크(Chunk) 개념을 도입했다.

  • 파일이 일정 크기(예: 4MB)를 넘어가면, 다음 청크는 다른 실린더 그룹에 저장한다.

  • 약간의 Seek 비용을 감수하더라도(Amortization), 다른 파일들이 들어갈 공간을 남겨두어 전체적인 지역성을 유지하는 전략이다.

Large File



5. 현대 Ext4로의 진화

FFS의 철학은 리눅스의 표준 파일 시스템인 Ext4로 이어지며 더욱 발전했다.

  • 익스텐트(Extent): 기존에는 블록 번호를 하나하나 나열했지만(메타데이터 크기 증가), 이제는 (시작 블록, 길이) 형태의 '익스텐트'로 관리한다. 대용량 파일 처리가 훨씬 효율적이다.

Extent
  • 지연 할당(Delayed Allocation): write() 호출 즉시 디스크 위치를 정하지 않고, 실제 디스크에 써야 할 때(Flush)까지 미룬다. 이렇게 하면 한 번에 더 큰 덩어리의 연속된 공간을 할당할 수 있어 단편화를 줄이고 CPU 효율을 높인다.




마치며

FFS를 학습하며 하드웨어의 특성을 무시한 추상화는 성능 저하를 부른다는 교훈을 얻었다. 단순히 알고리즘의 시간 복잡도를 줄이는 것을 넘어, 데이터가 물리적으로 어떻게 배치되고 접근되는지를 고려하는 것이 시스템 엔지니어링의 핵심이다. 앞으로 대규모 스토리지 시스템을 설계할 때도 이러한 'Disk Awareness' 관점을 견지해야겠다고 다짐한다. 다음 시간에도 이어서 File System에 대해 알아보도록하겠다.



추천글:

[운영체제] Operating System 전체 포스팅 모음집

[운영체제] I/O 시스템, HDD, Disk Scheduling, RAID | CPU와 디스크의 물리적 속도 차이를 극복하는 설계

[운영체제] 파일 시스템과 디렉토리 | Unix File System, Inode, Storage Virtualization

[운영체제] 파일 시스템 구현(VSFS) | Index Node(Inode) in deep


hyeon_B

안녕하세요! AI 기술을 이용해 더 나은 세상을 만들어 나가고 싶은 과기원생 Hyeon이라고 합니다. 저는 앞으로 인공지능 시대에는 지식을 '활용'하는 능력이 중요해질 것이라고 생각합니다. 대부분의 일들은 인공지능이 뛰어난 모습을 보이지만, 인공지능은 데이터로 부터 연관관계를 학습하기 때문에 지식들을 새로 통합해서 활용하는 능력이 부족합니다. 인공지능이 뉴턴 전에 만들어졌다면 사과가 떨어지는 이유에 대답하지 못했을 것이고, 아인슈타인 전에 만들어졌다면 중력이 어떻게 생기는지 설명하지 못했을 것입니다. 따라서 앞으로 우리는 '본질'을 탐구하고 그 본질로부터 다른 곳에 적용하며 인공지능을 현명하게 활용해야 할 것입니다. 함께 인공지능 시대를 준비합시다!

댓글 쓰기

다음 이전

POST ADS1

POST ADS 2