私は間違いなくこの問題の専門家ではありませんが、私の知る限りfcntl
、あなたが述べたように、あなたの場合はうまくいきません. fcntl アドバイザリ ロックは、同じマシン内でのみ有効です。
トピック外の場合は忘れてください。File::NFSLockを使用して、キャッシュ ストーム/ドッグパイル/スタンピングの問題を解決しました。複数のアプリケーション サーバーが NFS ボリュームでキャッシュ ファイルの読み取りと書き込みを行っていました (あまり良いアイデアではありませんが、最初はそのように考えていました)。
File::NFSLock をサブクラス化/ラップして、その動作を変更しました。特に必要なもの:
- File::NFSLock オブジェクトが範囲外に出ても消えない持続的なロック。通常の File::NFSLock を使用すると、オブジェクトが範囲外になるとロックが解除されます。これは私が必要としていたものではありませんでした。
- 実際のロック ファイルには、ロックを取得したマシンの名前も含まれています。プロセス ID だけではプロセスが終了したかどうかを判断できないことは明らかなので、ロックファイルを安全に盗むことができます。そこで、コードを変更して、ロックファイル
machine:pid
を単にpid
.
これは数年間素晴らしく機能しました。
リクエストの量が 10 倍になるまで。つまり、先月、非常にビジーなキャッシュ ファイルが 2 つのバックエンドによって同時に書き込まれ、デッド ロックが残るという最初の問題を経験し始めました。これは、1 日あたりの全体的なページビューが約 900 万から 1000 万に達したときに発生しました。
最終的に破損したキャッシュ ファイルは次のようになります。
<!-- START OF CACHE FILE BY BACKEND b1 -->
... cache file contents ...
<!-- END OF CACHE FILE BY BACKEND b1 -->
... more cache file contents ... wtf ...
<!-- END OF CACHE FILE BY BACKEND b2 -->
これは、2 つのバックエンドが同時に同じファイルに書き込みを行った場合にのみ発生します... この問題が File::NFSLock + 私たちの mod またはアプリケーションのバグによって引き起こされているかどうかはまだ明らかではありません。
結論として、あなたのアプリがひどくビジーでトラフィッキングされていなければ、File::NFSLock を選んでください。それが最善の策だと思います。それでも NFS を使用しますか?