qmailのqueueディレクトリ数は素数がお好き?

/var/qmail/queue/hoge/ 以下に作られるディレクトリの数は素数が良い?、という話。
qmailのメールキューは、conf-splitというファイルでコンパイル時に定義された数字の数だけディレクトリで分割して保存される。この時、大量のメールキューが溜まる場合には、1ディレクトリあたりのファイル数が膨大な数になり、ファイルシステムのある意味での制限というか、ファイルの検索(statだよ)に非常に時間がかかる。結果、配送遅延を招きかねない。
そこで、分割するディレクトリの数を増やして、1ディレクトリあたりのファイル数を減らすことで、この問題は解決できるという話があります。
やっと本題ですよ。
このディレクトリ分割に使う数字は素数じゃないといけないの?、という議論があって、もともとはDJBがデフォルト値に選んだ23が素数なのと、拡張したいなら401(=素数)にでもしたら?とどこかで発言したらしいことがなんとなくの根拠となっている節がある。
http://darahappa.glorantha.to/~yelm/diary/?200307
ここを見ると、これは都市伝説とある。
http://ya.maya.st/mail/lwq.html
これを見ると、やっぱり素数が良いとある。
どちらも同じqmailのMLで議論された内容をソースとしているんだけれど、この議論は結論としてまとまったわけじゃない。
焦点はディレクトリ分割のアルゴリズムの問題で、どのディレクトリに収まるかはinode番号によって変わるんだけれど、いくつに分割するかによって、特定のディレクトリにばかりメールキューが溜まるような事が起きるんじゃないのか、というのが議論の中心になっている。1000個に分割しても特定の10個にメールキューが集中したんじゃ意味がない。
・Why conf-split prime?
http://www.ornl.gov/lists/mailing-lists/qmail/2001/06/threads.html#01351
↑これがqmailのMLで議論された内容。
読んでいくと、ハッシュ理論なんていうのかな?数学の話になっていって、やっぱりハッシュテーブルのサイズを決定する数、この場合はconf-splitに入れたキューのディレクトリ数を素数にしたほうが、十分にバラバラな結果になる、つまりは平均的にディレクトリが分割される、という雰囲気で議論は始まる。
そんな中、ハッシュ値をとる元の値(この場合はinode番号)の性質によっては、ハッシュテーブルのサイズが素数でなくてもあまり変わらない結果になるんじゃないの?という点が疑問として出るんだけど、結論として見えていない。
ハッシュ関数というと大げさに見えるかもしれないが、実際にやっている事というのは、与えられた数字(inode番号)をディレクトリ数(conf-split)で割った余りを、割り当てディレクトリとする、ということ。
やってくるinode番号が、[2 4 6 8 10 12]の5つ割当てられたとしたら、これら6つのinode番号はどのディレクトリに割り当てられるんだろう?という例えを使うと、8個に分割した場合では上の文字列から計算した結果は [2 4 6 8 2 4] となるが、7個に分割した場合には [2 4 6 1 3 5] となり、十分バラバラに見える。
こんな例がMLの議論の中で提示されたが、騙されちゃいけない。ハッシュ関数の精度を考えるのに、作為的とも考えられる入力文字列だけで判断することは出来ない。割り算した余りがどれだけバラバラになるか、それは入力文字列によるのである。[1 2 3 4 5 6 7 8 9 10]を入力としたら、8個分割の場合は[1 2 3 4 5 6 7 0 1 2] だし、7個の場合は [1 2 3 4 5 6 0 1 2 3]になる。はっきり言って同じだ。
そう考えると、問題は素数かどうかじゃなくて、入力となるinode番号に何らかの法則はないのか、ということ。無作為というか、十分ランダムな数であれば分割数には何を使っても良い。
じゃぁinode番号はどういうものが割り当てられるのか?というのは、はっきり言ってOS依存(というかファイルシステム依存)だし、もっと言うとシステムの使われ方依存だ。一般化してどうこう言うことはできない。言えるのは、inode番号には8の倍数がよく使われます、という性質が仮にあったとしたら、ディレクトリ分割数に8はやめとけ、というぐらい。inode番号が実際のメールシステムでどのように使われるか、これは使ってみないとわからないし、SPAMを喰らえば使われ方が変わったも同じだし。
ただですね。確認できてないポイントが一つだけあるんです。
Knuth という人が書いた ''The Art of Computer Programming'' Vol.3(Addison-Wesley社) という本の"Sorting and Searching"という章にこの問題が議論されていて、f(x) = x mod m つまりこの話と全く同じハッシュ関数を使う場合に m は素数が良い、と書いているらしいんです。何に対して良いと書かれているのかはわからないので、qmailのキュー分割数に素数が良いとは限らないわけなんだけど、この本は見つけたら読んでみたいものだね。

結論:
未も蓋もないが、どの数で割るかなんてやってみなきゃわからない。
素数であるかどうかは多分関係ない。

ただ、だいたいどんなメールシステムでもinode番号は分割数に対して十分ランダムだと思うし、ほんと何を使っても良いと思うよ。