Too many open files 问题处理一例

本文通过举例介绍了在Linux系统中遇到'Too many open files'错误时,如何使用'lsof'命令检查Java进程的文件描述符详细信息及总数,以进行问题排查。
摘要由CSDN通过智能技术生成



       今天同事在测试CentOS系统中进行程序测试时,遇到一个问题:
       同事编写一个程序,配置在两台服务器上,一个作为服务器端,一个作为客户端,程序运行时,客户端会向服务器发起连接;
       程序执行后,会打开5万多个文件,这时再次用一个其他客户端连接CentOS系统就会提示“Too many open files”错误而不能连接;
       执行 losf | wc -l  命令查看当前系统所有的进程打开文件数时,显示为 :51000;
       执行 ulimit -a 命令查看当前系统的所有用户限制时,发现其中的“open files”限制为 51200,这时程序打开的文件数基本上已经达到了open files的限制,所以再有会话数连接到系统,就会由于不能打开新的文件而提示错误;
       于是将用户打开文件数限制调大, 修改/ect/security/limits.conf,添加如下信息:
* soft nofile 512000
* hard nofile 512000
       使用  reboot 命令重启系统,使参数配置生效,然后使用 ulimit -a 命令查看,open files限制已经修改为 512000 了。

       再次启动程序,打开了5万多会话数后,使用一个客户端连接还是会提示“too many open files”错误而不能连接;
       但是如果用一个root用户连接CentOS系统,是可以连接的,说明除了 ulimit 的用户限制外,还有其他的open files限制,造成了这种情况。
       后来经过查询确认,open files限制有两种,上面修改的是用户级open files限制,还有系统级open files限制,使用下面命令查看:
# cat /proc/sys/fs/file-max 
51200
# sysctl -a | grep fs.file-max 
fs.file-max = 51200
       原来虽然修改了 /etc/security/limit.conf 中的用户限制,但系统限制还是51200,所以文件打开数大了之后,新的会话还是不能连接。
       于是采用下面的方面修改参数:
打开系统配置文件,vim /etc/sysctl.conf ,
将其中的“fs.file-max                    = 51200”
修改为“fs.file-max                    = 512000”
       然后使用 sysctl -p 命令,通知系统改参数已经修改,确认系统级的open files参数也已经修改了。
       再次打开程序验证,就没有再出现 “too many open files”的错误,程序可以正常运行了。

**********************************

附:网上一则对“too many open files”问题进行说明的文章:

运行在Linux系统上的Java程序可能会出现"Too many open files"的异常情况,且常见于高并发访问文件系统,多线程网络连接等场景。 

        程序经常访问的文件、socket在Linux中都是文件file,系统需要记录每个当前访问file的name、location、access authority等相关信息,这样的一个实体被称为file entry。“open files table”(图中橙色标识)存储这些file entry,以数组的形式线性管理。文件描述符(file descriptor)作为进程到open files table的指针,也就是open files table的下标索引,将每个进程与它所访问的文件关联起来了。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值