2011年11月27日 星期日

在 Linux 上調整 glassfish 的 porcess pool number 時遇到的問題

在 Linux 上每個 porcess 可以開啟的檔案數量預設為 1024,
glassfish 在預設 porcess pool number 為 5 時執行就已經開啟了 500 多的檔案,
所以要是將 porcess pool number 調整為 500 瞬間就會超過 1024,然後出現下面的 Error Message。

##
#|2011-11-26T21:39:51.917+080
0|SEVERE|glassfish3.0.1|grizzly|_ThreadID=18;_ThreadName=Thread-14;|doSelect IOException
java.io.IOException: 開啟太多檔案
       at sun.nio.ch.IOUtil.initPipe(Native Method)
       at sun.nio.ch.EPollSelectorImpl.<init>(EPollSelectorImpl.java:49)
       at sun.nio.ch.EPollSelectorProvider.openSelector(EPollSelectorProvider.java:18)
       at java.nio.channels.Selector.open(Selector.java:209)
       at com.sun.grizzly.util.Utils.openSelector(Utils.java:100)
       at com.sun.grizzly.TCPSelectorHandler.initSelector(TCPSelectorHandler.java:399)
       at com.sun.grizzly.TCPSelectorHandler.preSelect(TCPSelectorHandler.java:379)
       at com.sun.grizzly.SelectorHandlerRunner.doSelect(SelectorHandlerRunner.java:183)
       at com.sun.grizzly.SelectorHandlerRunner.run(SelectorHandlerRunner.java:130)
       at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
       at java.lang.Thread.run(Thread.java:662)
|#]

##

解法是要先調整每個 porcess 可以開啟的檔案數上限,
先編輯 /etc/security/limits.conf
加入下面這一行,目的是未來機器重開都會讀取我們設定的新上限值。

##
* soft nofile 65536 
##

然後用這個指令動態修改

##

ulimit -Sn 65536
##

參考資料:
http://www.cyberciti.biz/faq/howto-linux-get-list-of-open-files/
http://www.linuxidc.com/Linux/2010-04/25283.htm


沒有留言:

張貼留言