Chapter 33. 大きなディレクトリの取扱い

Jeremy Allison

Samba Team

John H. Terpstra

Samba Team

March 5, 2005

1ディレクトリあたり10 万またはそれ以上のファイルを必要とするアプリケーションを、バージョン 3 系の Sambaで利用することには問題があり、それによって発生するパフォーマンス劣化を経験しているサイトがある。 Samba 3.0.12以降ではその解決策を実装している。

要求されている最新のリストだけを読むようにディレクトリの取扱いを修正したことが鍵だった。これとは違い、古い (Samba 3.0.11 までの) 振る舞いでは、事前にディレクトリをすべてメモリへ読み込んでから名前を小出しにしていた。通常では、これは とても奇妙な削除動作を持つ OS/2 アプリケーションを誤動作させるだろう。しかし、 Samba 4 (ありがとう Tridge) から流用したロジックにより、3.0.12 の最新のコードでは、これを正しく取り扱う。

ディレクトリあたりに多数のファイルを必要とするアプリケーションを、パフォーマンスへ著しい影響を与えないように、セットアップするために以下の手順を実施する。

最初に、ディレクトリ中のファイルをすべて大文字または小文字 好きな方(すでにすべてのファイルが大文字になっていたため大文字を私は選んだ) のどちらかのみに正規化する。 そして、このアプリケーションのために新しくおあつらえ向きの共有を以下のように作成する。

[bigshare]
path = /data/manyfilesdir
read only = no
case sensitive = True
default case = upper
preserve case = no
short preserve case = no

もちろん、あなた自身固有のパスと設定を使うこと。そして、ケースオプションはディレクトリのすべてのファイルに適合するように設定すること。パスは、アプリケーションが必要とする大きなディレクトリを指さなければならない。 そのディレクトリとそれ以下のすべてのディレクトリの下に作られる新しいファイルはすべて smbd によって大文字に強制される。しかし smbd はもはや名前のために走査する必要がなくなる。大文字で存在しなければまったく存在しないことがわかるため。

極意は実に case sensitive = True 行にある。これは、 smbd にその名前の大小文字が混在したバージョンを走査する必要が絶対にないことを告げる。だから、アプリケーションが FOO と呼ばれるファイルを要求した場合、 stat コールにて見つからなかったら、 smbd は直ちに file not found を返却する。違うケースのバージョンを走査することはない。その他の xxx case xxx 行は、 smbd によって作成されるファイルが一貫したケースに強制することでこれが機能するようにしている。

smb.conf のこのセクションに付随して path 配下のすべてのファイルとディレクトリは大文字でなければならないことを忘れないこと。何故ならこの設定では、 smbd は小文字のファイル名を見つけることができなくなるからである。このパラメータは、問題のある振る舞いの (多数のエントリをもつディレクトリを使用する) アプリケーションにへ提供する共有にのみ設定が許されているので、これらは共有ごとになされることに注意すること 残りの smbd 共有は、影響を受ける必要はない。

以上の設定は、大きなディレクトリを処理する際にsmbd をずっと速くさせる。私のテストケースでは 10 万を超えるファイルで smbd は今やとても効率的に処理する。