このような動作を引き起こす可能性のある簡単な間違いを推測するとしたら、時間の経過とともに一連のインデックスライターまたはインデックスリーダーを開き、それらを正しく閉じていないため、サーバーで使用可能なファイル記述子が不足している可能性があります. 「lsof」が「.cfs」、「.fdx」、および/または「.fdt」で多くの開いている記述子を示しているかどうかを確認します (「ulimit -n」を使用して最大数を確認できます)。
私が見てきた問題の原因となる IndexSearcher について注意すべき点が 1 つあります。
サーチャーを閉じても、基になるリーダーが閉じない場合があります。リーダーをサーチャーに渡すと、サーチャーを閉じてもリーダーは閉じられません (その場合、他のオブジェクトで使用されている可能性があるため)。この例:
//Assume I have an IndexWriter named indexwriter, which I reuse.
IndexSearcher searcher = new IndexSearcher(IndexReader.open(indexwriter, true));
//Use the searcher
searcher.close();
//We close the search, but the underlying reader remains open.
これで、閉じられていないリーダーが蓄積され、いくつかのインデックス ファイル記述子が開いたままになります。このパターンが何度も使用されると、時間の経過とともに応答が停止します。とにかくそのようなエラーのその一例。
次のように、サーチャーを閉じるときにリーダーを閉じるだけで修正できますsearcher.getIndexReader().close()
。ただし、より良い解決策が見つかる可能性があります。たとえば、インデックスの内容が変更されたときに更新できるリーダーの再利用。
これがあなたが抱えている正確な問題かどうかはわかりませんが、注目に値するかもしれません。