设为首页 收藏本站
查看: 2240|回复: 0

[经验分享] Too_many_open_files_问题的解决

[复制链接]

尚未签到

发表于 2019-1-26 13:44:25 | 显示全部楼层 |阅读模式
  
在Linux下,我们使用ulimit -n 命令可以看到单个进程能够打开的最大文件
句柄数量
(socket
连接也算在里面
)
。系统默认值
1024

    对于一般的应用来说(Apache、系统进程)1024完全足够使用。但是如何象squidmysqljava等单进程处理大量请求的应用来说就有点捉襟见肘了。如果单个进程打开的文件句柄数量超过了系统定义的值,就会提到“too many files open”的错误提示。如何知道当前进程打开了多少个文件句柄呢?下面一段小脚本可以帮你查看:


  • lsof -n |awk      '{print $2}'|sort|uniq -c |sort -nr|more   
在系统访问高峰时间以root用户执行上面的脚本,可能出现的结果如下:


  • # lsof -n|awk      '{print $2}'|sort|uniq -c |sort -nr|more   
  •     131      24204  
  •      57      24244  
  •      57      24231  
  •      56      24264  
其中第一行是打开的文件句柄数量,第二行是进程号。得到进程号后,我们可以通过ps命令得到进程的详细内容。


  • ps -aef|grep      24204  
  • mysql    24204      24162 99 16:15 ?        00:24:25      /usr/sbin/mysqld  
哦,原来是mysql进程打开最多文件句柄数量。但是他目前只打开了131个文件句柄数量,远远底于系统默认值1024。

但是如果系统并发特别大,尤其是squid服务器,很有可能会超过1024。这时候就必须要调整系统参数,以适应应用变化。Linux有硬性限制和软性限制。可以通过ulimit来设定这两个参数。方法如下,以root用户运行以下命令:


  • ulimit -HSn      4096  
以上命令中,H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量。个人觉得最好不要超过4096,毕竟打开的文件句柄数越多响应时间肯定会越慢。设定句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,可以修改.bash_profile文件,可以修改 /etc/profile 把上面命令加到最后。(findsun提出的办法比较合理)

=================================================================================

Too many open files经常在使用linux的时候出现,大多数情况是您的程序没有正常关闭一些资源引起的,所以出现这种情况,请检查io读写,socket通讯等是否正常关闭。

如果检查程序没有问题,那就有可能是linux默认的open files值太小,不能满足当前程序默认值的要求,比如数据库连接池的个数,tomcat请求连接的个数等。。。

查看当前系统open files的默认值,可执行:




  • [root@pororo script]# 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) 128161  
  • max locked      memory        (kbytes, -l) 32  
  • max memory      size          (kbytes, -m)      unlimited   
  • open      files                            (-n) 800000  
  • pipe      size                  (512 bytes, -p) 8  
  • POSIX message      queues      (bytes, -q) 819200  
  • real-time      priority                    (-r) 0  
  • stack      size                    (kbytes, -s) 10240  
  • cpu      time                     (seconds, -t) unlimited   
  • max user      processes                    (-u) 128161  
  • virtual      memory                (kbytes, -v) unlimited   
  • file      locks                            (-x) unlimited  


如果发现open files项比较小,可以按如下方式更改:

1. 检查/proc/sys/fs/file-max文件来确认最大打开文件数已经被正确设置。




  • # cat      /proc/sys/fs/file-max  


如果设置值太小,修改文件/etc/sysctl.conf的变量到合适的值。这样会在每次重启之后生效。 如果设置值够大,跳过这一步。




  • # echo 2048 > /proc/sys/fs/file-max  


编辑文件/etc/sysctl.conf,插入下行:




  • fs.file-max =      8192  


2.
在/etc/security/limits.conf文件中设置最大打开文件数, 下面是一行提示:




  • #                     


添加如下这行:




  • * - nofile 8192  


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

硬限制表明soft限制中所能设定的最大值。 soft限制指的是当前系统生效的设置值。 hard限制值可以被普通用户降低。但是不能增加。 soft限制不能设置的比hard限制更高。 只有root用户才能够增加hard限制值。

当增加文件限制描述,可以简单的把当前值双倍。 例子如下, 如果你要提高默认值1024, 最好提高到2048, 如果还要继续增加, 就需要设置成4096。

最后用ulimit -a再次查看,open files的值,没什么问题的话,就已经改过来了。







关于can't identify protocol问题定位

问题定位步骤:
1、 用root帐户 遍历 /proc/进程ID/fd目录,如果该目录下文件数比较大(如果大于10,一般就属于socket泄漏),根据该进程ID,可以确认该进程ID所对应的名称。
2、 重启程序恢复服务,以便后续查找问题。
3、 strace 该程序并记录strace信息。strace –p 进程ID >>/tmp/stracelog.log 2>&1
4、 查看 /proc/进程ID/fd 下的文件数目是否有增加,如果发现有增加,记录上一个socket编号,停止strace
5、 确认问题代码的位置。打开/tmp/stracelog.log,从尾部向上查找close(socket编号)所在行,可以确认在该次close后再次创建的socket没有关闭,根据socket连接的server ip可以确认问题代码的位置。

另一种方法:判断是否有socket泄漏:
lsof | grep "can't identify protocol"
如果存在很多,则代表socket泄漏,同时会显示哪个进程使用的sock未关闭。











运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-667856-1-1.html 上篇帖子: Linux开源监控平台 下篇帖子: Open for
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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