NFS 非同期モードのため、inotify は複数の CLOSE_WRITE イベントをトリガします。

NFS 非同期モードのため、inotify は複数の CLOSE_WRITE イベントをトリガします。

nfs サーバーとクライアント (v4、両方 CentOS 7.6/7.8) があります。
サーバーに着信ファイルをコピーするプログラムがありますinotifywait(in CLOSE_WRITE)。

クライアントでは、共有は次のようにマウントされます
sudo mount 192.168.1.10:/myshare /mnt/share(非同期モードを意味します)

sudo mount -o sync 192.168.1.10:/data/shares/myshare /mnt/share

同期説明

マウントポイントに sync オプションを指定すると、そのマウントポイントのファイルにデータを書き込むシステムコールが原因で、システムコールがユーザースペースに制御を返す前にデータがサーバーにフラッシュされます。これにより、クライアント全体でより良いデータキャッシュの一貫性が得られますが、かなりのパフォーマンスコストが発生します。

サーバーで私は/data/shares/myshareフォルダを見る
inotifywait -m -e CLOSE_WRITE /data/shares/myshare | while read path action file; do echo "$action"; done

これで、通常の方法で十分に大きなファイルをコピーします(効果は約500 mbyteから始まります)。cp

質問
サーバーで発生することは、そのフラグを使用すると、ファイルがコピーされるとsyncイベントが一度発生することです。これは望ましい効果です。ただし、非同期モードではイベントが複数回発生し、このイベントを使用してサーバーに着信ファイルをコピーするため、不完全なファイルがコピーされます。CLOSE_WRITE

同期フラグを使用すると問題は解決しますが、約10%のパフォーマンスが低下します。私の580MBテストファイルは25% - 35%でした(より大きなファイルの場合は速度が低下し、非同期でも2.5GBファイルの場合と同じくらい高速です)。

Sambaでは、このような問題は発生せず、nfsに関連する問題であると考えられています。

イベントを何度も実行しなくてもパフォーマンスを維持できるフラグ/オプションまたはその他の可能性はありますか?

ベストアンサー1

おすすめ記事