#每日一记#第8天 Linux进程打开文件数太多(too many open files)
  

牵网线的 6495人觉得有帮助

{{ttag.title}}
一、产生原因
too many open files(打开的文件过多)是Linux系统中常见的错误,从字面意思上看就是说程序打开的文件数过多,不过这里的files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端口等等,所以有时候也可以叫做句柄(handle),这个错误通常也可以叫做句柄数超出系统限制。
引起的原因就是进程在某个时刻打开了超过系统限制的文件数量以及通讯链接数,通过命令ulimit -a可以查看当前系统设置的最大句柄数是多少:
  1. [tomcat@localhost bin]$ ulimit -a
  2. core file size          (blocks, -c) 0
  3. data seg size           (kbytes, -d) unlimited
  4. scheduling priority             (-e) 0
  5. file size               (blocks, -f) unlimited
  6. pending signals                 (-i) 14732
  7. max locked memory       (kbytes, -l) 64
  8. max memory size         (kbytes, -m) unlimited
  9. open files                      (-n) 1024
  10. pipe size            (512 bytes, -p) 8
  11. POSIX message queues     (bytes, -q) 819200
  12. real-time priority              (-r) 0
  13. stack size              (kbytes, -s) 10240
  14. cpu time               (seconds, -t) unlimited
  15. max user processes              (-u) 1024
  16. virtual memory          (kbytes, -v) unlimited
  17. file locks                      (-x) unlimited
复制代码

open files那一行就代表系统目前允许单个进程打开的最大句柄数,这里是1024。
使用命令lsof -p 进程id可以查看单个进程所有打开的文件详情,使用命令lsof -p 进程id | wc -l可以统计进程打开了多少文件:
  1. [tomcat@localhost bin]$ jps
  2. 3092 Bootstrap
  3. 3197 Jps
  4. [tomcat@localhost bin]$ lsof -p 3092 | wc -l
  5. 108
复制代码
以裸启动的tomcat为例,可以看到它目前打开了108个文件数,如果文件数过多使用lsof -p 进程id命令无法完全查看的话,可以使用lsof -p 进程id > openfiles.log将执行结果内容输出到日志文件中查看。


二、解决方法
1、增大允许打开的文件数——命令方式
  1. ulimit -n 2048
复制代码

这样就可以把当前用户的最大允许打开文件数量设置为2048了,但这种设置方法在重启后会还原为默认值。
ulimit -n命令非root用户只能设置到4096。
想要设置到8192需要sudo权限或者root用户。

2、增大允许打开的文件数——修改系统配置文件
  1. vim /etc/security/limits.conf  
  2. #在最后加入  
  3. * soft nofile 4096  
  4. * hard nofile 4096  
复制代码

或者只加入
  1. * - nofile 8192
复制代码

最前的 * 表示所有用户,可根据需要设置某一用户,例如
  1. roy soft nofile 8192  
  2. roy hard nofile 8192
复制代码

注意”nofile”项有两个可能的限制措施。就是项下的hard和soft。 要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用”-“字符设定, 则hard和soft设定会同时被设定。

3、检查程序问题
如果你对你的程序有一定的解的话,应该对程序打开文件数(链接数)上限有一定的估算,如果感觉数字异常,请使用第一步的lsof -p 进程id > openfiles.log命令,获得当前占用句柄的全部详情进行分析,
  • 打开的这些文件是不是都是必要的?
  • 定位到打开这些文件的代码
  • 是否程序操作了文件写入,但是没有进行正常关闭
  • 是否程序进行了通讯,但是没有正常关闭(也就是没有超时结束的机制)



如果程序中存在这些问题的话,无论系统句柄数设置的多么大,随着时间的推移,也一定会占用完。

打赏鼓励作者,期待更多好文!

打赏
3人已打赏

点线网 发表于 2022-7-13 12:48
  
楼主分享的案例很实用,具有典型性,希望有更多这样的干货供我们学习参考,非常感谢!
平凡的小网工 发表于 2022-7-14 10:47
  
楼主分析的很详细,不错的实战经验,小白用户一看就懂,非常好的技术干货帖,顶一个!
一个无趣的人 发表于 2022-7-14 10:54
  
楼主的文章图文并茂,清晰易懂,看完这波操作可以轻松上手了,如遇到问题再向楼主请教~
点线网 发表于 2022-7-20 14:42
  

楼主分析的很详细,不错的实战经验,小白用户一看就懂,非常好的技术干货帖,顶一个!
好懒 发表于 2023-3-30 11:29
  
楼主,是你让我深深地理解了‘人外有人,天外有天’这句话。谢谢你!在看完这帖子以后,我没有立即回复,因为我生怕我庸俗不堪的回复会玷污了这社区少有的帖子。但是我还是回复了,因为觉得如果不能在如此精彩的帖子后面留下自己的网名,那我会遗憾终生的!
天青色 发表于 2023-5-15 10:47
  
楼主的文章图文并茂,清晰易懂,看完这波操作可以轻松上手了,如遇到问题再向楼主请教~
发表新帖
热门标签
全部标签>
每日一问
2024年技术争霸赛
技术盲盒
技术笔记
干货满满
产品连连看
信服课堂视频
自助服务平台操作指引
每周精选
2023技术争霸赛专题
技术咨询
GIF动图学习
新版本体验
秒懂零信任
标准化排查
信服圈儿
功能体验
安全攻防
技术晨报
在线直播
通用技术
问题分析处理
每日一记
社区帮助指南
安装部署配置
运维工具
终端接入
天逸直播
以战代练
齐鲁TV
畅聊IT
答题自测
专家问答
技术圆桌
MVP
网络基础知识
升级
上网策略
测试报告
日志审计
流量管理
云计算知识
用户认证
原创分享
解决方案
sangfor周刊
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
SDP百科
功能咨询
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
加速技术
排障笔记本
产品预警公告
玩转零信任
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
深信服技术支持平台
答题榜单公布
纪元平台
卧龙计划
华北区拉练
山东区技术晨报
文档捉虫活动
华北区交付直播
北京区每日一练

本版版主

12
185
6

发帖

粉丝

关注

本版达人

LoveTec...

本周分享达人

新手24116...

本周提问达人