差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン 次のリビジョン 両方とも次のリビジョン | ||
blog:2018:2018-07-03 [2018-07-03 11:55] Decomo |
blog:2018:2018-07-03 [2018-07-17 11:49] Decomo |
||
---|---|---|---|
行 1: | 行 1: | ||
- | ====== | + | ====== SambaとZFSで大量のファイルを扱う時はcase-sensitiveの組み合わせを最適化する ====== |
- | 同一フォルダに大量のファイルがあるとSambaが超遅くなる問題、自分なりの知見が得られたのでメモ。結果だけ知りたい人は最後までスクロールしてくだしあ。 | + | [[blog: |
まずはおさらい。 | まずはおさらい。 | ||
- | ことの発端は、数万個のファイルがあるフォルダをSambaのファイルサーバにコピーすると、速度が10kB/ | + | ことの発端は、数万個のファイルがあるフォルダをSambaのファイルサーバにコピーすると、速度が10kB/ |
- | 調べてみると、Sambaはファイル作成時、ファイル名の重複チェックのため作成先フォルダ内の全ファイル名を検査することが分かった。この時に行われる、Windowsのファイル名規則(FS上は大文字小文字を区別するが、OSの表面上は区別しないナンチャッテcase-preserving。この差はOSが吸収する。)と合わせるための、ファイル名を大文字ないし小文字に変換する処理がボトルネックのようだ。 | + | 調査を進めると、ファイル作成時Sambaはファイル名の重複チェックのため、作成先フォルダ内の全ファイル名を検査することが分かった。この時に行われるWindowsのファイル名規則(FS上は大文字/小文字を区別するが、一般的なファイルアクセス上は区別しないナンチャッテcase-preserving。この差はOSが吸収する。)と合わせるための、ファイル名を大文字ないし小文字に変換する処理がボトルネックのようだ。 |
プロファイルしたわけでもソースコードを見たわけでもないので確証はないが、公式ドキュメントに「ディレクトリに大量のファイルがある特殊なケースでは、case sensitiveをyesにせよ」(抄訳)と書かれており、ファイルコピーの進捗にあわせ指数関数的に速度が落ちる(CPU負荷が上がる)という挙動から、たぶん当たってると思う。 | プロファイルしたわけでもソースコードを見たわけでもないので確証はないが、公式ドキュメントに「ディレクトリに大量のファイルがある特殊なケースでは、case sensitiveをyesにせよ」(抄訳)と書かれており、ファイルコピーの進捗にあわせ指数関数的に速度が落ちる(CPU負荷が上がる)という挙動から、たぶん当たってると思う。 | ||
- | '' | + | では'' |
- | 前述の通りWindowsはFS的にはcase-sensitiveだが、歴史的理由で表面上はcase-insensitiveとして振る舞う。この仕様に胡坐をかき、ファイルパスを全部大文字or小文字に変換して扱うアプリケーションが少なくない。つまり、本来のファイルパスは'' | + | 前述の通りWindowsはFS的にはcase-sensitiveだが、歴史的理由で表面的にはcase-insensitiveとして振る舞う。この仕様に胡坐をかき、ファイルパスを内部的に大文字or小文字に変換して扱うアプリケーションが少なくない。例えば、本来のファイルパスは'' |
- | '' | + | '' |
- | で、ローカルのファイルシステムに対してならWindowsがよしなに取り計らってくれるのだが、サーバの共有フォルダに対しては何の処理も行わず、アプリから渡されたファイルパスをそのまま渡しているようだ。アプリが'' | + | しかし、サーバの共有フォルダに対しては、アプリから渡されたファイルパスをそのまま渡しているようだ。故にサーバ側がその辺を考慮した処理になってないと、ファイルが見つからないという事になる。Sambaの'' |
- | では、この差をどこで吸収させるかと言ったら、もうファイルシステムしかない。 | + | ではどうするか。ZFSの'' |
- | 幸いにしてZFSには'' | + | お察しの通りその名の通りのプロパティで、デフォルト値は'' |
- | Windowsとの共有は'' | + | 本プロパティはFS作成時にしか指定できないため、Windows共有用のFSを新規に作り、Sambaで共有フォルダに仕立て上げるのがよいだろう。 |
- | そもそもSambaがファイル名をキャッシュせずファイル作成毎に全舐めしてしているのは、恐らく対象フォルダに対する変更をSamba側で検知する仕組みがないからだと思う。Sambaがファイルを作成しようとしたまさにその時、同名のファイルがサーバのローカルで作られたり、別のファイルがリネームされたりする可能性があるため、キャッシュではファイル名のユニーク性を担保できないという判断だと思われる。 | + | Sambaがファイル名をキャッシュせずファイル作成毎に全舐めしてしているのは、恐らく対象フォルダに対する変更をSamba側で検知する仕組みがないからだと思う。Sambaがファイルを作成しようとしたまさにその時、同名のファイルがサーバのローカルで作られたり、別のファイルがリネームされたりする可能性があるため、キャッシュではファイル名のユニーク性を担保できないのだろう。 |
一方、ファイルシステムレベルなら、そのような変更の検出とアトミック性・ユニーク性が保証された素敵な仕組みがあるハズだから、アプリ側でファイル名の全比較を行うより効率的なんじゃねっていう目論見。 | 一方、ファイルシステムレベルなら、そのような変更の検出とアトミック性・ユニーク性が保証された素敵な仕組みがあるハズだから、アプリ側でファイル名の全比較を行うより効率的なんじゃねっていう目論見。 |