[운영체제] 26. Fast file system
Reference - Operating Systems: Three Easy Pieces
https://pages.cs.wisc.edu/~remzi/OSTEP/
Fast File System
old unix file system의 구조는 아래와 같았다. 하지만 성능이 엉망이었다.
- problems of old file system
1. data block에 데이터가 산발적이어서 inode를 순서대로 읽을 때 데이터는 디스크 전체에 퍼져있기에 (앞에 읽었다가, 뒤에 읽었다가 ..) 디스크 관점에서 rotation latency가 늘어날 것임. - high positioning costs
2. fragmentation - A와 C사이 그 공간보다 큰 E 데이터가 있을 때, E는 spread되어서 데이터를 불러올 때 overhead가 매우커진다. 이는 ssd도 마찬가지라 한다.
-> 이러한 문제를 해결하기 위해 fast file system이 등장했다. 기존 file system은 jounaling file system이라 한다.
fast file system은 "disk aware" policy로 성능을 향상시켰다. 그 방법은 먼저 디스크 구조를 변경해야했는데, sylinder group이란걸로 데이터를 쪼갠다. 이때 platter 별로 묶은 것을 cylinder group(file system은 block group이라 칭함)이라 한다. 그 뒤 block group안의 block에 file system의 layout을 집어넣는다.(super block, inode bmap, data bmap, inodes, data). 이러한 방법은 seek time을 최소화하여 디스크 성능을 향상시킬 수 있다. 추가로 동일 디렉토리의 파일을 같은 cylinder group에 배치해서 spatial locality를 향상시켰다. 이때 super block은 file system마다 하나씩만 필요하기에 이를 낭비라 생각할 수 있지만, super block이 깨지면 문제가 크기에 사본을 block group마다 여러개 놔둬서 안정성을 높인다.
- How to allocate files and directories?
Policy : 1. directory의 placement를 결정하자. 할당된 디렉토리가 적고 사용 가능한 inode가 많은 cylinder group을 찾는다. 2. file의 placement를 결정하자.
예로 a라는 디렉토리에 c, d, e가 있고, b 디렉토리에 f가 있으면 a,b를 각자 다른 그룹으로 assign하자.
디렉토리는 single block을, file은 two block을 가진다고 가정! 하자. 이때 datablock이 inode와 굉장히 가까워지므로 접근에 따른 overhead를 줄인다. trace를 분석해보면 합당하다는 것을 알 수 있다.
- Large File Exception
파일 사이즈가 극단적으로 커진다고 할 때, block group에 다른 데이터의 메타데이터는 저장되어 있는데 한 파일이 너무 커서 디렉토리를 다 차지하면 똑같이 나머지 데이터들이 산발되게 되기에 다른 block에 접근함에 따른 overhead 문제가 발생. 이를 해결하기 위해 하나의 큰 파일이 있다면 쪼갠다. 근데 그럼 그 파일도 마찬가지로 쪼개져서 성능이 저하되지 않냐고 생각할 수 있는데, 이는 chunk size에 따라 달라진다. chunk가 충분히 크면 대부분의 시간을 데이터 전송에 쓸 수 있고, 다음 chunk로 이동하는 시간을 낮게 유지할 수 있다. 각 경우에 따른 부하를 분석해보면 적절한 chunk size를 알 수 있다. 큰 파일에서, 데이터를 읽고 다음 데이터로 이동하는데 걸린 시간(seek time)+block 내에서 읽는데 걸리는 시간(transfer time). overhead가 50%일 때=절반을 seek time으로 잡을 때, 어느 데이터를 다른 그룹으로 넣어야 될까=40MB/s 데이터기준 400KB, 90%일 때 4MB.
FFS에선 위 방법 대신 inode 자체 구조를 기반으로 간단하게 접근한다.
12개의 direct block은 inode와 동일한 그룹에 배치하고, indirect block은 다른 그룹에 배치한다.
transfer time보다 rotational latency와 seek time이 훨씬 느리기에 더 나은 성능을 위해 다음 chunk로 이동하기 전에 더 많은 데이터를 전송해야 한다.