2006年4月28日

Gigabit Ethernet + NFSのスループット

100Base-T が高速イーサネットと言った昔の頃、100Base-Tで構築したLANでぶら下がっているマシン同士でNFSを使ってネット越しで共有を行っていた。ただし、正直ローカルディスクと比べると格段に落ちるもので、結局一種の諦めを必要とするものであった。

当時は原因を追及することは無かったがNetworkの最大帯域が100Mbps = 12MByte/Sec が足を引っ張っていたようだ。よくよく考えるとATA/33(33MByte/Sec)にも及ばないので当然である。

ふと最近1Gbps=120MByte/Secであればと、SATA/1.5のちょっと遅い程度で、物理IOのスループットはもっと低い(コンシューマ向けの安価なHDDならば)ので、普通のローカルディスクと同程度ぐらいには扱えるのでは?と思い実験。

NFSサーバのローカルHDDの帯域をhdparmで適当に計ると約53MByte/sec程度。なのでこれくらい、NFSクライアント側で出せれば良いかなぁ。

NFSサーバ

  • Debian/Linux sarge
  • Dothan 2.13GHz
  • Memory DDR2 2G Byte
  • RAID1 300G(Maxtor 6B300R0)x2 on Accordance ARAID99-1000
NFSクライアント
  • MacOSX 10.4.6
  • PowerMacG5 Quad
  • Memory DDR2 8G byte

運用時にはローカルのNetInfo?に /mounts 以下にエントリを追加するのが定石らしいが、テスト運用なので、mount コマンドを直に打つ。

sudo mount -t nfs -o resvport fsrv:/data /mnt

ゲッ。約2Mbyte/Secしかでない、、、何故に?NFSをチューニングするには、、、読み書きのサイズを大きくすれば良いのかぁ、、、。man mount_nfsを読めば、MacOSXではudpでは16Kbyteまでtcpでは32Kbyteまで設定できるらしい。

ここでは、サイズが大きくとれるtcpで再度トライしみる。

sudo mount -t nfs -o resvport,tcp,rwsize=32768 fsrv:/data /mnt

ふぅむ。約9Mbyte/Secしかでない、、、何故に?

調べてみると、Linux側のNFSサーバが同期モードから非同期モードにするとスループットがあがる。

/etc/exports

/data    *(rw,async,root_squash)

とすれば、取り敢えずNFSで約50MByte/Secまで!!出るようになった。ただ、非同期モードはNFSのプロとコール違反らしくどういう結果を生むのかが不明。というかNFSサーバが下回りのジャーナリングファイルシステムと協調して動かせれば要件を満たしつつ性能が上がりそうなものを、、、。 まぁ、結局一種の諦めが必要なので非同期モードで運用することにする。

で、NetInfoマネージャを使って/mounts以下にエントリを追加する。

name fsrv:/data
vfstype nfs
opts rw,rescport,net,intr,soft,tcp,rwsize=32768

うんで、再起動すると、/Network/Servers 以下に自動マウントされるようになる、、、 けっ、何でも設定を変更すると再起動しなくてはいけないとは○indowsっぽくださすぎ。

で、UnixではdaemonはシグナルSIGHUPを受けると設定を再読み込むするのが定石なので、下記の手順をとれば、ちょっとはMacOSXを小突いた感じになれる。

  • NetInfoマネージャで「管理>ローカルNetInfoドメインを再起動」を選択
  • automount プロセスにSIGHUPを送信
  • Finder で /Network/Servers 以下を参照
ちっとは、良い感じだが!! MacOSXのファイル名のUnicode正規化方法がNFDとかなのでどうしたもんかなぁ。これまでSamba経由で公開していたものは convmvコマンドでNFC->NFDに変換すれば良く。後は,glibc でUTF-8-MACエンコードがサポートされればSambaでの運用に支障は無くなるが、、、いつのことやら。気長に待ちますかぁ。

0 件のコメント: