5

次のコード スニピットをご覧ください。

 f = open("/mnt/remoteserver/bar/foo.bin", O_RDONNLY);
 while (true)
 {
       byteseread = read(f, buffer, 1000);
       if (bytesread > 0)
           ProcessBytes(buffer, bytesread);
       else
           break;
  }

上記の例では、リモート ファイル foo.bin が 1MB で、これまでクライアントからアクセスされたことがないとします。つまり、ファイル全体を取得するために「読み取り」を約 1000 回呼び出すことになります。

さらに、ディレクトリがクライアントにマウントされているサーバーがローカルではなくインターネット上にあるとします。クライアントへの帯域幅は高速ですが、待ち時間が長くなります。

すべての「読み取り」呼び出しは、サーバーへの往復を呼び出して、さらにデータを要求しますか? または、クライアント/サーバープロトコルは、リモートファイルの後続の読み取りがしばしばシーケンシャルであることを認識し、そのため、アプリケーションが実際に read() 呼び出しを行う前に後続のブロックがプッシュダウンされます. したがって、データがプリフェッチされてキャッシュされているため、後続の読み取り呼び出しはより高速に戻ります。

最新のネットワーク ファイル システム プロトコル (NFS、SMB/Samba、その他のプロトコル) は、このような最適化を行いますか? このように最適化されたインターネット用に調整されたネットワーク ファイル システム プロトコルはありますか?

私は、インターネットを介したネットワーク ファイル システムの実装を含む可能性のある個人的なプロジェクトを調査しています。ファイル I/O の往復回数を減らすことができれば、パフォーマンスが向上するのではないかと思いました。

4

1 に答える 1

3

これは、プロトコルの実装に大きく依存します。一般に、ほとんどのクライアント実装がプリフェッチするとは思いませんが、ほとんどの精通したストレージ管理者は大きなブロックサイズ (32+kb は rsize/wsize マウント オプションを参照) を使用し、事実上同じ結果になります。通常、ネットワーク ファイル システムはシステム バッファ キャッシュ経由でもキャッシュされるため、read() 呼び出しをネットワーク IO に直接変換することは絶対にありません。

私のアドバイスは、プログラムを素朴に (または単純なテスト ケース) 書き、nfsstat などを介してネットワーク統計を読むことに慣れてから、そこから最適化することです。変数が多すぎて、他の方法で答えを得ることができません。

私は専門家ではありませんが、NFS4 には古いプロトコル (nfs2,3,cifs) よりも多くの WAN 最適化があることがわかります。とは言うものの、ほとんどのリモート ファイルシステム プロトコルは実際には高レイテンシ アクセス用に設計されていないため、最終的に S3 のようなシステムになっています。

于 2011-03-20T02:31:43.160 に答える