====== Samba 4.6のファイルコピーがCPU 100%近く使い超絶遅い件 ======
===== 最初に結論 =====
この状態に悩まされてる人は何よりも答えが欲しいだろうから、最初に結論を書いておくと、smb.confで''case sensitive = yes''と設定すると多分直る。直下に大量のファイルを抱えたフォルダをコピーするとsmbdがCPUを100%近く消費し、コピー速度が極めて遅くなる現象ならほぼ間違いなく直る。
(2018-07-03 追記)\\
''case sensitive = yes''の副作用を十分に考慮のこと。一例として、エクスプローラでは見えるファイルが、特定のアプリケーションでは存在しないファイルになるといった不具合が出るなど。詳細は[[blog:2018:2018-07-03|こちら]]。
「”大量のファイル”ってどれくらい?」かというと、サーバマシンの性能にもよるがCore i系なら概ね1万ファイル、流行りのラズパイとかだと恐らくもっと少数、単純なクロック比で1/2、実性能はもっと劣るだろうから更に半分で2500ファイルくらい?。完全な当てずっぽうですけど。要はファイル名の比較のところがボトルネックになっているようなので、CPUのシングルスレッド性能に依存する。
===== 次に御託 =====
例によってNAS4Free 11.0.0.4 (4303)[FreeBSD 11.0-RELEASE-p10/Samba 4.6.4]でNASをでっち上げたのだが、知人曰く、今までのNASに較べてファイルコピーが遅い、と。マシンのスペック的にはXeon E5-2620v3, メモリ8GB, 1GbE×2のLAGで、ストレージも3.5インチHDD2本でRAID-1のペアを3ペアでRAID10なので問題が出るとは考えにくい。実際、シェルでのシーケンシャルライトでは500MB/sくらい出てる。
様々なサイズのテストファイルを試してみるも、至って正常な速度が出るし、むしろ他のNASよりも速いくらい。ところが、知人が遅いというファイル群で試してみると、たしかに遅い。小さなファイルが多いためワイヤーレートには程遠いが、それでも初速は10MB/s超えてるのに、あれよあれよと速度が落ちて仕舞には100kB/sを切ってしまう。そして何故かsmbdがCPUを100%近く持っていく尋常ならざる状態に。Pen!!!時代のGbEじゃあるまいし、たかがファイル転送でCPU 100%ってどんだけー。
問題のファイル群をシェルでcpすると30MB/s出てるので、やっぱりマシンに問題はなさげ。さらに、NAS4Free 9 [FreeBSD 9.3-RELEASE-p14/Samba 4.1.18]搭載の別マシン(Xeon E3-1225v2/16GB/3.5" HDD 6台でRAID-Z2なので性能は必要十分)で試すと、安定して数MB/sは出るし、CPU負荷も常識的な範囲。となれば、問題なのはSambaっぽい…?
ここまで絞り込んでからが大変だった。
情報がないない。マシンの省電力設定を切ってみたり、Sambaが速くなる各種おまじないを試してみたり、SMBのプロトコルバージョンを変えたり、LAGを解除してみたり、etc...するも効果なし。ググりにググって、ようやくFreeNASのフォーラムで[[https://forums.freenas.org/index.php?threads/slow-terribly-slow-smb-in-directory-with-multiple-files-30-000-files.46655/#post-319407|case sensitiveが原因じゃね]]という投稿を見つけた次第。
早速''case sensitive = yes''にして試してみたら、効果てきめん。転送速度もCPU負荷も劇的に改善された(テストファイルが32kBなので速度がそんなに出てないのは仕方ない)。論より証拠ってなもんで、比較画像貼っておきますね。
{{ :blog:2017:samba46_massive_file_copy_cs_comparison.png | Samba 4.6.4のcase sensitive設定によるファイルコピー速度の比較 }}
その後、Sambaのドキュメントのcase sensitive設定のところを見たら、思いっきり「As a special case for directories with large numbers of files, if the case options are set as follows, "case sensitive = yes", (後略)」と書いてあったでござる(´・ω・`)。
大文字小文字の変換処理ごときで遅くなるなよ!と思わなくもないが、ファイルの新規作成時はディレクトリ内の既存ファイル名と被ってないか総当りでチェックしているようなので、何も考えずに実装すれば計算量はO(n/^2^/)、ファイル数が増えると爆発的に比較数が増えるんすなぁ…。にしてもですよ、デフォルト設定の''case sensitive = auto''は以前のバージョンから変わってないわけで、いきなり遅くなるなんてチョーひどくなーい?
case sensitive設定を変えるとWindowsからのアクセスに支障がでないか心配なところだが(なんたってWindowsは表面上は大文字小文字区別しませんからね!)、/-そこは[[https://serverfault.com/questions/70570/does-samba-work-well-with-windows-when-case-sensitive-names-are-enabled|エクスプローラが上手いこと取り計らってくれる]]模様。本当かどうかは知らない。-/ → (2019-05-19 追記)取り計らってくれなかった。例えばa.txtとA.TXTがあった場合、どちらのファイルを見に行くかは半固定。一度決まった同名ファイルのアクセス先は固定されるが、それらファイルを含む**ディレクトリの内容が変わると**アクセス先の選定が再度行われ、その結果は不定ってのがWindowsの昔からの仕様らしい…。
(2018-07-03 追記)\\
再度の注意。アプリケーションによっては意図しない挙動が発生するため''case sensitive = yes''での運用は十分なテストを行うこと!
===== 参考サイト =====
* [[https://forums.freenas.org/index.php?threads/slow-terribly-slow-smb-in-directory-with-multiple-files-30-000-files.46655/|Slow, terribly slow smb in directory with multiple files (+30.000 files) | FreeNAS Community]]
* [[https://www.samba.org/samba/docs/man/manpages/smb.conf.5.html|smb.conf]]
* [[https://serverfault.com/questions/70570/does-samba-work-well-with-windows-when-case-sensitive-names-are-enabled|Does Samba work well with Windows when case-sensitive names are enabled? - Server Fault]]