まず、明らかに勉強に関する質問を投稿して申し訳ありません。これは悪い癖だとはわかっていますが、それでもここで助けが得られることを願っています。なぜなら、私は大量の調査を行ったにもかかわらず、その答えを見つけることができなかったからです。
のシナリオこれは次のようになります: NFS クライアントが 50 GB の単一ファイルを NFS サーバーに書き込みます。平均速度 125 MByte/s で 4 GB を書き込んだ後、速度は 12 MByte/s に低下します。
質問: それをどう説明するんですか。
の与えられた答え質問に対する答えは次のようになります。4GB の書き込み後、サーバーは COMMIT に応答せず、クライアントはキャッシュを空にしたいため、サーバーが応答するまで定期的に COMMIT を送信します。その期間中、データ レートは最も遅い要素のレベルまで低下します。
COMMIT プロセスに関して私が見つけたのは次のような説明だけです。
クライアントはデータを書き込み、データがサーバーに転送されると、クライアントは COMMIT を送信します。サーバーはデータを安定したストレージに書き込み、verf-Cookie を使用して COMMIT に応答します。Cookie がクライアントの Cookie と異なる場合、クライアントはキャッシュを空にすることができます。
それで、ここに私の質問: サーバーが COMMIT プロシージャに応答せず、verf-cookie を送信しない場合、クライアントは定期的に COMMIT を送信し、データ レートが大幅に低下するというのは本当ですか。もしそうなら、データ レートはどの程度低下しますか。回答から、データ レートがどの程度低下するかを結論付けることはできません。
答え1
次のようなことが起こっていると思います:
クライアントから送信されたデータは、サーバー側の FS キャッシュに書き込まれます。COMMIT 要求が送信されると、このデータは永続ストレージ (DISK) にフラッシュされ始めます。サーバーのディスク パフォーマンスによっては、時間がかかる場合があります。たとえば、ディスク パフォーマンスが 300MB/秒だとします。4GB をフラッシュするには 13 秒かかります。この時間が NFS タイムアウトよりも長い場合、クライアントは最初の COMMIT 要求が失われたと想定して、さらに別の COMMIT 要求を送信する可能性があります。COMMIT/WRITE 検証は、これらの操作の間にサーバーが再起動されないことを確認するために使用されます。
このようなシナリオでは、次の操作を実行できます。
- クライアントのNFSタイムアウトを増やすには、時間o=マウントオプション。ただし、これは修理COMMIT を再試行しました。
- データのフラッシュを十分早い段階で開始し、ログの遅延を回避するようにサーバーに指示します。
使用
sysctl -w vm.dirty_background_ratio=0
sysctl -w vm.dirty_ratio=0
sysctl -w vm.dirty_background_bytes=67108864
sysctl -w vm.dirty_bytes=536870912
サイズは、サーバーの IO パフォーマンスとネットワーク全体に応じて調整する必要があります。
カーネルがいつサーバー上のディスクにデータをフラッシュし、クライアント側のサーバーに送信するかを制御します。
注意: このオプションはグローバルであり、すべてのファイル システムに影響します。