[Tue May 30 13:00:57 2006] [error] CONNECTION_REFUSED [os error=0, line 1600 of ../nsapi/URL.cpp]: 218.206.70.193:7001 errno= 0
这时访问apache会提示和weblogic的桥出了问题。html
这个问题已经遇到不少次了,但一般都是夜间,次日查看日志的时候,会发现那个时候确实访问量比较大。查看当时的链接状况能够看到,apache和java链接都700多。看了网上的说明,调整了系统参数、调整了weblogic的设置等,都不见效。
http://www.bea.com.cn/support_pattern/Too_Many_Open_Files_Pattern.html
http://e-docs.bea.com/wls/docs81/perform/index.html前端
今天又出现这个状况了,不过是白天,和web应用的做者一块儿对weblogic的状况进行了观察。java
经过weblogic控制台,能够看到Throughput这里大都是在处理1左右的访问,Queue Length这里却在不停的涨,开始就对Thread count作了修改,从50调整到了400,可是仍是能够看到Thread会用完,一会Queue Length就又涨起来了。node
分析一下就能够知道,状况应该是Queue的线程对访问的处理速度太慢,致使须要处理的队列愈来愈多。须要处理队列的增加速度比队列的处理速度慢,这样无论有多少线程,确定最后都会致使不够用。linux
如今你们就开始考虑问题是否是出在应用这里了,应用执行速度慢,weblogic线程就会一直占着,就会致使线程用尽。而实际上确实是应用这里的问题。web
应用对访问的处理速度很快,有访问进来就先放到队列,而队列的处理速度倒是500ms处理一下,这样一秒也就处理2个。这样问题的缘由就很明确了,1s内外部访问应用可能有10来次,而应用才处理2个,因此天然会将线程占满了。apache
调整队列处理速度以后问题就解决了,空闲线程一直是400。api
=======================================================================tomcat
一,什么状况下,会新建和打开文件:
1,A JVM opens many files in order to read in the classes required to run your application.
High volume applications can use a lot of files in many ways.
2,each new socket requires a file. Clients and Servers communicate via TCP sockets.
3,Each browser's http request consumes TCP sockets when a connection is established to a Server.
二,文件描述符的释放:(文件描述符是由无符号整数表示的句柄。进程使用它来标识打开的文件)
1,在文件关闭或进程终止时被关闭的。
2,若是想重用某个文件描述符,必须关闭与之关联的全部文件描述符(父进程和子进程:文件描述符能够继承,可由子进程使用)。
3,TIME_WAIT 结束时,才会释放 TCP 套接字文件描述符。
(在 Unix系统中, TIME_WAIT在kernel参数tcp_time_wait_interval中设置.在Windows中,这个参数定义在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters的 TcpTimedWaitDelay键值
中. 默认值是240秒 (tcp_time_wait _interval 和 TcpTimedWaitDelay))
4,打开新文件时将会重用关闭的文件描述符
三,查看文件描述符的方法:
1,在UNIX平台,使用“文件列表” (lsof) 工具显示有关打开的文件和网络文件描述符的信息。
针对特定的process ,语句就是: lsof -p <pid of process>
这个命令能够在异常发生后检查打开文件的最大数,你也能够经过lsof –h 显示相应的语法和选项。
此程序最新版本可经过如下网址得到: http://ftp.cerias.purdue.edu/pub/tools/unix/sysutils/lsof/
2, 在WINDOWS平台,使用handle 工具报告有关打开文件句柄的信息。
推荐使用Process Explorer 工具查看运行的进程和打开的文件列表.(google查一下)
四, 解决之道:
1,对于引起异常的进程,请按期经过工具或命令检查该进程打开的文件和/或链接。
2,将检查结果与操做系统对进程和整体的文件描述符限制进行比较。
3,根据检查结果和实际须要提升 OS 限制来弥补文件描述符不足。并使TIME_WAIT 期间缩短为一个切合 实际的值。
注意事项:
1,若是未正确关闭文件,文件描述符可能未被释放。
2,若是子进程使用的描述符未关闭文件,将不能重用该文件描述符。(继承父进程文件描述符)
3, TIME_WAIT 结束前,TCP 套接字会使文件描述符保持打开状态。
4, 请不要依赖 GC 和对象清除功能来释放文件描述符
五, 如何修改文件描述符:
操做系统资源限制控制:
可使用的文件描述符总数
单个进程最多能够打开的描述符数。
例如:
1,Windows: 经过文件句柄,打开文件句柄设置为 16,384.
2,Solaris: rlim_fd_cur 和 rlim_fd_max
/usr/bin/ulimit 实用程序定义容许单个进程使用的文件描述符的数量。 它的最大值在 rlim_fd_max 中定义,在缺省状况下,它设置为 65,536。 只有ROOT用户才能修改这些内核值。
3,HPUX: nfile, maxfiles 和 maxfiles_lim
nfile 定义打开文件的最大数量。 此值一般由如下公式来肯定: ((NPROC*2)+1000),其中 NPROC 一般为: ((MAXUSERS*5)+64)。 若是 MAXUSERS 等于 400,则通过计算获得此值为 5128。 一般能够将此值设高一些。maxfiles 是每一个进程的软文件极限,maxfiles_lim 是每一个进程的硬文件极限。
4,Linux: nofile 和 file-max
管理用户能够在 etc/security/limits.conf 配置文件中设置他们的文件描述符极限,以下例所示。
soft nofile 1024
hard nofile 4096
设置命令以下:
echo 4096 > /proc/sys/fs/file-max
echo 16384 > /proc/sys/fs/inode-max
5,AIX: OPEN_MAX
文件描述符极限在 /etc/security/limits 文件中设置,它的缺省值是 2000。 此极限能够经过 ulimit 命令或 setrlimit 子例程来更改。 最大大小由 OPEN_MAX 常数来定义。服务器
======================================================================
unix平台监控打开文件:
lsof -p <pid>
解决方法
增长文件描述符的数量一般将可以解决这种问题,可是您还将须要确保 WebLogic Server 做为一种应用程序不使用过多的文件,还要确保打开的文件可以正确关闭,以便释放文件描述符。
solaris上设置文件描述符:
/usr/bin/ulimit -H -n 8192
/usr/bin/ulimit -S -n 8192
曾经遇到前端的Apache TCP性能不佳形成大量TIME_WAIT状态的链接不能释放,形成WebLogic频繁出现Too many open files的问题。在重装主机升级了linux版本,调整了TCP参数后解决了此问题。
======================================================================
单位的系统是基于2EE架构的,采用的中间件是weblogic,操做系统是Solaris的,由多台服务器构成了应用集群。系统运行一端时间之 后,出现了打开文件数过多(Too many open files)的错误,知道是什么错误,但不知道怎么改动,上网也找了一些资料都没有成功,最后在本身和别人的帮助下解决了这个问题,如今简单的说一下怎么 作的,你们分享一下。
当出现问题的时候我用ulimit -a查看了一下系统的打开文件数限制,结果只有256,因而就用调整了这个值,修改了/etc/system文件,增长了以下的内容:
set rlim_fd_cur=8192
set rlim_fd_max=65535
将打开文件数设为了8192,最大为65535。重启机器以后用ulimit -a看了一下,系统的已经变成了8192,觉得问题能解决了,但过了一端时间以后有出现了一样的问题。网上好多说的改系统的打开文件数就好了,但我这儿却 失败了,不知道为何,若是有谁知道的能够指教一下。
因而我又开始查找资料,使用了一个plimit命令查看了一下java进程的打开文件数只有1024,这是weblogic设的正常值,听一个工程师说如 果打开文件数小于1024则weblogic设的值起做用,若是打开文件数大于1024,则会以操做系统的为准,但我遇到的问题却并不是如此,进程的打开文 件数仍是1024,如今都没想明白。知道了这些以后,因而就把问题放在了如何永久修改java的打开文件数上,若是只是当前服务启动有效可使用命令 plimit -n 最大打开数 pid(进程号) 实现,但这样每次重起WLS服务后都须要从新执行命令。
由于个人环境是weblogic集群,修改了一个节点管理进程文件(在%bea home%\weblogic81\server\bin目录下)startNodeManager.sh,添加了行ulimit -n 65535,保存退出就ok了,但有一点要注意,就是必须重启服务器,不然更改不会有效。重启以后进程打开文件数就变成了65535,到目前为止没再出现 上述问题。
在另一个tomcat+redhat的系统中也出现了上述的问题,正在解决中,若是解决了再和你们分享tomcat+redhat环境中如何解决该问题。若是有知道的朋友,能够留言告知,谢谢。
============================================================
个人操做系统是redhat,内核是Linux version 2.4.20,用tomcat做为中间件,出现了Too many open files错误。
经过ulimit -a查看结果为
open files (-n) 1024
/proc/sys/fs/file-max值为209600
网上说和file-max的值有关,可是个人都已经209600了,应该不会有问题的,
和ulimit -n看到的不同,
请问ulimit -a和file-max什么关系,怎么使ulimit -a查看到的open files信息是我想要设的值,怎么解决这个问题。
一样的问题我在weblogic下也遇到过,修改了系统的最大打开文件数系统仍然出一样的错误,后来在weblogic的进程文件中加入了ulimit -n 65535,每次weblogic启动时,进程的打开文件数都是65535,没有再出现该问题。
请问在tomcat中如何修改其进程的最大打开文件数,是在startup.sh中加入ulimit -n number语句吗?
linux下怎么查看一个进程的最大打开文件数
lsof -p pid | wc -l
看到的好象是当前的打开文件数
===============================================================
个人weblogic常常报too many open files错误,BEA的人说是系统的问题。
我该怎么调整个人solaris8呢?
在/etc/system里,个人设置是
set rlim_fd_max=8192
set rlim_fd_cur=8192
还有什么其它的地方要修改的吗?
< 发表于: 2004-10-25 12:13 一、使用这个命令看一下!设置是否起做用。 # ulimit -n 2048 二、检查你的java程序,多是java程序没有关闭形成的! 最好从程序方面解决,要不性能会有影响!