강좌 & 팁
현재 커널은 3.8 까지 메인라인에 올라와 있는데요.
살펴 보다 보니 ext4 에서 재미있는 기능이 추가가 되었습니다.
일반적으로 파일 시스템에서는 모든 파일은 고유한 inode 를 갖게 됩니다.
그런데 기본 data block 의 사이즈가 파일의 크기가 대형화 되면서 커지는 경향이 있는데요.
의외로 조그만 몇바이트짜리 파일들 역시 한개의 data block 을 차지하기 때문에 비효율성이 있긴 합니다.
개인적으로 이런 부분은 무시할만하다고 생각하긴 하지만 작은 파일들이 수없이 많이 생기는 시스템에서는
비효율성이 커질것 같기도 합니다.
ext4에서는 이런 비효율성을 개선할수 있는 방법을 패치했습니다.
원문은 아래와 같습니다.
1.1. Ext4 embeds very small files in the inode
Every file in Ext4 has a corresponding inode which stores various information -size, date creation, owner, etc- about the file (users can see that information with the stat(1) command). But the inode doesn't store the actual data, it just holds information about where the data it is placed.
The size used by each inode is predetermined at mkfs.ext4(8) time, and defaults to 256 bytes. But the space isn't always used entirely (despite small extended attributes making use of it), and there millions of inodes in a typical file system, so some space is wasted. At the same time, at least one data block is always allocated for file data (typically, 4KB), even if the file only uses a few bytes. And there is a extra seek involved for reading these few bytes, because the data blocks aren't allocated contiguously to the inodes.
Ext4 has added support for storing very small files in the unused inode space. With this feature the unused inode space gets some use, a data block isn't allocated for the file, and reading these small files is faster, because once the inode has been read, the data is already available without extra disk seeks. Some simple tests shows that with a linux-3.0 vanilla source, the new system can save more than 1% disk space. For a sample /usr directory, it saved more than 3% of space. Performance for small files is also improved. The files that can be inlined can be tweaked indirectly by increasing the inode size (-I mkfs.ext4(8) option) - the bigger the inode, the bigger the files that can be inlined (but if the workload doesn't make extensive use of small files, the space will be wasted).
내용을 살펴보면 일반적으로 inode 에는 실제 data 가 어디에 있는지에 대한 정보를 갖고 있습니다.
하지만 매우 작은 파일들의 경우 그렇게 하기는 낭비가 심하다는 것이죠.
그래서 작은 파일들의 경우 사용하지 않는 inode 공간에 데이타를 저장을 하게 됩니다. ( 단지 몇바이트면 충분하니까요)
당연히 data block 은 별도로 할당하지 않습니다.
그렇게 되면 inode 정보를 한번 일게 되면 메모리상에 올라와 있기 때문에 매우 빠르게 접근이 가능하게 되고
따라서 SEEK 등을 위한 낭비가 사라지게 됩니다.
참 재밌는 기능이네요.
커널은 참 다양한 기능이 존재합니다.