何故か遅いNFSをチューニングするべく検証。
# 5MBの書き込みに27秒もかかるのはちょっと。。。
下記の検証結果が、全ての環境であてはまるわけではないため、ご参考程度までに。
検証時の構成
Linux(Xen domainU) ---NFS mount---> Linux(Xen domain0)
Xenのバージョンは3.0.2(linux kernelは2.6.16)。
# NICのデバイスも所詮はXenによって仮想化されているので、それほど参考にならないかもなぁ・・・。
実験内容
- 設定をいじる
- server:
- /etc/exports
- client:
- autofs(/etc/auto.master)
- server:
- マウント先に、5MBのブロック(1ファイル)を書き込み
# マウントポイントの名前は適当(^^;
設定1(syncのみ)
server: /home/share client_hostname(rw,sync) client: dev -fstype=nfs,sync,rsize=8192,wsize=8192,hard server_hostname:/home/share/dev
↓結果。普通の設定。うちの環境ではこれだと何故か遅い。。。
$ time dd if=/dev/zero of=./test.img bs=1024k count=5 5+0 records in 5+0 records out 5242880 bytes (5.2 MB) copied, 27.8165 seconds, 188 kB/s real 0m27.859s user 0m0.000s sys 0m0.000s
設定2(sync + no_wdelay)
server: /home/share client_hostname(rw,sync,no_wdelay) client: dev -fstype=nfs,sync,rsize=8192,wsize=8192,hard server_hostname:/home/share/dev
ディスクの書き込み遅延を発生させなくした場合。結構速くなった。
別々の書き込み要求がある場合、それを1回で書き込むべく遅延を発生させるオプションらしい。
(複数書き込み時のディスクのオーバーヘッドが少なくなってパフォーマンスを上げるみたい)
今回は、複数の書き込み要求をしていないため、パフォーマンス向上につながったと思われる。
↓結果。
$ time dd if=/dev/zero of=./test.img bs=1024k count=5 5+0 records in 5+0 records out 5242880 bytes (5.2 MB) copied, 3.07588 seconds, 1.7 MB/s real 0m3.116s user 0m0.000s sys 0m0.000s
設定3(async)
server: /home/share client_hostname(rw,async) client: dev -fstype=nfs,async,rsize=8192,wsize=8192,hard server_hostname:/home/share/dev
非同期の書き込み処理。これが当たり前だけど圧倒的に速い。
が、書き込み中に障害が起こるとデータが損傷してしまう可能性が高いらしい。
重要な書き込み処理がない場合や読み込み専用の場合は、このオプションで良さそう。
↓結果。
$ time dd if=/dev/zero of=./test.img bs=1024k count=5 5+0 records in 5+0 records out 5242880 bytes (5.2 MB) copied, 0.241465 seconds, 21.7 MB/s real 0m0.260s user 0m0.000s sys 0m0.010s
設定4(クライアントの転送ブロックサイズを変更)
クライアント側の設定で、読み込み/書き込みの転送ブロックサイズを変更させてみた場合。
# serverの設定は全て固定。
これについては、どれも大きな変化は無かった。うちの環境だと8192で十分みたい。
その1
server: /home/share client_hostname(rw,sync,no_wdelay) client: dev -fstype=nfs,sync,rsize=4196,wsize=4196,hard server_hostname:/home/share/dev
↓結果。
$ time dd if=/dev/zero of=./test.img bs=1024k count=5 5+0 records in 5+0 records out 5242880 bytes (5.2 MB) copied, 2.45042 seconds, 2.1 MB/s real 0m2.483s user 0m0.000s sys 0m0.000s
その2
server: /home/share client_hostname(rw,sync,no_wdelay) client: dev -fstype=nfs,sync,rsize=8192,wsize=8192,hard server_hostname:/home/share/dev
↓結果。
$ time dd if=/dev/zero of=./test.img bs=1024k count=5 5+0 records in 5+0 records out 5242880 bytes (5.2 MB) copied, 2.16628 seconds, 2.4 MB/s real 0m2.190s user 0m0.000s sys 0m0.000s
その3
server: /home/share client_hostname(rw,sync,no_wdelay) client: dev -fstype=nfs,sync,rsize=16384,wsize=16384,hard server_hostname:/home/share/dev
↓結果。
$ time dd if=/dev/zero of=./test.img bs=1024k count=5 5+0 records in 5+0 records out 5242880 bytes (5.2 MB) copied, 2.13933 seconds, 2.5 MB/s real 0m2.156s user 0m0.000s sys 0m0.000s
結論
上に書いたとおりだが、設定3の非同期書き込みが最も(桁違いなくらい)速い結果となった。
が、下記の参考リンク内にも書かれてあるとおり、書き込み中のシステムクラッシュ時にデータが損傷を受ける可能性が高いようなので、重要なデータの書き込み処理が無い、もしくは読み込み専用の場合に高いパフォーマンスを発揮する模様。
設定2は、複数の書き込み処理が走らない前提のもとであれば、パフォーマンス向上につながるみたい。実際、上記の検証で単純な1ファイル書き込みであれば10倍近い性能向上となったし、複数のファイル書き込みであっても(上には書いていませんが)3〜10倍近い性能向上が見られました。
NICのドライバやカーネルの状況によっては、設定4のようにNFSクライアントの転送ブロックサイズの設定を変更することでパフォーマンス向上につながる模様で、これは環境によって異なるらしい。
それ以外の場合は、、、もう一歩踏み込んだ設定でどうにかなるかもしれない・・・ので、また色々試してみようと思います。
NFSのパフォーマンス問題の切り分け、チューニング、および各オプションの詳細な説明については、以下の参考リンクが結構参考になると思います。
参考リンク
- http://www.linux.or.jp/JF/JFdocs/NFS-HOWTO/performance.html
- http://publibn.boulder.ibm.com/doc_link/Ja_JP/a_doc_lib/aixbman/prftungd/2365ca3.htm
- http://www.asahi-net.or.jp/~aa4t-nngk/nfs.html
- http://rhn.uta.edu/pub/docs/RH-DOCS/rhel-rg-ja-3/s1-nfs-server-export.html
- 作者: ハルスターン,リカルドラビアガ,マイクアイスラー,Hal Stern,Ricardo Labiaga,Mike Eisler,砂原秀樹,木下哲也
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2002/04
- メディア: 単行本
- 購入: 2人 クリック: 8回
- この商品を含むブログを見る
- 作者: ジャン‐パオロ・D.ムズメキ,マイクルキダス,Gian‐Paolo D. Musumeci,Mike Loukides,砂原秀樹,高橋敏明,岡島順治郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2003/10
- メディア: 単行本
- 購入: 1人 クリック: 30回
- この商品を含むブログ (10件) を見る