weblogic日誌報錯too many open files

lsl031發表於2011-08-17

很久以前的問題了:

1.日誌報錯too many open files;
2.診斷思路:檢視該程式實際開啟的檔案數是多少?用lsof命令檢視domain對應的程式號;

lsof -p 2744 |wc -l檢視總的大小;以及可以看到具體開啟的那些檔案;

3.檢查當前的系統配置
ulimit -a


但是剛才做的一切都顯示配置沒有問題,但是程式開啟了1024個檔案,卻報了開啟檔案個數臺多的問題;

在網上找到以下的文章,貌似該問題的原因:

weblogic Too many open files 問題
java.io.FileNotFoundException: /app/rms/release/web/update/Rmt_krUpfiles.ini (Too many open files)
 at java.io.FileInputStream.open(Native Method)
 at java.io.FileInputStream.(FileInputStream.java(Compiled Code))
 at weblogic.utils.classloaders.FileSource.getInputStream(FileSource.java(Compiled Code))
 at weblogic.servlet.FileServlet.sendFile(FileServlet.java(Compiled Code))
 at weblogic.servlet.FileServlet.service(FileServlet.java(Compiled Code))
 at javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code))
 at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java(Inlined Compiled Code))
 at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java(Compiled Code))
 at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java(Inlined Compiled Code))
 at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java(Compiled Code))
 at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java(Compiled Code))
 at weblogic.security.service.SecurityManager.runAs(SecurityManager.java(Inlined Compiled Code))
 at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java(Compiled Code))
 at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java(Compiled Code))
 at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java(Compiled Code))
 at weblogic.kernel.ExecuteThread.run(ExecuteThread.java(Compiled Code))
>
####<2008-7-1 10時15分05秒 GMT+08:00> <> <>
####<2008-7-1 10時15分06秒 GMT+08:00> <> <>
####<2008-7-1 10時15分06秒 GMT+08:00> <> <>
####<2008-7-1 10時15分07秒 GMT+08:00> <> <>
####<2008-7-1 10時15分08秒 GMT+08:00> <>
####<2008-7-1 10時15分08秒 GMT+08:00> <>
####<2008-7-1 10時15分09秒 GMT+08:00> <> <>
####<2008-7-1 10時15分09秒 GMT+08:00> <> <>
####<2008-7-1 10時15分09秒 GMT+08:00> <> <>
####<2008-7-1 10時15分09秒 GMT+08:00> <> <>
 (Too many open files)
這個問題經過分析,可能是系統開啟的檔案數超過最大限制造成的.
透過看bea最大開啟檔案數限制,發現作業系統沒有限制(最好修改作業系統也修改weblogic的配置).
[bea@sczyapp1]/bea #ulimit -a
time(seconds)        unlimited
file(blocks)         unlimited
data(kbytes)         unlimited
stack(kbytes)        4194304
memory(kbytes)       unlimited
coredump(blocks)     2097151
nofiles(descriptors) unlimited
[bea@sczyapp1]/bea #
------------------------------------
透過查詢bea設定發現
/bea/weblogic81/common/bin/commEnv.sh中,設定了
resetFd
所以bea的最大開啟檔案數為預設的 1024
此問題只要註釋掉resetFd,並重啟伺服器就可以解決.
 
系統預設的shell中寫的是小與,將shell中的邏輯修改一下也可以(就是修改 /bea/weblogic81/common/bin/commEnv.sh 指令碼)
      

檢查domain的啟動指令碼,發現domain啟動時首先要執行以下這個指令碼,確定一些記憶體和系統引數配置;
由於記憶體引數在啟動指令碼中單獨給出,所以才沒有暴露出問題。但是沒有單獨給出開啟檔案的限制,所以需要在那個指令碼當中修改;
不要啟用那個過程設定開啟檔案的限制;

對那一段的結果進行測試,結果印證了此時的限制是1024
#!/bin/sh
echo 'test'
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 "${maxfiles}" != 1024 ]; then
      if [ `expr ${maxfiles} : '[0-9][0-9]*$'` -eq 0 ]; then
        maxfiles=1025
        echo "set 1025"
      fi
      if [ "${maxfiles}" -lt 1024 ]; then
        ulimit -n ${maxfiles}
        echo "set to unknow"
      else
        ulimit -n 1024
        echo "set to 1024"
      fi
    fi
  fi
}
resetFd

> sh test1.sh
test
set to 1024

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/288166/viewspace-705050/,如需轉載,請註明出處,否則將追究法律責任。

相關文章