致前辈:该问题的解决思路给了我很大的启发,文章作者Lis, Linux资深技术专家。

  问题现象:这是一个基于Java的web应用系统,在后台添加数据时提示无法添加,于是登陆服务器查看Tomcat 日志,发现如下异常信息,java.io.IOException:too many open files

 通过这个报错信息,基本判断是系统可以使用的文件描述符不够了,由于Tomcat服务系统www用户启动的,于是以www 用户登陆系统,通过ulimit -n 命令查看系统可以打开最大文件描述符的数量:

$ ulimit -n

65535

可以看到这台服务器设置的最大可以打开的文件描述符已经是65535了,这么大的值应该够用了,但是为什么提示这样的错误呢?

解决思路,这个案例涉及ulimit 命令的使用

在使用ulimit 时,有以下几种使用方法:

  1.在用户环境变量中加入

如果用户使用的是bash,那么可以在用户目录的环境变量文件.bashrc或者.bash_profile中加入 ulimit -u 128 来限制用户最多可以使用128个进程

  2.在应用程序的启动脚本中加入

如果应用程序是Tomcat, 那么可以再Tomcat 的启动脚本startup.sh 中加入 ulimit -n 65535 来闲置用户最多可以使用65535个文件描述符

  3.直接在shell命令终端执行ulimit 命令

这种方法的资源限制仅仅在执行命令的终端生效,在退出或者和关闭终端后,设置失效,并且这个设置不影响其他shell 终端

解决问题:

  在了解ulimit 知识后,接着上面的案例,既然ulimit 设置没有问题,那么一定是设置没有生效导致的,接下来检查下启动 Tomcat 的 www 用户环境变量是否添加 ulimit 限制,检查后发现,www 用户并无ulimit限制。于是继续检查Tomcat 启动脚本startup.sh 文件是否添加了 ulimit限制,检查后发现也没有添加。最后考虑是否将限制加到了limits.conf文件中,于是检查limits.conf 文件,操作如下

#cat /etc/security/limits.conf | grep www

www soft nofile 65535

www hard nofile 65535

从输出可知,ulimit限制加在limits.conf文件中,既然限制已经添加了,配置 也没有什么错,为何还会报错,经过思考,判断只有一种可能,那就是Tomcat 的启动时间早于ulimit 资源限制的添加时间,于是首先查看下Tomcat 启动时间,操作如下

#uptime

Up 283 days

#pgrep -f tomcat

4667

#ps -eo pid, lstart, etime | grep 4667

4667 Sat Jul 6 09;33:39 2013 77-05:26:02

从输出可以看出,这台服务器已经有283天没有重启了,而Tomcat 是在2013年7月6号9点启动的,启动了将近77天,接着看看limits.conf文件的修改时间,

#stat /etc/security/limits.conf

通过stat 命令清楚的看到,limits.conf文件最后的修改时间是2013年7月12日,晚于Tomcat启动时间,如此,重启Tomcat之后问题解决。

  感悟:排查问题的思路清晰,循序渐进,最出彩的是排错过程中对各种细节的把握,服务的启动时间与配置文件的修改时间,这个细节让我很是受益,不亏是老运维出来的扎实功底。再敬 前辈。

Too many open files错误与解决方法的更多相关文章

  1. 运维实战案例之“Too many open files”错误与解决方法

    运维实战案例之"Too many open files"错误与解决方法   技术小甜 2017-11-16 15:02:00 浏览869 服务器 shell tomcat 脚本 o ...

  2. 启动android程序和虚拟机时候出现如下错误的解决方法

    启动android程序和虚拟机时候出现如下错误的解决方法. 错误重现: [2011-07-13 16:22:48 - Emulator] invalid command-line parameter: ...

  3. 编程中遇到的Python错误和解决方法汇总整理

    这篇文章主要介绍了自己编程中遇到的Python错误和解决方法汇总整理,本文收集整理了较多的案例,需要的朋友可以参考下   开个贴,用于记录平时经常碰到的Python的错误同时对导致错误的原因进行分析, ...

  4. CentOS 安装hping3工具及安装遇到的错误及解决方法

    hping是用于生成和解析TCPIP协议数据包的开源工具.创作者是Salvatore Sanfilippo.目前最新版是hping3,支持使用tcl脚本自动化地调用其API.hping是安全审计.防火 ...

  5. Eclipse启动时发生An internal error occurred during: "Initializing Java Tooling".错误的解决方法

    问题描述: Eclipse启动时发生An internal error occurred during: "Initializing JavaTooling".错误的解决方法 解决 ...

  6. GCC-4.6.3编译linux2.6.32.12内核出现“重复的成员‘page’”错误的解决方法

    使用gcc4.6.3编译linux2.6.32.12内核出现错误如下: In file included from drivers/net/igbvf/ethtool.c:36:0: drivers/ ...

  7. Linux系统Vsftp 传文件出现 553 Could Not Create File错误的解决方法

    解决方法: 登录出现了这个错误提示:553 Could not create file SELinux设置如下 查看SELinux设置 [root@localhost ~]# getsebool -a ...

  8. [转]权限问题导致Nginx 403 Forbidden错误的解决方法

    权限问题导致Nginx 403 Forbidden错误的解决方法 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-08-22 这篇文章主要介绍了权限问题导致Nginx 403 F ...

  9. ueditor上传大容量视频报http请求错误的解决方法

    故障现象: 当使用百度编辑器ueditor上传大容量视频或大容量图片的时候,编辑器报"http请求错误"的解决方法详解: 原因分析: 目前很多CMS整合了百度的ueditor编辑器 ...

随机推荐

  1. shell脚本显示当前主机系统信息

    编写脚本/root/bin/systeminfo.sh, 当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小. vim /root/bin/system ...

  2. Django的MVT的思路

    1.先上两张图片 2.我的理解 view在MVT框架里面,起到的是中间调度的作用. a.在diango里面有个关键性路径的配置 就是在django2.0前的url和在2.0后的path. 为避免一个项 ...

  3. Eclipse易卡死

    在用eclipse编辑项目的时候,经常卡死,经过查询知道原来是我的JDK和eclipse版本对应的不好,我们都知道,eclipse的环境需要配置. 当时情况是这样的 2.容易出现卡死或者如图所示的情况 ...

  4. PHP获取当月天数,获取当月的每天的开始和结束的时间戳,获取当月每号

    由于经常要写导单和数据分析功能,所以要获取什么时间的数据,想什么当天,周,年,月之类的时间格式都很好获取.我今天在这里为大家提供的是当月每天的开始和结束的时间格式. 希望能帮到大家!!! # 获取当月 ...

  5. go字符串操作

    在Go语言标准库中的strings和strconv两个包可以对字符串做快速处理 string包 func Contains(s, substr string) bool 字符串s中是否包含substr ...

  6. Git安装配置(Linux)

    使用yum安装Git yum install git -y 编译安装 # 安装依赖关系 yum install curl-devel expat-devel gettext-devel openssl ...

  7. PTA基础编程题目集7-1厘米换算英尺英寸

    如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048.现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸 ...

  8. HCA数据下载

    HCA data downloads HCA data downloads PeRl` 还记得去年看的时候还是什么都没有,今年已经有数据可以下载了.

  9. Verilog_Day3

    内容为书中第5章 条件语句 条件语句必须在过程块语句中使用.所谓过程块语句是指由 initial 和 always 语句引导的执行语句集合.除这两种块语句引导的begin_end块中可以编写条件语句外 ...

  10. 【blockly教程】第二章 Blockly编程基础

    2.1 Blockly的数据类型 2.1.1 数据的含义  在计算机程序的世界里,程序的基本任务就是处理数据,无论是数值还是文字.图像.图形.声音.视频等信息,如果要在计算机中处理的话,就必须将它们转 ...