记一次奇怪的文件句柄泄露问题

打印 上一主题 下一主题

主题 883|帖子 883|积分 2649

记录并分享一下最近工作中遇到的 Too many open files 异常的解决过程。
问题背景

产品有个上传压缩包并导入配置信息到数据库中的功能,主要流程如下:

  • 用户上传压缩包;
  • 后端解压存放在临时目录,并返回列表给用户;
  • 用户选择需要导入哪些信息;
  • 后端按需插入数据库中,完成后删除临时目录。
这个功能上线两三年了,一直没出现问题,最近测试在功能回归时,导入的时候出现Too many open files异常。
但是通过lsof -p pid | wc -l查看当前进程打开的句柄数时,又是正常的。
Too many open files是Linux系统中常见的错误,字面意思就是说打开了太多的文件,超过了系统的限制。
这里的文件(file)更准确的意思是文件句柄,或者是文件描述符。可以说,Linux系统里的一切都是文件,包括网络连接、端口等等。
lsof -p pid命令可以查看指定进程当前打开的文件信息。wc -l命令指按行统计。
问题分析

当时的第一反应是该系统的文件句柄数配置的太低了,因为在其他环境都是正常的。
通过ulimit -a命令,可以查看当前系统对各种资源的限制。
  1. [uyong@linuxtest ~]# 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) 31767
  7. max locked memory       (kbytes, -l) 64
  8. max memory size         (kbytes, -m) unlimited
  9. open files                      (-n) 4096
  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) 8192
  14. cpu time               (seconds, -t) unlimited
  15. max user processes              (-u) 31767
  16. virtual memory          (kbytes, -v) unlimited
  17. file locks                      (-x) unlimited
复制代码
open files 那行就是表示打开的文件数限制,即一个进程最多可以同时打开的文件数。
也可以通过ulimit -n直接查看最大打开文件数量。
当时查出来的配置是4096,查看其他没问题的环境上的配置,数量都是远远大于这个数。而且系统重新启动后,没做任何操作时,通过lsof -p pid | wc -l查看文件占用,只有100多个。在好的环境上执行导入成功后,再次查看,文件占用数不变。在有问题的环境上导入失败后,查看文件占用数也是不变。
虽然当时的压缩包文件很大,但4096按说也够的。有点奇怪,为了不影响测试进度,只能先临时修改系统配置,增大文件数限制,ulimt -n 65535命令执行后,再次导入没问题了。
命令ulimit -n 65536只能临时临时调整文件数量,系统重启后配置就会失效。
如果要永久生效,需要在配置文件/etc/security/limits.conf里增加如下两行:
  1. * soft nofile 65536
  2. * hard nofile 65535
复制代码

问题到此就结束了吗,NO
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表