なんちゃって技術者のなまくらです。みなさま、いかがお過ごしでしょうか。
ちょっと前にこんな記事を書きました。
ls結果が遅すぎる!どうなってんだNetApp!?
ことの顛末を書いていなかったのと、現在も結論が出ていない事実があるので書いておこうと思いますまる。
発生事象おさらい
NetApp をFAS3160からFAS2750にリプレース。NFSボリュームはそのまま移行。その中のとあるディレクトリにファイルが26,000弱存在していた。その領域をSolaris9(古っ!)とCentOS6で両方ともマウントし、lsコマンドをたたいたところ、Solaris9は2分半かかり、CentOS6ではその1/5(30秒)ほどでした。マウントオプションの違い
どうしてそんなに大きな差となって表れたのか、わかっている人にとってはえらく単純で、マウント時にnoacのオプションを付けたかどうか、です。このオプションをつけないとOS側でキャッシングをしなくなるので、lsの要求(特にgetattr)はすべてNetApp側に投げることになります。
手元にあるCentOS6.6にてman nfsを叩き、ac/noacオプション部分を抜粋します。
Selects whether the client may cache file attributes. If neither option is specified (or if ac is specified), the client caches file attributes.
クライアントがファイル属性をキャッシュできるかどうかを選択します。どちらのオプションも指定されていない場合(またはacが指定されている場合)、クライアントはファイル属性をキャッシュに入れます。
To improve performance, NFS clients cache file attributes. Every few seconds, an NFS client checks the server's version of each file's attributes for updates.
Changes that occur on the server in those small intervals remain undetected until the client checks the server again. The noac option prevents clients from caching file attributes so that applications can more quickly detect file changes on the server.
パフォーマンスを向上させるために、NFSクライアントはファイル属性をキャッシュします。数秒ごとに、NFSクライアントは更新のために各ファイルの属性のサーバーのバージョンをチェックします。
これらの短い間隔でサーバー上で発生した変更は、クライアントがサーバーを再度チェックするまで検出されません。 noacオプションを指定すると、クライアントはファイル属性をキャッシュできなくなり、アプリケーションはサーバー上のファイルの変更をより迅速に検出できます。
In addition to preventing the client from caching file attributes, the noac option forces application writes to become synchronous so that local changes to a file become visible on the server immediately. That way, other clients can quickly detect recent writes when they check the file's attributes.
クライアントがファイル属性をキャッシュしないようにすることに加えて、noacオプションはアプリケーションの書き込みを強制的に同期化して、ファイルに対するローカルの変更がサーバー上ですぐに見えるようにします。このようにして、他のクライアントはファイルの属性をチェックするときに最近の書き込みを素早く検出できます。
Using the noac option provides greater cache coherence among NFS clients accessing the same files, but it extracts a significant performance penalty. As such, judicious use of file locking is encouraged instead. The DATA AND METADATA COHERENCE section contains a detailed discussion of these trade-offs.
noacオプションを使用すると、同じファイルにアクセスするNFSクライアント間でキャッシュの一貫性が向上しますが、パフォーマンスが大幅に低下します。そのため、代わりにファイルロックを慎重に使用することをお勧めします。データとメタデータのコヒーレンスのセクションでは、これらのトレードオフについて詳しく説明しています。なんだ、manに解答が全部書いてあるじゃんw
なんでnoacオプションを使用しているのか
前のmanから抜粋の最後のほうにも書いてあるんですが、ファイル読み取りの一貫性を保証したかったからです。一貫性というと( ゚Д゚)ハァ??なんのこっちゃと思うかもしれません。今回問題が発生したサーバは負荷分散装置の下に2台構成でぶら下げているサーバで発生したものです。ファイルキャッシュを有効にすると、2台の間のファイルの状態に差が生じてしまうなどの問題が発生することがあるからです。
良いリンク見つけました。
nfs利用時のmountオプションについて
リンク切れ怖いのでここから転載するとキャッシュを効かせると、速度的に大きなアドバンテージが得られる代わりに、以下のデメリット(一貫性、安全性)も生じます。
- マウントしているクライアント側がローカルにキャッシュを持つのでnfsサーバ側と差分が出ることがある(LB配下の場合はクライアント間でも発生する)。
- 同期しないので書き込み完了したつもりでも、DISKに反映されてない事がある
- IOをキャッシュするので突発ダウン時にDISK書き込んでいないデータが消失する