NFSとは

NFS(Network File System)は、TCP/IPのネットワーク上でコンピュータ同士がお互いのファイルシステムを共有可能にするネットワークサービスです。リモートにあるファイルシステムが、ローカルシステムのディスクと同様に扱え、同じファイルを複数のコンピュータからアクセス可能なため、データを一カ所に集中させることが可能となります。これは、管理をする上で大きなメリットとなります。また、このような特徴から分散システムの共有データ領域としても広く用いられています。
その一方で、敬遠される点があるのも否めません。たとえば、ローカルにあるファイルシステムと比べ、リモートのファイルシステムは、アクセススピードが遅いという問題があります。これにはネットワークやプロトコル上の限界ももちろんありますが、設定の不備やハードウェア選定の不備などから来る場合も多いのが現実です。また、これを改善するために積極的にキャッシュをしようとすると、古い情報が更新されないままキャッシュされて、情報の一貫性に問題が発生する可能性もあります。さらに、NFSサーバが過負荷になると、システム全体が不安定になり兼ねないため、サーバの負荷耐性が重要になります。
分散システムにNFSを用いる場合、これらの点を十分に考慮しないと、NFSが性能上のボトルネックとなったり、遅延のためにデータの一貫性が保つことができず誤動作の原因となったりします。これは、システムにNFSを導入することの難しさの一つとなっています。

NFS の性能改善に取り組んだ理由

NFS はカーネルと密接に関係している部分が多く、性能を向上させるためには、カーネルレベルのチューニングが必要になります。Linux 2.2までのカーネルは、安定性が低く改良しても期待通りの性能向上は得られないと見送っていました。しかし、Linux2.4カーネルでは格段に安定性が増し、カーネルのチューニングを行うことによって高性能性と高安定性の両立が可能になりました。そこで、「VA Linux」ではハイエンドレベルのシステムに対応できるよう、カーネルにNFSサーバの性能向上に必要なチューニングを実施することにしました。

NFS の性能を向上させるために

「VA Linux」では、まずはNFSサーバの実装で、ボトルネックとなる点を詳細に調査し、50項目以上のチューニングを行いました。チューニングした主な内容は次の通りです。

改善した点(抜粋)
1. カーネル内部でNFSサーバのゼロコピーを実装(内部処理のムダを削減)
2. NFSで使用する資源の拡大・変更
3. カーネル内部での排他処理の改善(ジャイアントロックの削減によりマルチプロセッサ時のNFS処理の並列化を実現)
4. スケジューラの改良
・I/O待ちのプロセスを優先的に処理させる
・NFS処理サブシステム(nfsd)のCPU奪取抑制
5. NFSの高負荷対策(メモリ奪取抑制)

2003年2月現在の性能測定の結果【性能測定協力:株式会社ランス】

基本的にストレート・マッピング領域のアドレスマッピングを変えることにより実装されている。

高速NFSの提案とチューニング技術の応用

以上のようなチューニングを行った結果、これまで分散システムの性能面でボトルネックになりがちであったNFSサーバの性能と負荷耐性を大幅に改善することに成功しました。「VA Linux」は、この成果を用いて、大規模メールシステムなど様々なシステム構築をご提案していきます。
さらに今回行ったチューニングは、ディスクI/OおよびネットワークI/Oの性能を向上させることに重点を置いております。したがって、同様にディスクI/O, ネットワークI/Oの性能が求められるストリーミングサーバなどの分野にも応用可能だと考えています。

今後の取り組み

 NFS は古くからあるプロトコルなだけに、機能・性能で不足しがちな面が存在しました。次のバージョンのNFSv4 では、既存の実装の再利用は考慮せずに、根本から実装の設計を改訂しています(以下の資料参照)。

今後は、NFSの高可用性について重点におき、性能向上が図れるよう開発に取り組みたいと考えています。
*NFSの開発の成果はLinuxコミュニティへのフィードバックされております。

参考資料: