解决WebLogic中Too many open files异常

九月 29, 2009 in Oracle 融合中间件

在经过近期的连续加班,项目最后阶段的开发终于完成,并于前天晚上顺利实施上线,上线后就凌晨2点钟了,虽然身体有些疲惫,心理却轻松了很多。可是没想到早晨来上班,刚走到客户公司楼下,就接到电话说正式环境的服务器当掉了,跑到楼上打开电脑下载正式环境的服务器日志,发现了如下异常信息:

<Sep 28, 2009 9:55:16 AM CST> <Critical> <Server> <BEA-002616> <Failed to listen on channel "Default" on ****.*.*.*:****, failure count: 1, failing for 0 seconds, java.net.SocketException: Too many open files>
<Sep 28, 2009 9:55:16 AM CST> <Error> <HTTP> <BEA-101019> <[weblogic.servlet.internal.WebAppServletContext@6c086c08 - appName: 'consoleapp', name: 'console', context-path: '/console', spec-version: '2.5'] Servlet failed with IOException
java.io.FileNotFoundException: /***/wlserver_10.3/server/lib/consoleapp/webapp/images/sort_up.gif (Too many open files)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:112)
    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


而经过查看,在本项目正式环境中已经将允许同时打开的最大文件数量设置为了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
}

相关文章:

  1. 防止Weblogic重新编译JSPX

4 responses to 解决WebLogic中Too many open files异常

  1. 了解了,呵呵……
    3Q

  2. 在我们项目中,应用刚部署上去,同时打开的文件数就能达到将近800,那么几个人再同时进行操作,同时打开的文件肯定会超过1024的,但一般操作完成关闭页面或页面跳转时前一个页面打开的文件就会被关闭,除非程序本身写得有问题或者weblogic本身读写文件的操作有Bug,打开文件后不关闭,一直保持开启状态,否则该数值绝不会无限制增长的!

  3. 回复LS,我不赞成你的说法
    由于在系统中需要进行读写文件或者其他操作,即使没有读写文件等操作,实际上随着应用越来越大,同时打开的文件数量增加是不可避免的,但一般文件打开后都会关闭的,因此不会出现无限制的增长。
    例如:对于一个编程风格良好的程序员来说,在读写文件时操作完之后肯定会去close掉该文件的。
    而且我仔细查看了启动后的weblogic进程对应的同时打开的文件的句柄数量,最多也不过千余,因此这个数值不需要设置这么大,在测试环境中我只将其更改成了2000,也未出现过该异常,在这里设置为这么大,只是防患于未然。

  4. 将此参数调大之后,应该只是降低了当机的频率吧,如果服务器配置不够高端,修改这个参数也无法修改到很大值,那该怎么办呢?

Leave a reply

You must be logged in to post a comment.