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

原创 2011年01月14日 22:06:00

  测试组同事做性能测试的时候,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命令修改的话只对当前用户有效。

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

 

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

相关文章推荐

linux 进程 文件句柄

应用程序在一直使用文件句柄,而不释放文件句柄时,可能导致文件句柄资源耗尽,当文件句柄 耗尽自后所用的打开/新建文件函数都会返回错误,open、create、fopen、popen、socket。 ...

遇到一个日志文件变化带来的文件句柄问题

正在进行的项目中有个系统调试日志存储的功能,需要存储打印信息。测试部反馈了一个bug:调试日志文件有时候不更新。对照代码,项目用的代码和之前项目的代码是一样的。感觉没什么问题,我自己测试没发现有不更新...
  • subfate
  • subfate
  • 2015年01月25日 17:47
  • 757

linux下线程创建失败问题

linux下线程创建失败问题 写个碰到的问题,记录下自己的技术之路点滴 pthread_detach(pthread_self()) linux线程执行和windows不同,pthread有两种状...

修改linux最大文件句柄数

大家知道在linux服务器大并发调优时,往往需要预先调优linux参数,其中修改linux最大文件句柄数是最常修改的参数之一。 在linux中执行ulimit -a 即可查询linux相关的参数,如...
  • xh16319
  • xh16319
  • 2016年09月14日 19:17
  • 1502

SUSE LINUX系统文件句柄限制的修改

转自:http://xjsunjie.blog.51cto.com/999372/684447 在SUSE Linux下部署应用的时候,有时会遇到“Socket/File: Can’t op...
  • hjwang1
  • hjwang1
  • 2012年05月28日 10:02
  • 1048

linux句柄泄露问题查看

背景: 我们在开发linux在线服务器的时候经常会遇会句柄泄露的问题。因为在linux系统设计里面遵循一切都是文件的原则,即磁盘文件、目录、网络套接字、磁盘、管道等,所有这些都是文件,在我们进行打开的...

基于Spring Boot、AngularJS、CSS3、HTML5的响应式文件浏览管理器

题记 我想大家应该都接触过文件管理系统,不管是Windows中的文件管理器还是基于浏览器的WEB文件管理器,功能大同小异。虽然文件管理器看似简单,但真正实现起来还有点繁琐,特别是界面这一块,最近...

MQTT和spring的整合(生产者)

消息发送,这边不算是和spring完美结合,有同学那边有好的案例的话 ,希望能共享下.谢谢 =================================================...

tomcat环境下服务器文件句柄耗尽(Too Many Open Files)的问题排查

转载注明出处,谢谢~http://blog.csdn.net/shootyou  前段时间帮助公司解决了一次tomcat环境服务器的异常,今天有时间过来总结一下。 问题的表现:tomcat服务在重启之...
  • shootyou
  • shootyou
  • 2011年07月01日 11:48
  • 22670

linux 打开文件句柄数

首先可以通过ulimit –a 命令来查看 如下: Redhat系统 [root@120lg_3 ut]# ulimit -a core file size        (b...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux文件句柄不足导致服务器僵死
举报原因:
原因补充:

(最多只允许输入30个字)