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 使用队列依次进行操作,阻止并发数超过最大限制 是一个不错的考虑方向

posted on 2020-11-09 17:59  评论有风险起名需谨慎  阅读(156)  评论(0编辑  收藏  举报