zoukankan      html  css  js  c++  java
  • too many open files(打开的文件过多)解决方法

    一、产生原因

    too many open files(打开的文件过多)是Linux系统中常见的错误,从字面意思上看就是说程序打开的文件数过多,不过这里的files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端口等等,所以有时候也可以叫做句柄(handle),这个错误通常也可以叫做句柄数超出系统限制。
    引起的原因就是进程在某个时刻打开了超过系统限制的文件数量以及通讯链接数,通过命令ulimit -a可以查看当前系统设置的最大句柄数是多少:

    ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 256976
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 1024
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    real-time priority              (-r) 0
    stack size              (kbytes, -s) 8192
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 256976
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited

    open files那一行就代表系统目前允许单个进程打开的最大句柄数,这里是1024。 
    使用命令lsof -p 进程id可以查看单个进程所有打开的文件详情,使用命令lsof -p 进程id | wc -l可以统计进程打开了多少文件:

     ps -e | grep palo
    14735 pts/1    00:01:05 palo_be
    lsof -p 14735 | wc -l
    348

    可以看到它目前打开了108个文件数,如果文件数过多使用lsof -p 进程id命令无法完全查看的话,可以使用lsof -p 进程id > openfiles.log将执行结果内容输出到日志文件中查看。

    二、解决方法

    1、增大允许打开的文件数——命令方式

    ulimit -n 2048

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

    2、增大允许打开的文件数——修改系统配置文件

    vim /etc/security/limits.conf  
    #在最后加入  
    * soft nofile 4096  
    * hard nofile 4096  

    或者只加入

    * - nofile 8192

    最前的 * 表示所有用户,可根据需要设置某一用户,例如

    roy soft nofile 8192  
    roy hard nofile 8192  

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

    3、检查程序问题

    如果你对你的程序有一定的解的话,应该对程序打开文件数(链接数)上限有一定的估算,如果感觉数字异常,请使用第一步的lsof -p 进程id > openfiles.log命令,获得当前占用句柄的全部详情进行分析,

    1)打开的这些文件是不是都是必要的?
    2)定位到打开这些文件的代码
    3)是否程序操作了文件写入,但是没有进行正常关闭
    4)是否程序进行了通讯,但是没有正常关闭(也就是没有超时结束的机制)

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

  • 相关阅读:
    Python之路【第十九篇】:前端CSS
    大数据之路【第十五篇】:数据挖掘--推荐算法
    大数据之路【第十四篇】:数据挖掘--推荐算法(Mahout工具)
    Python之路【第十八篇】:前端HTML
    大数据之路【第十三篇】:数据挖掘---中文分词
    大数据之路【第十二篇】:数据挖掘--NLP文本相似度
    Python之路【第十七篇】:Python并发编程|协程
    Python之路【第十六篇】:Python并发编程|进程、线程
    大数据之路【第十篇】:kafka消息系统
    Python之路【第十五篇】开发FTP多线程程序
  • 原文地址:https://www.cnblogs.com/lenmom/p/9773093.html
Copyright © 2011-2022 走看看