web-dev-qa-db-ja.com

Nexenta、NFS、およびLOCK_EX

私は現在LAMPアーキテクチャを使用していますが、大きな問題が予想されます:(

PHP5を使用するhttpWebサーバーがいくつかあります。すべてがNFS(v3)を介して、ホストされているすべてのWebサイトのディレクトリにマウントされています。ファイルサーバーは、ZFSを使用してNexentaストレージアプライアンスを実行しています。

問題は、すべてのNFSクライアントがNFSを介してファイルに何かを書き込もうとすると、この問題が発生することです。

これはApache2プロセス内にあります。

open("/nfs/website1/file.txt", ORDWR|OCREAT, 0600) = 11647 fstat(11647, {stmode=SIFREG|0600, st_size=23754, ...}) = 0 flock(11647, LOCK_EX

そして、プロセスは決してLOCKを取得せず、待機し続けます...常に。

の効果?すべてのApache2プロセスが使用され、待機しています。使用可能なプロセスがこれ以上ないため、サーバーは他の要求を処理できません。

解決策を見つける場所がわかりません。私にとっては、NFSサーバー側にあります。しかし、構成が間違っているか、欠落していますか?どうすれば問題を見つけることができますか?構成に関する詳細情報が必要な場合は、何が役立つかを私に尋ねてください:)

1
Givre

ロックデーモンがサーバー側で実行されていないようです。

Nolockオプションを使用するように(クライアント側で)NFSマウントを変更することにより、これをテストできます。このオプションを使用しても、クライアントマシン内のロックは防止されませんが(ローカルロックが使用されます)、マシン間のロックが機能しなくなるため、これは有効な解決策ではない可能性があります。ただし、テストとして試して、Webサーバープロセスがロックされないかどうかを確認することもできます。

ロックデーモンが問題であるかどうかが確実にわかったら、サーバー側で実行されていない理由を調べることができます(または、クライアントとサーバー間でロックプロトコルが実行されないようにしているファイアウォールの種類があるかどうか)。 。

2
jlp