Linux中Too many open files 问题分析和解决

今天某个服务的日志中出现了大量的异常:

[WARN ] 2018-06-15 16:55:20,831 --New I/O server boss #1 ([id: 0x55007b59, /0.0.0.0:20880])-- [org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink] [DUBBO] Failed to accept a connection., dubbo version: 2.8.3.2, current host: 127.0.0.1
java.io.IOException: Too many open files
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) ~[na:1.7.0_09-icedtea]
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:226) ~[na:1.7.0_09-icedtea]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink$Boss.run(NioServerSocketPipelineSink.java:244) ~[netty-3.2.5.Final.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [na:1.7.0_09-icedtea]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [na:1.7.0_09-icedtea]
at java.lang.Thread.run(Thread.java:722) [na:1.7.0_09-icedtea]
Too many open files这个问题主要指的是进程企图打开一个文件,或者叫句柄,但是现在进程打开的句柄已经达到了上限,已经无法打开新句柄了。

网上一提到这个问题就要增加句柄上限,而往往这种情况的发生是因为错误的使用了句柄,可以称作句柄泄漏,找到句柄达到上限的原因才是王道。

以下是Linux中句柄的介绍

Linux中所有的事物或资源都是以文件的形式存在,比如消息、共享内存、连接等,句柄可以理解为指向这些文件的指针。

对于这些句柄,Linux是有数量限制的,单个进程默认可以打开的句柄数上限,可以用以下命令来查看:

ulimit –a
执行结果如下:

其中的open files一项就是默认的句柄数,此时默认的句柄数是1024

还可以设置某个进程的句柄数上限,命令是:

ulimit –a PID
执行结果如下:

也是看open files一项,可以看到,该进程的句柄上限也是1024

这个句柄数是可以改的,修改默认的句柄数,命令如下:

ulimit –n 2000
这个命令可以把默认的句柄数改为2000,但系统重启后会恢复默认值

这个文件在系统中的默认值配置在/etc/security/limits.conf文件中,加入以下配置:

* soft nofile 2000
* hard nofile 2000
或者

* - nofile 2000
其中hard的设置是实际的默认值,也就是上限,而soft的配置只是用来警告的,如果超过了soft的值,会有warn,而第三种用短横线– 的配置,则是hard和soft同时配置的方式。

下面看一下如何查询系统中进程占用的句柄数

使用的命令是:

lsof -n|awk ‘{print $2}‘|sort|uniq -c|sort-nr|more
lsof命令是Linux中的一个系统监视命令,可以查看进程打开的文件、端口等,功能强大,上面的命令通过一串的管道后只保留了句柄数和PID,执行结果如下:

第一列是句柄数,第二列是进程id

可以看到前两个进程的句柄数已经超过上限了,这正是这两个进程的日志正在报文章最上方的异常。

下面查询某个进程都占用了一些什么样的句柄

比如查询PID为25950的进程,使用的命令是

lsof |grep 25950
执行结果如下:

这里是截取的一部分,每列的含义如下:

1,进程名称

2,PID

3,进程所有者

4,文件描述符

5,文件类型

文件类型有以下几种:

DIR:表示目录。

CHR:表示字符类型。

BLK:块设备类型。

UNIX: UNIX 域套接字。

FIFO:先进先出 (FIFO) 队列。

IPv4:网际协议 (IP) 套接字。

DEVICE:指定磁盘的名称

SIZE:文件的大小

NODE:索引节点(文件在磁盘上的标识)

NAME:打开文件的确切名称

在我查看的这个进程中,有异常大量的IPv4类型文件被打开,以此为线索可以分析出具体的句柄超限的原因。在文章最开始的例子中,是因为程序不停的对另一台服务器发起连接,导致句柄超上限(从异常信息中其实也能分析出来)。
————————————————
版权声明:本文为CSDN博主「lkforce」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lkforce/article/details/80710459

原文地址:https://www.cnblogs.com/surplus/p/11746642.html

时间: 2024-11-04 11:54:11

Linux中Too many open files 问题分析和解决的相关文章

Linux中npm出现npmlog找不到的解决方法

?Linux中npm出现npmlog找不到的解决方法 描述 今天在对nodejs项目进行服务器迁移的时,在新的linux服务器上输入 npm -v 命令后报 "cannot find module 'npmlog'-."的错误.找到的原因是拷贝过去的bin目录下的npm文件并没有链接到module目录下的npm-cli.js文件,所以导致在执行 npm -v 命令时,路径问题导致npmlog模块无法找到. 解决方法 解决的方法有两个,一个是删除bin目录下的npm文件,并用如下命令链接

linux中某个端口拒绝远程主机连接原因及解决方法

linux中某个端口拒绝远程主机连接原因及解决方法 问题描述: 比如在本机telent到192.168.8.170 主机的9000 端口,被拒绝. [[email protected] log]$ telnet 192.168.8.170 9000 Trying 192.168.8.170... telnet: connect to address 192.168.8.170: Connection refused 原因:原因有两个 一个是被防火墙拦截 或者该端口的监听地址为本机(127.0.0

Linux中ftp不能上传文件/目录的解决办法

在linux中不能上传文件或文件夹最多的问题就是权限问题,但有时也不一定是权限问题了,像我就是空间不够用了,下面我来总结一些ftp不能上传文件/目录的解决办法 在排除用户组和权限等问题后,最可能引起ftp下文件无法上传并经常被忽略的因素就是硬盘空间已满,而导致硬盘空间满的问题多数是日志文件所占用的,例如mysql的日志会在不知不觉中变得十分庞大,直至占满剩余的硬盘空间. 解决办法: 1.定期手动清理或使用脚本清理mysql日志或其他相关日志文件. 2.关闭mysql日志(不推荐) 上面是空间有问

Linux中syntax error near unexpected token 错误提示解决方法

Linux中syntax error near unexpected token ... 错误提示有一般有两种原因: 1)window和Linux下换行符不一致导致 window下的换行和Linux下的换行不同,如果将window下编写的代码文件上传到Linux下,容易出现该错误提示.可用 vi -b 文件名 或者cat -v 文件名命令查看,如果是游云换行符引起的,则每行后面有^M,这时只要将每个^M去掉即可. 2)Linux指令之间没有空格隔开

Linux中IO监控命令的使用分析

一篇不错的有关linux io监控命令的介绍和使用. 1.系统级IO监控 iostat iostat -xdm 1    # 个人习惯 %util         代表磁盘繁忙程度.100% 表示磁盘繁忙, 0%表示磁盘空闲.但是注意,磁盘繁忙不代表磁盘(带宽)利用率高 argrq-sz    提交给驱动层的IO请求大小,一般不小于4K,不大于max(readahead_kb, max_sectors_kb) 可用于判断当前的IO模式,一般情况下,尤其是磁盘繁忙时, 越大代表顺序,越小代表随机

Linux中的 inode以及 软硬链接分析

    一. inode 是什么?(索引节点)              理解inode 需要知道文件存储,文件是存储在硬盘上的,操作系统读取硬盘的时候会连续读取多个扇区(硬盘的最小存储单元),即一次性读取一个块(文件存取的最小单位).所以文件数据都存储在块中,便需要一个地方储存文件的管理信息.例如文件的创建者.文件的创建日期.文件的大小等等.这种储存文件管理信息的区域就叫做inode(索引节点).            二.  inode的内容            1.文件的字节数:    

Python错误提示:[Errno 24] Too many open files的分析与解决

背景 最近在工作中发现了一个错误,在执行多线程扫描脚本的时候频繁出现下面这个错误 HTTPConnectionPool(host='t.tips', port=80): Max retries exceeded with url: /index.php (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x7f29d4081150>: Failed to e

linux中iptables开启后pptp vpn拨号失败解决办法

公司现在用iptables作为局域网中的防火墙,上网没有问题.这次因为测试,需要连接pptp vpn .问题来了,vpn拨号一直失败,报619错误 .我用手机或者家里拨号都没有问题. 登陆路由器,把pptp那些支持都开了再试,结果不行. 再找iptables的原因,最后终于解决. 1.在iptables中添加允许1723端口和gre协议. 2.加载iptables中的几个模块,ip_nat_pptp ,ip_nat_proto_gre,ip_conntrack_pptp modprobe ip_

linux中统计排序的内容含有空白行的解决办法

废话不多说,直接上实例: 文件 sharkyun.log 的内容如下 [[email protected] ~]# cat -n sharkyun.log 1http://www.sharkyun.com/index.html 2http://www.sharkyun.com/index.shtml 3https://post.sharkyun.com/index.html 4https://mp3.sharkyun.com/index.html 5http://www.sharkyun.com