■前回MTUのサイズを調整した後もやっぱりなんだかSAMBAが遅い。Wiresharkでパケットダンプを眺めていると、SMBからのフォルダ情報参照のパケットが飛び交っている。何かファイルアクセスが発生するたびに情報更新のパケットが飛んでいて、これのオーバーヘッドが大きい。このオーバーヘッドを削れたらだいぶ違うのではないか。MTUのサイズ調整かけたのもその流れではあったけど。
Vista側はレジストリのlanmanWorkstation、サーバー側はsmb.confのパラメーターまわりで調整できそうなものだけど、抑制はできそうもなかった。あとは飛び交うパケットの数そのものを減らすことを考えるしかない。MTUサイズを大きくして分割されるパケット数を減らすとか。
ただ、MTUサイズについてはインターネット接続している以上、期待できる最大長さというのが決められていて、それより大きくしても意味がない上に、最悪パケットが破棄されてしまい通信できなくなってしまう。それは確実なので、インターネット接続とは別にSMB接続に特化して使えるアダプターが別に必要ということになる。
以前から、使ってはいなかったけどオンボードのネットワークアダプタとは別にPCI接続のアダプタを載せていて、それを転用する。ただ、同一ネットワークに異なるアドレスを持つアダプタが接続するとルーティングでトラブルになりやすい。アプリケーションがネットワークインターフェースを意識して処理していれば良いけど、片方で受けた通信の返事をもう片方で返してしまうことがままあり、その場合通信が成立しない。
それを整理するにはルーティングテーブルをきちんと整理すればいいのだけど、それはそれで大変。
そこで、追加したアダプタはIPv6で設定することにした。従来のネットワークはIPv4のままで、新規追加したアダプタをIPv6のみで使用すると、ルーティングテーブルはインターネット接続用とSMB接続用とで分離できるので、設計が楽になる。
ただ、IPv6は始めてだったのでアドレス設定の要領がわからずてこずった。プライベートアドレスの考え方がIPv4とは少し違うようで、あれこれ調べたところでは、FD00::/8がとりあえず適当に使ってよい領域になるらしい。今のところIPv6で外部には接続していないのでネットワークが衝突することはないけれど、ISPがIPv6を入れたら、今使っているブロードバンドルーターのように「IPv6パススルー」では使えなくて、IPv6ルーターとして機能してくれないと混乱するだろうと思う。そろそろ買い替えを考えたほうが良さそうなのかな。
ところでFD00::/8は「ユニークローカルユニキャストアドレス」と呼ばれる領域になるけれど、これにはグローバル識別子とサブネット識別子の領域を持っている。クローズドなネットワークで使用するのでこだわる必要は全くないのだけど、グローバル識別子40ビットのうち、頭8ビットは0のまま、残り32ビットは現在割り当てをもらっているIPv4のアドレス値を使ってみた。サブネット識別子は、まあ、適当に。残り64ビットはまるまる空いているのだけど、これは現在ローカルで使っているIPv4アドレスのネットワークアドレスを除いたノードアドレスを割り当てることにした。あんまりたいしたことはしていない。
SMBはIPv6に対応しているのでinterfacesとhosts allowをIPv6側のネットワークアドレスとインターフェースアドレスに改める。hostsにもIPv6でのエントリが必要。
このあたりの作業で戸惑ったのだけど、LinuxではIPv6でpingを打つのはping6コマンドになるけれど、これといって明確になっているヘルプドキュメントが無い。ややこしいことに、man pingで表示されるマニュアルにはping6独自のオプションが混ざっているので、pingコマンドで長いこと手間取ってしまった。
ただ、LinuxはIPv4設定とIPv6設定を切り分けることが可能で、IPv4,IPv6専用のインターフェースを仕立てることが容易にできる。IPv6のルーティングテーブルは'route -A inet6'で参照できる。IPv6アドレスを割り当てないインターフェースについてはリンクローカルユニキャストアドレス(fe80::/64)も割り当てられず、ルーティングテーブルに出てこない。もちろん、IPv4のルーティングテーブルではIPv6専用のインターフェースは出てこない。
このあたりの実装の仕方がVistaでは逆で、Vistaは全アダプタについてIPv4とIPv6がスタックされている。利用する意図の有無に関わらず全てのアダプタにリンクローカルユニキャストアドレスが付けられる。ルーティングテーブルの参照はroute printだけど、IPv4とIPv6の双方が表示される。
リンクローカルユニキャストアドレスはやっかいで、それだけあれば通信はできるのだけど、2枚挿しているアダプタがそれぞれアドレスを持っていると、ルーティングの交通整理が必要になる。Vistaの場合、いらないルーティング定義をdeleteしてやればとりあえずリンクローカルユニキャストアドレスのままでも何とかなる(hostsには登録できないみたい)けれど、他のサーバーに割り当てたグローバル識別子とサブネット識別子を持つユニークローカルユニキャストアドレスをどちらか片方に付与してやれば、ルーティングテーブル上はLinux同様片付く格好になる。2つのアダプタ双方に割り当てられているfe80::/64への通信をしなければトラブルことはない。
こうしてIPv6の環境整備ができてSMBを動かしたところ、かなり快適。パケットは相変わらず飛んでいるけれど、レスポンスが良くて気にならない。ただ、これがIPv6化の恩恵なのか、それともオンボードのアダプタではなく、外付けのアダプタを使ったことによるものかが不明で……なんとなく、オンボードのアダプタが遅いだけなのではないかという気がする。