我有一個java web應用程序,使用Lucene建,我不斷收到各種「文件已關閉」例外 - 這取決於我使用的目錄執行。我已經能夠從Lucene中獲得「java.io.IOException錯誤文件描述符」和「java.nio.channels.ClosedChannelException」,通常包含在IndexReader的AlreadyClosedException中。我的Java進程的文件描述符去「壞」,我不知道爲什麼
有趣的是,我沒有關閉的IndexReader,似乎文件描述符都是靠自己去陳舊。我正在使用最新版本的Lucene 3.0(沒有時間從3.0系列升級),最新版本的Oracle JDK6,最新版本的Tomcat 6以及最新版本的CentOS。我可以使用其他Linux系統上的相同軟件複製該錯誤,但不能在Windows系統上覆制該錯誤,並且我沒有要測試的OSX PC。 linux服務器是用qEmu虛擬化的,如果可能的話。
這似乎也成爲負載相關 - 如何經常發生這種情況對應於請求量/秒Tomcat正在服務(這個特定的Web應用程序)。例如,在一臺服務器上,每個請求都按預期完成,直到它處理約2個請求/秒,然後大約10%開始讓它們的文件描述符從它們下面關閉,在請求中間(代碼檢查有效的IndexReader對象和在處理請求的開始時創建一個)。一旦達到約3 reqs/sec,所有請求都會由於錯誤的文件描述符而失敗。
我最好的猜測是,不知何故有資源匱乏在操作系統級別和操作系統被清理FDS ......但是這只是因爲我已經消除了所有其他的想法,我有。我已經檢查了ulimits和文件系統的fd限制,並且打開描述符的數量遠低於任何限制(示例輸出從sysctl fs.file-nr
:1020 0 203404,ulimit -n:10240)。
我幾乎完全沒有測試過的東西,我也沒有比我發現它的日子更接近解決這個問題。有沒有人遇到類似的東西?
編輯07/12/2011:我發現了一個OSX機使用了一些測試,並已確認這發生在OSX。我也在物理Linux機器上進行了測試並複製了這個問題,所以我一直無法複製這個問題的唯一操作系統是Windows。我猜這與POSIX處理文件描述符有關,因爲這似乎是兩個測試系統(JDK版本,tomcat版本和webapp在所有平臺上都相同)之間唯一的區別。
的? – duskwuff
否。虛擬化服務器上的文件系統是ext3,就像主機上的文件系統一樣。沒有任何NFS涉及到。 – oorza
鑑於我現在已經在OSX(HFS)和使用ext4的物理Linux機器上覆制了這個,我認爲排除文件系統是一個罪魁禍首可能是安全的。 – oorza