在經過近期的連續加班,專案最後階段的開發終於完成,並於前天晚上順利實施上線,上線後就凌晨2點鐘了,雖然身體有些疲憊,心理卻輕鬆了很多。可是沒想到早晨來上班,剛走到客戶公司樓下,就接到電話說正式環境的伺服器當掉了,跑到樓上開啟電腦下載正式環境的伺服器日誌,發現瞭如下異常資訊:
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.
at weblogic.utils.classloaders.FileSource.getInputStream(FileSource.java:31)
at weblogic.servlet.internal.WarSource.getInputStream(WarSource.java:65)
at weblogic.servlet.FileServlet.sendFile(FileServlet.java:400)
Truncated. see log file for complete stacktrace
>
從日誌本身可以發現“Too many open files”,說明同時開啟的檔案數過多,於是想起Linux/AIX作業系統中會有引數設定允許同時開啟的最大檔案數量,具體檢視方法可以參考:
http://hi.baidu.com/bluesnake/blog/item/d267e350019a85591138c2f2.html [postads250x250]
而經過檢視,在本專案正式環境中已經將允許同時開啟的最大檔案數量設定為了unlimited,所以應該不是伺服器的原因,轉而檢視WebLogic的配置,猜測是由WebLogic的配置檔案指定了部署在WebLogic上的應用允許同時開啟的最大檔案數量。
首先檢視startWebLogic.sh和setDomainEnv.sh,都沒有發現類似設定,接下來檢視WebLogic本身的配置commEnv.sh(***\wlserver_10.3\common\bin),發現如下內容:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# limit the number of open file descriptors resetFd() { if [ ! -n "`uname -s |grep -i cygwin || uname -s |grep -i windows_nt || \ uname -s |grep -i HP-UX`" ] then maxfiles=`ulimit -H -n` if [ "$?" = "0" -a `expr ${maxfiles} : '[0-9][0-9]*$'` -eq 0 ]; then ulimit -n 1024 fi fi } …… resetFd |
果然在該配置檔案中指定了該數量,其預設值為1024,嘗試將其改大,在網上查了下,在AIX4.3版本之後該值最大可以被設定為32768,於是我嘗試將其改成了32768,重新啟動WebLogic,正常被啟動,且再未出現該異常:)
總結下來,該問題的解決方案如下:
在***\wlserver_10.3\common\bin\目錄下找到commEnv.sh,修改其resetFd()函式的ulimit -n 後面的數值,根據作業系統不同系統適量調大,調整後的該函式應為
1 2 3 4 5 6 7 8 9 10 |
resetFd() { if [ ! -n "`uname -s |grep -i cygwin || uname -s |grep -i windows_nt || \ uname -s |grep -i HP-UX`" ] then maxfiles=`ulimit -H -n` if [ "$?" = "0" -a `expr ${maxfiles} : '[0-9][0-9]*$'` -eq 0 ]; then ulimit -n 32768 fi fi } |