Too many open files :
代表着当前进程 占用的文件总数 超过了操作系统的限制,导致无法打开新的文件. 所以才会有这样的异常以及错误
如何解决?
linux 下:
使用 ulimit -a 主要关注 open_file 字段
在linux下 默认的 每个进程可以占用的最大文件句柄数为 1024 .
临时修改:
临时修改在机器重启之后失效:
ulimit -n 2048
# ps: 执行当前命令需要 相应的权限
# ps: 单个进程所占用的最大文件句柄数并非越多越好
一劳永逸:
修改 limits.conf 配置文件
vi /etc/security/limits.conf
# 修改内容如下:
soft nofile 65536 # 软限制
hard nofile 65536 # 硬限制
# 修改后重新登录 并核查
ulimit -a
附: 如何查看某运行中进程所占用的文件句柄数:
首先查询进程的PID :
ps -u username
# username 指的是 启动程序的用户名称, 即查询某个用户启动的所有进程
# or
ps -ef |grep name
# name 指的是进程名称 , 即根据进程名称查询PID
# 以上为示例 , 查询PID 的方式多种多样, 只要得到你需要的PID 即可
然后使用 具有权限的用户 (ps: 如果能够申请到root 最好) 进行查询某个进程的句柄数:
cd /proc/PID/fd
# PID 指的是 上面查询出来的进程id
ls -l | wc
# 查询进程已占用的句柄总数
当然操作文件并发导致文件句柄数 超出系统限制,在代码设计层面也要进行优化, 毕竟 一个进程如果并发太多的文件会导致程序运行缓慢, 如果可以将文件操作的任务分担出去, or 使用队列依次进行操作,阻止并发数超过最大限制 是一个不错的考虑方向