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

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系