しばらく技術系から離れていましたが、再び技術系。

ボクのブログの1番人気の記事、アロケーションユニットサイズに関する記事を見てて、
そういや、Linuxであまりアロケーションユニットサイズについて
これまであまり気にしたことなかったなと、
調べていたら深みにはまりました。


関連記事



Linuxのファイルシステムの確認方法


まずは、レンタルサーバーのファイルシステムについて調べてみます。
Linuxのファイルシステムは以下のファイルを見ると確認できます。


$ cat /etc/fstab


何やら、いっぱい出てきましたが、自分で立てたサーバーじゃないので、
何がどこに入っているのかいまいちよくわかりません。

わかりやすいのはこっち。
$ df -T /


ext4でした。よく見るファイルシステムですね。

ちなみに対応しているファイルシステムは以下のコマンドで確認できます。
$ cat /proc/filesystems


/procはいろいろ見れて便利ですね。
よく見るのは、

$ cat /proc/meminfo

メモリの割り当て状況が分かります。

$ cat /proc/cpuinfo

CPUの情報がわかります。

ext4の歴史


Windowsだったら、FATからFAT32になって、NTFSで・・・となんとなくわかりますが、
ext4はどういう経緯でできたファイルシステムなんだろうと
気になって調べてみました。

ext
システム内部構造16b
最大ファイルサイズ64MiB
最大ファイル名長14文字

ext2
1993年1月開発 Linuxで導入
ブロックでディスクを区切る
最大ファイルサイズ2TiB
最大ファイル名長255B
最大ボリュームサイズ16TiB
タイムスタンプは秒単位で1901年12月14日~2038年1月18日

ext3
2001年11月 Linux2.4.15で導入
ジャーナリング
複数ブロックにまたがるディレクトリへのツリーベースのディレクトリインデックス
オンラインファイルシステムリサイズ
最大ファイルサイズ16GiB~2TiB
最大ファイル名長255B
最大ボリュームサイズ2TiB~32TiB
タイムスタンプは秒単位で1901年12月14日~2038年1月18日
1つのディレクトリへのサブディレクトリの上限は32,000個まで

ext4
2006年10月10日 Linux2.6.19で導入
エクステントに対応 最大128MB inodeごとに4つのエクステントを格納可能
空き領域の永続的な事前確保に対応
遅延アロケーション
ジャーナルのチェックサム
オンラインのデフラグメンテーション
高速なファイルチェックシステム
マルチブロックの確保
最大ファイルサイズ16TiB
最大ボリュームサイズ1EiB
※1EB=1024PB キロ(K)、メガ(M)、ギガ(G)、テラ(T)、ペタ(P)、エクサ(E)
タイムスタンプはナノ秒単位で1901年12月14日~2514年4月25日
1つのディレクトリへのサブディレクトリの上限は64,000個まで
※dir_nlink機能でさらに拡張も可能

キビバイト?


さて、いきなりMiBなんて見慣れない単位がでてきました。
何だろうと思って調べてみたら、
一般的な数学で使う、SI接頭辞のKは10の3乗の1000を表します。
一方パソコンのKは、2の10乗の1024を表します。
これを明示するために、Kiという単位をつかって、
1KiBは1キビバイトと読み、1024Bを示します。
そのまま、メビバイト、ギビバイト・・・と進んでいきます。

Linuxのブロックサイズ


さて、本題のアロケーションユニットサイズに戻ります。
Linuxではアロケーションユニットサイズはブロックサイズと呼ばれていて、
ext3では1KB~4KBで指定できるようです。
ext4でも調べた限りでは最大値は4KBみたいです。
増やすといろいろと問題が発生するみたい。

エクステントをはじめとする優れた機能


大容量化が進んでいるのに、4KBのままで大丈夫なのかなと思ったら、
ext4の特徴の中にヒントがありました。
ポイントは、エクステント。
ext4では、エクステントという仕組みを使うことによって、
フラグメンテーションが発生しにくい状況を作っています。
これは、ファイルサイズに応じて、最大128MBの連続領域を確保する仕組みです。
その他、空き容量の事前確保や遅延アロケーションという仕組みを使って、
できるだけフラグメンテーションが発生しないように設計されています。

空き容量の事前確保は、RDBMSなどでデータを登録するにつれて、
将来的にデータが追加されることが分かっている場合に、
予め、永続的に連続ブロックを確保しておくための仕組みです。

遅延アロケーションは、通常のファイルシステムでは、書き込みの命令の時点で
ディスクの確保を行いますが、これを実際に書き込まれるギリギリまで遅らせるというもの。

こうした仕組みがとられているから、ブロックサイズは拡張しなくても大丈夫なんですね。

ちなみにNTFSではエクステントは、
ファイルサイズの大きいファイルを別の場所に書き込む仕組みとして、
全く別の機能として存在するようです。紛らわしい。

何をするにしても、その基礎となるファイルシステムを正しく理解していることは大切です。

関連記事