[OSTEP][영속성] CH41 지역성과 Fast File System
CH41 지역성과 Fast File System
오래된 UNIX 파일 시스템의 디스크 상의 구조는 아래와 같다
파일 시스템 전체에 대한 정보를 가진 슈퍼블럭 (S) 에는 볼륨 크기, 아이노드 개수, 비어있는 블럭 리스트의 헤드를 가리키는 포인터 등이 있고, 모든 아이노드들은 디스크의 아이노드 영역에 존재한다, 디스크의 대부분의 영역은 데이터 영역으로 할당되어 있다
이 구형 파일 시스템의 장점은 단순하다는 것이다, 이전 시스템들이 사용했던 단일 계층 디렉터리 구조와 비교하면 엄청난 혁신이다
41.1 문제 - 낮은 성능
문제는 성능이 형편없다는 것이다, 성능은 처음부터 안 좋게 시작해서, 나중에는 디스크 대역폭의 2%밖에 사용하지 못 한다
구형 파일 시스템의 핵심 문제는 디스크를 마치 임의 접근 기억 장치 (RAM) 처럼 사용한다는 것이다, 데이터를 저장하는 매체가 디스크라는 사실을 무시하고 여기저기에 데이터를 저장하고 있어서 디스크 헤드를 이동하는 데 많은 시간을 소요한다
🐣 디스크의 물리적 특성과 입출력 방식을 고려하지 않고 데이터를 임의의 위치에 저장한다는 말이다, 그래서 성능 저하가 일어난다 🐣
파일 시스템이 빈 공간을 효율적으로 관리하지 않기 때문에 결국에 공간은 단편화 Fragment 된다
파일을 순차적으로 읽더라도 실제로는 디스크 전역을 오가며 블럭을 접근하기 때문에 성능이 심각하게 나빠진다 (조각 모음 도구로 디스크의 블럭을 재배치하여 빈 공간들이 연속적으로 배치되도록 데이터 블럭들을 이동하고 변경 사항을 아이노드에 반영하여 개선할 수 있다)
두번째 문제는, 블럭 크기가 너무 작다는 것이다 (512 바이트) 블럭의 크기가 작아서 내부 단편화 Internal Fragmentation 가 적다는 장점이 있기는 하지만, 디스크 헤드의 이동 시간에 비해 데이터 블럭이 작아 입출력이 상대적으로 비효율적이라는 단점이 있다
핵심 질문 - 성능 개선을 위해 어떻게 디스크 상의 데이터를 구성해야 할까
성능을 위해 파일 시스템의 자료 구조를 어떻게 구성해야 할까? 이러한 자료 구조에는 어떤 종류의 할당 정책이 필요할까? 어떻게 파일 시스템에 디스크 특성을 반영할까?
41.2 FFS - 디스크에 대한 이해가 해답이다
파일 시스템의 자료 구조와 할당 정책을 "디스크에 적합"하게 설계하여 성능을 개선한 Fast File System, FFS 가 만들어졌다
파일 시스템 인터페이스는 그대로 유지하면서 (open(), read(), write() 등 다른 파일 시스템 콜 포함) 내부 구현 방식을 변경하였다
거의 모든 파일 시스템은 응용 프로그램과의 호환성을 유지하기 위해 기존의 인터페이스를 그대로 사용하면서 내부를 최적화하고 있다
41.3 파일 시스템 구조 - 실린더 그룹
FFS 는 디스크를 여러 개의 실린더 그룹 Cylinder Group 으로 나눈다
하나의 실린더 Cylinder 는 하드 디스크의 서로 다른 표면에 동일한 길이의 반경을 갖는 트랙들의 집합이다
FFS 는 연속된 N개의 실린더를 하나의 그룹으로 묶고, 전체 디스크를 다수의 실린더 그룹으로 구성한다
FFS 는 파일 시스템에 필요로 하는 모든 구조를 각 그룹에 포함시킨다 (아이노드와 데이터 블럭들을 위한 공간과 할당 여부 구분 공간 등)
FFS 는 신뢰성을 이유로 각 그룹마다 슈퍼블럭 S 를 배치하였다, 슈퍼블럭은 파일 시스템을 마운트할 때 필요하다
그룹 별로 아이노드 비트맵 ib 와 데이터 비트맵 db 는 각 그룹의 아이노드와 데이터 블럭의 할당 정보를 나타낸다
비트맵으로 파일 시스템의 빈 영역을 나타내어 큰 크기의 연속된 빈 공간을 쉽게 찾고, 단편화 문제도 어느 정도 피할 수 있다
마지막으로 아이노드와 데이터 블럭 영역은 vsfs 와 유사하게 대부분의 영역이 데이터 블럭으로 이루어져 있다
41.4 파일과 디렉터리 할당 정책
디스크에 파일과 디렉터리, 관련된 메타데이터를 배치할 때는 "관련 있는 것끼리 모아라"
우선 무엇이 "관련 있는"지를 파악하고 그것들을 같은 블럭 그룹 내에 저장한다
디렉터리의 위치를 결정할 때는 할당된 디렉터리의 수가 적고 (그룹들 간에 디렉터리에 대한 균형을 맞추기 위해)
사용할 수 있는 아이노드의 수가 많은 실린더 그룹을 선택하여 디렉터리 데이터와 아이노드를 해당 그룹에 저장한다
파일의 경우에는 1) 아이노드와 파일의 데이터 블럭을 같은 그룹에 할당하거나 (오래된 파일 시스템과 같은 방식으로)
2) 동일한 디렉터리 내의 모든 파일들을 해당 디렉터리가 존재하는 실린더 그룹에 함께 저장하는 방식으로 저장한다
그래서 각 파일의 데이터 블럭들이 해당 아이노드와 가까이 배치되고, 같은 디렉터리 안의 파일들은 가깝게 배치된다는 것이 긍정적이다
하나의 그룹에 모든 파일이 있으면 디렉터리 내의 파일들은 대체적으로 같이 접근이 가능하다
Namespace 기반의 지역성으로 FFS 는 좋은 성능을 얻을 수 있으며 연관있는 파일들을 탐색하는 시간을 짧게 유지할 수 있게 된다
41.5 파일 접근의 지역성 측정
namespace 지역성이 실제 존재하는지 알아보기 위해 SEER 트레이스를 사용하여 디렉터리 트리를 분석할 수 있다
같은 파일을 열었다면 두 번의 open 간의 거리는 0 이고, 같은 디렉터리 내의 다른 디렉터리 간의 거리는 1이다
여기서의 거리 기준은, 두 파일의 부모 경로명이 동일하게 될 때까지 디렉터리 트리를 얼마나 타고 올라가야 하는가이다
SEER 트레이서에서 전체 작업이 7%가 동일한 파일을 열었고, 40%의 작업이 거리 1 안에서 이루어졌기 때문에 FFS 가 가정한 지역성은 이치에 맞는 것으로 보인다
비교 군인 "랜덤" 트레이스는 이름 공간에 대한 지역성은 낮은 것을 볼 수 있지만, 동일한 조상 (ex. 루트) 을 가지고 있기 때문에 약간의 지역성은 보인다
41.6 대용량 파일 예외 상황
파일 크기가 매우 큰 경우, 파일 배치 시 예외 상황이 발생한다
FFS 는 큰 파일들을 배치할 때, 첫번째 블럭 그룹에 일정 수의 블럭을 할당한 후에 파일의 "큰" 청크를 다른 블럭 그룹에 저장한다, 그리고 파일의 다음 청크는 또 다른 블럭 그룹에 저장한다
파일 블럭들을 디스크에 흩어 놓으면 상대적으로 흔한 순차 파일 접근과 같은 경우에 성능이 나빠진다, 청크의 크기를 신중히 정해야 한다
만약 청크의 크기가 충분히 크다면, 파일 시스템은 디스크로부터 데이터를 전송하는 데 대부분의 시간을 사용하고, 상대적으로 적은 시간을 블럭 청크들을 탐색하는 데 사용할 것이다, 오버헤드 비용 당 더 많은 작업을 처리하여 오버헤드를 줄이는 작업을 점진적 경감 Amorization 기법이라고 부른다
41.7 FFS 에 대한 기타 사항
FFS 가 4KB 블럭을 사용했기 때문에 데이터를 전송하는 것에는 이득이 있었지만 공간 활용면에서는 내부 단편화 Internal Fragmentation 로 인해 반 정도의 공간이 낭비된다
이 문제를 해결하기 위해 512 byte 의 서브 블럭 sub-block 개념을 도입하였다, 1KB 크기의 작은 파일을 생성할 때, 두 개의 서브 블럭을 할당하여 4KB 블럭 전체가 낭비되는 경우가 발생하지 않도록 하였다, 서브블럭들의 합이 4KB 가 되는 시점에 FFS 는 4KB 블럭을 찾아서 서브블럭들을 복사해 넣은 후에 해당 서브블럭들을 다시 사용할 수 있도록 해제한다
복사 과정에서 많은 I/O 가 발생하기 때문에 라이브러리는 쓰기 요청을 버퍼에 두었다가 4KB 청크가 되면 파일 시스템에 내리는 식으로, 대부분의 서브블럭을 사용하는 특수한 경우를 완전히 제거할 수 있도록 하였다
또 다른 아이디어는 성능에 최적화된 디스크 배치이다
순차 읽기 시 헤드를 지나간 블럭을 읽기 위해, 하나 건너에 블럭을 배치하여 다음 요청에 대한 블럭이 헤드 아래로 지나가기 전에 해당 블럭을 요청할 충분한 시간을 벌 수 있다, FFS 는 디스크의 특정 성능 매개변수를 검출해 낸 후에, 그 정보를 활용하여 정확한 시차에 따라 배치 기법을 결정할 수 있도록 하였는데, 이 기법을 매개화 Parameterization 라 부른다
이러한 배치 기법을 사용하면 최대 대역폭의 50%만 얻지만, 내부적으로 한 트랙을 모두 내부 디스크 캐시에 버퍼링하기 때문에 (트랙 버퍼), 해당 트랙에 연달아 읽기 요청이 들어오면 디스크는 캐시에서 원하는 값을 리턴할 수 있다
또한 FFS 는 긴 파일 이름을 지원하고 심볼릭 링크 개념을 도입하는 등 사용성을 개선한 기법들로 인해 두터운 사용자 층을 얻을 수 있었다
41.8 요약
FFS 는 장치들 중에서 가장 중요한 하드 디스크를 다루는 방법을 선보이고
파일 관리의 문제가 운영체제 내에서 가장 흥미로운 주제 중 하나라는 것을 밝혔다
많은 파일 시스템들 (ex. Linux ext2, ext3) 들이 FFS 에 근간을 두고 있고
모든 현대 시스템들은 디스크를 디스크처럼 대하라는 FFS 의 핵심 가르침을 따르고 있다