文書の表示以前のリビジョンバックリンク全て展開する/折り畳む文書の先頭へ この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。 ====== ZFSとSambaで大量のファイルを扱う時はcase-sensitiveの組み合わせを最適化する ====== 同一フォルダに大量のファイルがあるとSambaが超遅くなる問題、自分なりの知見が得られたのでメモ。結果だけ知りたい人は最後までスクロールしてくだしあ。 まずはおさらい。 ことの発端は、数万個のファイルがあるフォルダをSambaのファイルサーバにコピーすると、速度が10kB/s前後まで低下する現象に見舞われた。速度はコピーが進むごとに低下し、比例するようにsmbdのCPU占有率が上がるというのが特徴。ファイルサーバ上で直接コピーすると何の問題もない。 調べてみると、Sambaはファイル作成時、ファイル名の重複チェックのため作成先フォルダ内の全ファイル名を検査することが分かった。この時に行われる、Windowsのファイル名規則(FS上は大文字小文字を区別するが、OSの表面上は区別しないナンチャッテcase-preserving。この差はOSが吸収する。)と合わせるための、ファイル名を大文字ないし小文字に変換する処理がボトルネックのようだ。 プロファイルしたわけでもソースコードを見たわけでもないので確証はないが、公式ドキュメントに「ディレクトリに大量のファイルがある特殊なケースでは、case sensitiveをyesにせよ」(抄訳)と書かれており、ファイルコピーの進捗にあわせ指数関数的に速度が落ちる(CPU負荷が上がる)という挙動から、たぶん当たってると思う。 ''case sensitive = yes''にすれば万事解決かと思えば、そうじゃない罠。 前述の通りWindowsはFS的にはcase-sensitiveだが、歴史的理由で表面上はcase-insensitiveとして振る舞う。この仕様に胡坐をかき、ファイルパスを全部大文字or小文字に変換して扱うアプリケーションが少なくない。つまり、本来のファイルパスは''\\Server\FILE.dat''にもかかわらず、アプリケーション内部では ''\\server\file.dat''としてアクセスしていることが往々にしてある<fc #c0c0c0>(自分もそういう処理をよく書く(;'∀'))</fc>。 で、ローカルのファイルシステムに対してならWindowsがよしなに取り計らってくれるのだが、サーバの共有フォルダに対しては何の処理も行わず、アプリから渡されたファイルパスをそのまま渡しているようだ。アプリが''\\server\file.dat''を指定したなら、Sambaにも''\\server\file.dat''が渡ってくる。この時、''case sensitive''オプションがautoかnoならSambaが処理して無事''\\Server\FILE.dat''とマッチするが、yesの場合は…Ω\ζ°)チーン では、この差をどこで吸収させるかと言ったら、もうファイルシステムしかない。 幸いにしてZFSには''casesensitivity''という、その名の通りのプロパティが用意されている。デフォルト値は言うまでもなく''casesensitive''である。 Windowsとの共有は''caseinsensitive''なFSを新たに作って行うのが良いだろう。設定値はcaseinsensitiveだが、挙動としてはcase-preservingになるようだ。ちなみに、''mixed''は使いどころがよくわからない挙動になるので使わない方が無難(一応、Windowsを想定した挙動らしいんだけど…)。 そもそもSambaがファイル名をキャッシュせずファイル作成毎に全舐めしてしているのは、恐らく対象フォルダに対する変更をSamba側で検知する仕組みがないからだと思う。Sambaがファイルを作成しようとしたまさにその時、同名のファイルがサーバのローカルで作られたり、別のファイルがリネームされたりする可能性があるため、キャッシュではファイル名のユニーク性を担保できないという判断だと思われる。 一方、ファイルシステムレベルなら、そのような変更の検出とアトミック性・ユニーク性が保証された素敵な仕組みがあるハズだから、アプリ側でファイル名の全比較を行うより効率的なんじゃねっていう目論見。 結論としてはSambaとZFSで以下の設定を行う。 * ZFS * ファイル共有用にcasesensitivity=caseinsensitiveなFSを作る<code> zfs create -o casesnsitivity=caseinsensitive ztank/path/to/cifs</code> * Samba * ファイル名の扱いをcase-sensitiveにする<code> case sensitive = yes case preserve = no short preserve case = no </code> blog/2018/2018-07-03.1530586412.txt.gz 最終更新: 2018-07-03 11:53by Decomo