ファイル転送が止まる
Windows Serverに10GbEをつけてSMB3.1.1で巨大なファイルをコピーすると、緑の進捗ゲージが途中で「速度: 0バイト/s」に張り付く。つまり途中で止まる。おそらくWindows10などでも同じ。その後、しばらくすると再開。
だが、ファイル転送が途中で止まるとかサーバーとしてあり得ない。怖い。怖い。これはなんとか直したい。そう思って調べていたところ、10GbEを入れている人があまりいなくて情報なし。いろいろ試した結果、分かったのは、
結論的には問題なし
・ファイルコピーの仕組みとして、 送信バッファ>イーサーネット>受信バッファ≒DRAM>SSD という順に流れていく(perfmonにより自己調査)
・DRAMに何ギガのバッファをとるかはIntelPROsetで設定できる
・ひとまずDRAMに全力で送る/受ける(内部的にはDirect Memory Accessになってるのかも)ある程度のデータグラムがまとまったら、まとめてSSDに書き込む。バッファがいっぱいになったら、いったんイーサネットの転送を停止して、SSDに書き込んでいく。その繰り返し。SSDに書き込んでいるあいだも転送するが、バッファがあふれると待ち状態が発生して転送量ゼロになってしまうというわけ。
→ここがポイント。昭和の人からすると、ローカルディスクよりネットの方が速いことはあり得ない。そのような固定観念から入ったので原因不明で苦戦しました。ネットが速ければ書き込み待ちが発生するのは自然の摂理。
・おそらくRAID0とかにしてSSDを高速化すれば、待ちは最低限で済むはず
・robocopy /jでバッファなし転送をすることもできるが1Gbpsくらいの速度しか出ない。同様にIntelPROsetでバッファを最低限に設定すると途中で止まらないが全体で見ると遅くなってしまう
・バッファで受け取った時点で送信元には受領済みを通知するので次のファイルの転送に遷移する。しかし、送信先では最初のファイルをまだ書き込み中。書いているあいだに次のファイルも来る。ファイル1の転送の最後のほうはファイル1とファイル2を同時にSSDに書き込み中となる。ここで電源が切れるとアウト。バッファからディスクへの書き出しはハードディスクだと何分単位でかかる。同じ理由で、Windows上ではコピー完了となっていても、しばらく待たないと実態が生成されない。コピー直後に操作するとロック中で操作できないようになっていると思われる。
ディスクがSATA6=6G/sでネットが10G/sという逆転現象ではまったというわけ。
Intel PROsetの最適設定
いろいろ試したが、Intel X550など、まともなカードを使っている限りは、基本的には出荷時状態でよい。
送信と受信のバッファは増やしてもいいかもしれない。パチなイーサネットカードだとチェックサムオフロードなどをカード側に業務委託した際にきちんと処理してくれるのか謎な部分あり、安全を見るならカード側の処理は極力offにするという手も?
10GbEにしたら小さな通信の初動が遅い?
たとえば、タスクバー上のExcelを右クリックすると過去に開いたファイルの一覧が出てくる機能あり。ここで、過去に開いた一覧に入っているファイルがネットワーク上に存在する場合、Windowsはネットワークを開きに行くため、小さな通信が発生するが、この通信に5秒ほどもかかることがある。原因不明。1GbEではそのようなことはない。

