u9fs vs NFS

v9fsに書いたように、Linuxカーネル2.6.14あたりから、9P2000をしゃべるファイルシステムv9fsをサポートしている。v9fsを使えば、リモートのPlan9サーバをmountできる。さらにLinux側をサーバにしたい場合は、u9fsを使うことができる。

元ネタはFreenix 2005の論文「Grave Robbers from Outer Space Using 9P2000 Under Linux」。著者はこの日記でもちょくちょく出てくるが、v9fsの作者でもあるRon MinnichとEric Van Hensvergenだ。

この論文ではbonnie++とPostMarkベンチマークを使って、9PとNFSの性能評価をしており、bonnie++はほぼ一緒、PostMarkは9Pに軍配という結果を示している。2005年の論文の割にはハードウェアが古いので(カーネルが古いのは仕方ないが)、Xeon 8コア、メモリ4GB、10GbE環境という環境で実験してみた。OSはubuntu 9.04/kernel 2.6.30である。なおディスク律速になるので、10GbEでもGbEでも性能には大差なかった。

一応実験結果を載せるが、9P、NFS共に説明がつかない部分があるので、結果を鵜呑みにしないこと。時間ができたら再評価してみたい。

u9fs設定

u9fs自体はPlan 9ディストリビューションに含まれているので(/sys/src/cmd/unix/u9fs)、Linuxマシンにコピーしてmake && make installする。

xinetd経由でu9fsが起動するよう設定する。まずは認証なし(-a none)で*1。サーバ側で作ったファイルのオーナは-u rootに関係なくnobody/nogroupになる。おそらくxinetd or inetd経由で起動された場合はこの設定は参照されない?

$ grep u9fs /etc/services
u9fs		564/tcp

$ cat /etc/xinetd.d/u9fs 
service u9fs
{
        disable         = no
        socket_type     = stream
        protocol        = tcp
        wait            = no
        user            = root
	root		= root
        server          = /usr/local/sbin/u9fs
        server_args     = -a none -u root -l /var/log/u9fs.log
	port		= 564
        flags           = REUSE
}

u9fsが動いているサーバアドレスが192.168.0.1とすると、クライアントは次のようにmountする。dfltuid/dfltgidの権限で読み書きされる。maxdataはメッセージの最大ペイロードサイズ。

$ sudo mount -t 9p -o proto=tcp,dfltuid=1000,dfltgid=1000,maxdata=32768 192.168.0.1 /opt.glenda

bonnie++

シーケンシャルread/writeの性能を測る。キャッシュの影響を無視するために、物理メモリの2倍のファイルを読み書きする。今回使ったマシンは4GBのメモリを搭載しているので、8GBの読み書きになるので、それなりの実行時間がかかる。

writeはいい線行っているけど、readが遅いんだな。あと、9Pのバッファ設定が効いてないようだ。


PostMarkベンチマーク

Webサーバやメールサーバのワークロードを想定し、小さなファイルを大量に操作するベンチマークである。transaction数をデフォルトの10倍の50000に設定した。

create/read/append/deleteのops/secは、9Pが200に対して、NFSが10。さらにスループットは9Pが1.3MB/secに対して、NFSが65KB/sec。NFSの性能がなぜこんなに悪いのか理由がわからない。おかしなチューニングになっているのかもしれない。

おまけ

使ってないけど9mountは便利そう。ubuntuにはパッケージも用意されている。

bonnie++のエラー

u9fsを使った場合、bonnie++のファイル生成系のベンチマークに失敗する。何かバグがありそうだ。今回はread/writeのベンチマークだけが知りたかったので、オプションに"-n 0"を付けて回避した。

$ bonnie++ -d /opt.psptest00/opt
Writing with putc()...done
Writing intelligently...done
Rewriting...done
Reading with getc()...done
Reading intelligently...done
start 'em...done...done...done...
Create files in sequential order...done.
Stat files in sequential order...Expected 16384 files but only got 118
Cleaning up test directory after error.

LinuxNFSの代わりに9Pを使うのはちょっと厳しいかなぁ。。。

*1:認証方式はnoneの他に、rhostsとp9anyが選択できる。