解决打开文件过多的问题_第1页
解决打开文件过多的问题_第2页
解决打开文件过多的问题_第3页
解决打开文件过多的问题_第4页
解决打开文件过多的问题_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、解决打开文件过多的问题无论文件类型是socket述是pipe,文件描述符对于标志不同类型的打开文件的进程 来说是唯一的。当操作系统运行岀现文件标志描述符不足时,就会抛出打开文件过多的异常。 然而,文件描述符溢出则是更为复杂的问题的征兆,表明与这些文件相关联的资源没有正确 被维护。让我们来看看如何诊断导致诸如此类杲常的问题:java. net. socketexception: too many open fi les at java. net. plainsockettmpl.accept ( compiled code) at java. net. serversocket. implacc

2、ept(compiled code) at java net serversocket accept (compiled code) at wcbiogic. t3 srvr. listenthrcad run (compiled code)和诸如此类的异常:java.io.ioexception: too many open filesat java.lang.unixprocessforkandexec(native method)at java.lang.unixprocess.(unixprocess.java:54)at j avalang.unixprocessforkandexe

3、c(native method)at java.lang.unixprocess.(unixprocess.java:54)at java.lang.runtime.execlnternal(native method)at javalang.runtimeexec(runtimej ava:551)at j ava.lang.runtime.exec(runtime.j ava:477)at javalang.runtime.exec(runtime.java:443)i第一个异常在错误影响到底层的tcp协议时抛出,而第二个异常则在错误影响到i/o 操作吋抛出。这两个异常都是出现阻塞服务器的

4、类似问题的征兆。该问题可通过下面的研究 方法來解决。第二个界常在jvm进程缺乏文件描述符时出现(尽管在执行forkandexec()子例程时 需要新的文件描述符来复制父进程的文件描述符)。对于每个进程,操作系统内核在u_block 结构中维护文件描述符表,所有的文件描述符都在该表中建立索引。让我们从复习文件描述符开始。文件描述符是由无符号整数表示的句柄,进程使用它 來标识打开的文件。文件描述符与包括和关信息(如文件的打开模式、文件的位置类型、文 件的初始类型等)的文件对彖相关联,这些信息被称作文件的上下文。进程获取文件描述符最常见的方法是通过本机子例程open或create获取或者通过 从父进

5、程继承。后一种方法允许了进程同样能够访问由父进程使川的文件。文件描述符对于 每个进程一般是唯-的。当卅fork子例程创建某个子进程时,该子进程会获得其父进程所 有文件描述符的副本,这些文件描述符在执行fork时打开。在由fcntl > dup和dup2子 例程复制或拷贝某个进程时,会发生同样的复制过程。如果数最下降,我们应该增加文件描述符的最人数量,以防止问题重复出现。这种变化 可以与减少连接在断开z前保持ttmejvatt状态的时间长度结合在一起。在繁忙的服务器 上,240秒的默认值可以延迟其他连接的尝试,因此也限制了连接的最大数量。如果数量 持续上升,我们应该确定是否冇一些描述符的处

6、理时间过t (文件没冇被止确关闭),以及 是否创建了过多的文件(例如,驱动程序库不断为每个新的jdbc连接加载文件)。加载jar文件也可以减少使用的文件描述符的数量。每个jar文件都使用一个描述 符。即使要对每个单一类都使用同一描述符,也必须对每个单一类单独加载。监视描述符我们可以使用不同的技术,来监控和诊断一个进程是如何使用所有描述符的,不同的技 术取决于不同的操作系统。unix平台:在诸多工具中,lsof (list open files) unix管理工具显示有关打开 文件和网络文件描述符的信息,包括它们的类型、人小和-节点。对于特定的进程,其语 法如f所示:lsof -p <pi

7、d of process>示例1 :以下命令在solaris 2. 7启动weblogic server 8. 1sp1后立即执行。它 表明运行服务器的java进程(ptd390)分配了 84个文件描述符,此数量远小于文件描述 符缺省的硬极限。-p 390 | wc -1 84这个数字远远低于文件描述符的默认硬极限。在异常出现之示可以执行此命令,以确保 此java进程达到了打开文件的最大数屋。这将确认该进程缺乏文件描述符。然后我们可以 运行:-p <pid>并将输出结果重定向到某个文件以检杳打开的每个文件。如果某个应当关闭的文件却出 现在列表屮,您可以探杏此文件以前没有按照预

8、期方式关闭的原因(参见清单1 )。lsof -h命令显示所有可能的语法和选项(参见参考资料中这个程序的最新版本)ounix平台的输出清单1. lsof -h命令显示所有可能的语法和选项。如果某个应当关闭的文件却出现 在列表中,您可以探查此文件以前没有按照预期方式关闭的原因。command pid user fd type device size/off node namejava 29733 usera cwd vdir 176,22 4096 4300274/home/usera/810/user_proj ects/mydomainjava 29733 usera txt vreg 176

9、,22 36396 6642305 /home/usera/810/jdkl41_02/bin/javajava 29733 usera txt vreg 176,22 1251192 10818087 /home/usera/810/user_proj ects/mydomain/myserver/.wlnotdelete/extract/myserver_uddi_uddi/jarfiles/_wl_cls_gen.jarjava 29733 usera txt vreg 176,22 511935 10074851 /home/usera/810/user_proj ects/mydom

10、ain/myserver/ wlnotdelete/extract/myserver_uddi_uddi/jarfiles/web-inf/lib/jsse39153.jarjava 29733 usera txt vreg 176,22 2305960 6000676/home/usera/810/user_proj ects/mydomain/myserver/internal/uddi.warjava 29733 usera txt vreg 176,22 1227013 1385413/home/usera/810/weblogic81/common/eval/pointbase/li

11、b/ pbserver44.j arjava 29733 usera txt vreg 176,22 653661 69379/home/usera/810/weblogic81/server/lib/ant/optional-jar文件描述符将用于每个套接字连接,lsof述可以显示套接字的类型(tcp或udp ) 以及监听地址和端口(位于名称列中)。示例2 :在hp上,您还可以使用性能监视工具glance (参见 参考资料)来分析 在运行weblogic server吋所打开文件的总数。command pid user fd type devicesize/off node namein.t

12、elnet 29705 root 2u inet0x30002808fd8 0t76 tcpaaaaabbbb:telnet >abcdef.bea com:3886 (established)如果您没有lsof,则还可以在/proc/fd中查看某个进程的所有文件描述符。毎个 文件描述符都驻留在此目录中。示例3 :这个例子显示了一个处于closejvait状态的套接字:command pid user fd type devicesize/off node namejava 545 weblogic 24u ipv40x30002a4cea8 oto tcpabcd:7001->x

13、yz com:12345(close_wait)如果套接字保持这种状态,它的相关文件描述符就会存在。如果很多套接字处于这种状 态,那么进程可以在文件描述符之外运行。当tcp套接字的对等方(连接的另一边)发送 一个ftn时,它就会进入这种状态。因为不能设置超时来关闭这些套接字,所以它们只能 等待木地应用程序调用closeo函数。windows 平台: 在 microsoft windows nt 或 windows 2000 上,命令行工具 handle 报告有关引用所打开文件的句柄信息,如下所示:c:tmp>ps -ef | grep javausers 1656 1428 0 10:1

14、1:41conin-e:46 c:releaseswls8 2jdk141lbinjava -client-xms32m -xmx200m-xx:maxpermsize=128m-xverify:none -dweblogic.nam巳二myserver -dweblogic.productionmodeenabled=-djava.security.policy="c:releaseswls8.2weblog-1serverlibweblogic.policy" weblogic.server-从windows平台的输出清单2.您可以使mj handle命令来显示特定进程

15、的输出。这个例子表明,在windows 上运行weblogic server 8. 1sp2时使用了 65个文件句柄。process explorer是另一个windows工具,它是用來监视文件句柄的更高级的实用程 序。它具有gui界面并能显示有关正在运行的每个进程的更多信息。您可以使用此程序来 搜索特殊句柄(参见参考资料中给出的获得这个工具的地址)。图显示了一个输出 例子,它表明运行weblogic server的java进程使用了 884个句柄,但只有少数(65 个)句柄引用打开的文件。图 1. process explorer在这里的输出中,运行weblogic server的java进

16、程使用了 884个句柄,但只有少 数(65个)句柄引用打开的文件。通过使用上述任一工具,您可以确定应当关闭的文件是否仍处于打开状态。接着,您应 当按照下面说明的方式,來检查如何关闭文件,以及如何释放它的文件描述符。让我们详细 描述如何在不同平台上定义文件描述符。文件描述符极限以及可分配给进程的最大大小山资 源限制來定义。这些值应当按照在weblogic server文档中建议的、特定操作系统的文 件描述符值来设置。unix和linux都冇文件描述符。不过,二者的主要区别在于如何设置文件描述符的硬 极限值、缺省值和配置过程。文件描述符的最大数虽:也叫做硬极限。软极限定义了一个进程 可以打开多少个

17、文件。软极限可以增加,但是不能超过硬极限。在windows 2000 server上,打开文件句柄的限制被设置为16,384。可以在任务管 理器性能一览表中监控这个数字。solaris平台:/usr/bin/ulimit实用程序定义允许单个进程使用的文件描述符的数 量。它的最大值在rlim_fd_max中定义,在缺省情况下,它设置为1024。只冇根用户才 能修改这些内核值。从solaris 8开始,软极限的默认值是64或256。linux平台:管理用八可以在etc/security/limits. conf配置文件中设置它们的文 件描述符极限,如下例所示:soft nofile 1024hard nofile 4096系统级文件描述符极限述可以通过将以下三行添加到/etc/rc. d/rc. local启动脚本 屮来设置:# increase system-wide file descriptor limit.echo 4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论