linux文件句柄不足导致服务器僵死

  测试组同事做性能测试的时候,Web容器在NIO模式下,用1000个并发做压力测试。同事一般使用jconsole连接到应用服务器实例的JMX MBean Server监控内存变化和线程变化情况。但是前两天发现并发上去之后,jconsole不能获得数据了,不能做任何监控了,并且jconsole的报下面的错误

                   

 

  初一看,这问题不好解决呀,感觉很朦胧,但是静下心来想想,还是有条理地解决吧,分析思路如下:

   1,从堆栈分析得出,jconsole肯定是取某个MBean(最后查出是MBean ObjectName为:java.lang:type=OperatingSystem的这个MBean),所以写了一个很简单的JMX Client做while循环取java.lang:type=OperatingSystem的CommittedVirtualMemorySize。发现简单的客户端也出错,便用修改JMX Client为两种方式,一种是在while循环里面try catch(也就是说当取失败之后仍然继续调用MBean取属性),一种是try catch里面做while循环,也就是一旦取失败之后,整个JMX Client的Java就会退出了。猜测JConsole之所以停滞就是因为JConsole的机制是:一旦出现异常就不去获取了,也就是等同于我的简单Client在try catch里面做循环。

  2,简单的Client和jconsole都是连接到应用服务器实例的MBeanServer上的,jconsole的控制台报的错误就是连接的MBeanServer所在的JVM进程的错误,所以就重点查服务器实例(就是JConsole连接的MBeanServer所在的jvm进程)获取CommittedVirtualMemorySize的操作。

 

  看了JDK的代码之后

  3,知道UnixOperatingSystem的getCommittedVirtualMemorySize是个本地方法,再加上报Unable to open /proc/self/stat错误,感觉和操作系统可能有一点关系。就有做了一次压力测试,同时监控jconsole和服务器实例的日志,这一测试发现,在jconsole报错之前服务器实例报了一个"too many open files",这日志一看,就比较明了了,几乎可以肯定是与文件描述符显示有关系。

  4,继续再做压力测试的同时用命令监控文件句柄数量(while(true) do /usr/sbin/lsof -p $应用服务器java进程的pid | wc -l;sleep 1;done),发现这一数据有最初的140多飙升至1132左右之后,jconsole就会停止,服务器实例的日志也会把异常。就在1132数据的时候用(/usr/sbin/lsof -p $应用服务器java进程的pid > lsof.txt),查看输出的结果,发现http端口18080所占的端口的Socket连接达到991个,问题已经水落石出了,就是同一个进程占用的文件句柄数(Socket也算是文件句柄)超过了默认的1024.

 

  解决办法:

 1,修改/etc/security/limits.conf文件,在末尾增加一行,增大文件句柄限制数量,如下

 bes soft nofile 2000//四个数据依次是用户(可以使用*标识所有用户),类型(soft和hard两种),限制的属性(打开文件句柄数量/文件大小等等都可以限制),限制属性具体的值 ||||我这个配置的意思就是现实bes用户打开文件句柄最大为2000,这样1000个并发过来也没问题。

 2,网上说ulimit -Sn 2000类似的命令也可以,但是好像ulimit对用户限制较多,只有root用户才能修改nofile这个属性,并且ulimit命令修改的话只对当前用户有效。

  所以修改配置文件是比较好的解决方案。

 

  问题解决了,解决问题往往涉及到很多方面的知识,操作系统,编程语言,网络知识,甚至到数据库等等。要想成为高手,路还远。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Linux服务器中,文件句柄是内核用来管理文件的一个重要资源。当我们要处理大量的文件时,我们需要知道当前系统的文件句柄数,便于优化系统性能和管理文件。那么,如何查看当前服务器文件句柄数呢? 方法一:使用lsof命令 lsof命令在Linux服务器中十分常用,它可以查看系统当前打开的文件列表。通过使用该命令,我们可以查看当前所有打开的文件数量,从而得知系统文件句柄数。具体操作如下: 1.打开终端,输入以下命令: lsof | wc -l 2.回车后,就能看到当前系统的文件句柄数。 方法二:使用cat命令 cat命令可以显示文件内容,也可以显示一些系统文件的信息。我们可以通过cat命令查看/proc/sys/fs/file-max文件中定义的最大文件打开数,从而得知当前系统文件句柄数。具体操作如下: 1.打开终端,输入以下命令: cat /proc/sys/fs/file-max 2.回车后,就能看到当前系统的最大文件打开数。 3.如果要查看当前已打开的文件数量,可以输入以下命令: cat /proc/sys/fs/file-nr | awk '{ print $1 }' 4.回车后,就能看到当前已打开的文件数量。 综上所述,使用lsof和cat命令都可以查看Linux服务器文件句柄数。从以上两种方法可以看出,文件句柄是一个十分重要的资源。管理好文件句柄,可以让我们更好地了解服务器的运行情况,并优化服务器性能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值