Linux打开文件夹一直失败,Linux常见系统故障:“Too many open files”错误与解决方法...

本文主要是介绍Linux打开文件夹一直失败,Linux常见系统故障:“Too many open files”错误与解决方法...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原标题:Linux常见系统故障:“Too many open files”错误与解决方法

1、问题现象

这是一个基于的应用系统,在后台添加数据时提示无法添加,于是登录查看Tomcat日志,发现如下异常信息:

java.io.IOException: Too many open files

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

[www@tomcatserver ~]$ ulimit -n

65535

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

2、解决思路

这个案例涉及下ulimit命令的使用,这里简单介绍下ulimit的作用和使用技巧。ulimit主要用来限制对资源的使用情况,它支持各种类型的限制,常用的有:

●内核文件的大小限制。

●数据块的大小限制。

创建文件大小限制。

●可加锁内存大小限制。

●常驻内存集的大小限制。

●打开文件句柄数限制。

●分配堆栈的最大大小限制。

●CPU占用时间限制用户最大可用的数限制。

●所能使用的最大虚拟内存限制。

ulimit使用的基本格式为:

ulimit [options] [limit]

具体的ulimit参数(即options)含义如表1所示。

3ae8aa9cf13937caf576f16f273f6999.png

表1 ulimit参数的含义

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

(1)在用户环境变量中加入

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

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

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

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

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

有时候为了方便起见,也可以将用户资源的限制统一由一个文件来配置,这个文件就是/etc/security/limits.conf,该文件不但能对指定用户的资源进行限制,还能对指定组的资源进行限制。该文件的使用规则如下:

其中:

●domain表示用户或用户组的名字,还可以使用“*”作为通配符,表示任何用户或用户组。

●type表示限制的类型,可以有两个值:soft和hard,分别表示软、硬资源限制。

●item表示需要限定的资源名称,常用的有nofile、cpu、stack等。分别表示最大打开句柄数、占用的CPU时间、最大的堆栈大小。

●value表示限制各种资源的具体数值。

除了limits.conf文件之外,还有一个/etc/security/limits.d目录,可以将资源限制创建一个文件放到这个目录中,系统默认会首先读取这个目录下的所有文件,然后才去读取limits.conf文件。在所有资源限制设置完成后,退出终端,再次登录终端后,ulimit设置即可自动生效。

3、解决问题

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

[root@tomcatserver ~]# cat /etc/security/limits.conf|grep www

www soft nofile 65535

www hard nofile 65535

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

[root@tomcatserver ~]# more /etc/issue

CentOS release 6.3 (Final)

Kernel r on an m

[root@tomcatserver ~]# uptime

15:10:19 up 283 days, 5:37, 4 users, load average: 1.20, 1.41, 1.35

[root@tomcatserver ~]# pgrep –f tomcat

4667

[root@tomcatserver ~]# 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天零5个半小时了,接着继续看看limits.conf文件的修改时间,操作如图1所示。

图1 查看limits.conf文件的最后修改时间

通过stat命令可以很清楚地看出,limits.conf文件最后的修改时间是2013-07-12,通过查问相关的 Linux 系统管理人员,基本确认就是在这个时候添加的ulimit资源限制,这样此案例的问题就很明确了。由于ulimit限制的添加时间晚于Tomcat最后一次的启动时间,而在此期间内,Tomcat服务一直未重启过, 操作系统 也一直未重启过,那么ulimit资源限制对于Tomcat来说始终是不生效的,同时,由于此 操作系统 是CentOS 6.3,系统默认的最大可用句柄数是1024,java进程采用的是 Linux 默认的这个值,因此出现“Too many open files”的错误也是合乎情理的。

清楚问题之后,解决问题的方法非常简单,重启Tomcat服务即可。返回搜狐,查看更多

责任编辑:

这篇关于Linux打开文件夹一直失败,Linux常见系统故障:“Too many open files”错误与解决方法...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/567417

相关文章

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3