画像サーバを用意する場合のinode上限問題

かなり古い記事ですが以前見かけて参考になったものの、最近改めて検索しても(おそらく記事が古すぎるため)検索結果に全然出てこなかったので、重要な部分のみ引用。

Linuxの1ディレクトリ数に格納できるディレクトリ数は31,998個。
3万とかを超える項目数になってくるとこれが原因で問題になってきます。

md5の1文字は0-fつまり16タイプを表すことができるので、
1文字: 16
2文字: 16 x 16 = 256
3文字: 16 x 16 x 16 = 4096
4文字: 16 x 16 x 16 x 16 = 65536
タイプを表すことができます。
このmd5値の先頭の方の文字をディレクトリを格納するディレクトリ名に活用することで、ディレクトリの適度なディレクトリの中への分散を図れます。

ファイルシステムがext3のLinuxの場合ディレクトリの上限が31,998なので、4文字とったら65,536パターンに達して、1ディレクトリあたり格納可能ディレクトリ数をオーバーしてしまいます。なので上限として先頭3文字を取ることが出来ます。そうすると、格納する1ディレクトリに4096ディレクトリが出来ます。

その下には最大31,988ディレクトリが格納可能なので
4,096 x 31,998 = 131,063,808
つまり約1億3千万ディレクトリの格納にこれで対応することができるようになります。もちろんmd5の値が完全に均等に分散させてくれることはないでしょうから、それよりも落ちた数になるでしょうが。

ちなみにうちの現状のシステムだと
df -i
/dev/sda3 30261248
とi-nodeの総数は3000万程度なので3bytesでシステム全てがすっぽり入ってしまいます。まあ2bytesで1200万程度格納できるのでそれで十分でしょうが。内容的な要件もありますが、i-node数も制限になるので、それと合わせて考えると、数に踏ん切りがつき易くなっていいかもしれません。

また、ファイル数はそうした上限とはあまり関係ないですが、1ディレクトリに格納するファイル数もこれで制御することができます。

例えば、10,000,000(1,000万)の項目の格納をターゲットにする場合、
1文字では10,000,000/16=625,000
2文字では10,000,000/256=39,062
3文字では10,000,000/4,096=2,441
に1ディレクトリあたりのファイル数を抑えることができます。
md5の何文字を使うのかは、そうした想定数字を元に考えると良いでしょう。
https://sakuhindb.com/pj/6_B4C9CDFDBFCDA4B5A4F3/20080606.html

また以下のQiitaも参考になりました。
http://qiita.com/najeira/items/cd197d230b1a3723c9b5