Mac OS X Yosemite からの NFS 経由でのNASへの書き込みが激遅なのを何とかする

Solarisとのファイル共有も考えてNFSが喋れるNAS(NETGEAR ReadyNAS)を買ったのだけど、Mac からの NFS の書き込みが激遅なのでなんとかしてみた。

改善前の状態

MacNAS 間ギガビットでつながっているにも関わらず、スループットが数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 程度に改善!

注意

async オプションを使って COMMIT リクエストを抑制しているため、万一ファイル転送後にディスクへの書き込み前にサーバ側がクラッシュした場合、データが失われる可能性があります。
このへんは覚悟の上、許される環境であれば設定を行ってください。

そもそも、NFS COMMIT リクエストのリプライに30秒かかるNASへがおかしいのじゃないか?とも思えるけど、そんなクリティカルな環境でもないのでとりあえずこの結果に満足。
(NASの購入費が無駄にならなかった的な意味で)