NFSのチューニング

PUMA


何故か遅い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)
  • マウント先に、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のパフォーマンス問題の切り分け、チューニング、および各オプションの詳細な説明については、以下の参考リンクが結構参考になると思います。

参考リンク


NFS&NIS 第2版

NFS&NIS 第2版

  • 作者: ハルスターン,リカルドラビアガ,マイクアイスラー,Hal Stern,Ricardo Labiaga,Mike Eisler,砂原秀樹,木下哲也
  • 出版社/メーカー: オライリー・ジャパン
  • 発売日: 2002/04
  • メディア: 単行本
  • 購入: 2人 クリック: 8回
  • この商品を含むブログを見る
Unixシステムパフォーマンスチューニング 第2版

Unixシステムパフォーマンスチューニング 第2版

  • 作者: ジャン‐パオロ・D.ムズメキ,マイクルキダス,Gian‐Paolo D. Musumeci,Mike Loukides,砂原秀樹,高橋敏明,岡島順治郎
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2003/10
  • メディア: 単行本
  • 購入: 1人 クリック: 30回
  • この商品を含むブログ (10件) を見る