Mac OS X Yosemite からの NFS 経由でのNASへの書き込みが激遅なのを何とかする
Solarisとのファイル共有も考えてNFSが喋れるNAS(NETGEAR ReadyNAS)を買ったのだけど、Mac からの NFS の書き込みが激遅なのでなんとかしてみた。
改善前の状態
Mac ⇔ NAS 間ギガビットでつながっているにも関わらず、スループットが数Kbps程度で、以下のエラーが延々と繰り返す。
nfs server readynas:/data/Documents: not responding nfs server readynas:/data/Documents: is alive again
ついカッとなって Wireshark でパケットを調べた所、Mac からの NFS の COMMIT リクエストに対する NAS側からのリプライに時間がかかっている(30秒超!!)ことがわかった。
対策
NFS マウント時に async オプションを追加し、データの WRITE 後に COMMIT リクエストを出さないようにする。
1) /etc/nfs.conf に以下の行を追記し async オプションの使用を許可する
nfs.client.allow_async = 1
2) /etc/fstab を作成し NFS マウントのエントリを追加する。その際マウントオプションとして async を指定
readnas:/data/Documents /data nfs async
※ 念のため、/data はマウントポイントで予め mkdir(1) コマンドでディレクトリを作っておく必要があります。また、readnas は 私の環境での NFS のサーバ(NAS)のホスト名です。/data/Documents はNFSサーバ(NAS)上で共有されているディレクトリです。
3) root ユーザで automount(1) コマンドを使って fstab ファイルの内容をロードする
$ sudo /usr/sbin/automount -vc
対策2
起動時に自動マウントする必要はない場合は、手動でマウントするだけであれば以下のコマンドでも async オプションをつけてマウントできます
$ sudo mount_nfs -o async,nosync readynas:/data/Documents /data
もちろん不要になったらアンマウントもできます。
$ sudo diskutil umount /data
結果
スループットが 400Mbps 程度に改善!