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

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Window Server2016加入AD域的方法步骤

《WindowServer2016加入AD域的方法步骤》:本文主要介绍WindowServer2016加入AD域的方法步骤,包括配置DNS、检测ping通、更改计算机域、输入账号密码、重启服务... 目录一、 准备条件二、配置ServerB加入ServerA的AD域(test.ly)三、查看加入AD域后的变

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

Python中使用defaultdict和Counter的方法

《Python中使用defaultdict和Counter的方法》本文深入探讨了Python中的两个强大工具——defaultdict和Counter,并详细介绍了它们的工作原理、应用场景以及在实际编... 目录引言defaultdict的深入应用什么是defaultdictdefaultdict的工作原理

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写