1、问题阐述:
too many open files:顾名思义即打开过多⽂件数。
不过这⾥的files不单是⽂件的意思,也包括打开的通讯链接(⽐如socket),正在监听的端⼝等等,所以有时候也可以叫做句柄(handle),这个错误通常也可以叫做句柄数超出系统。2、产⽣的原因:
经常在使⽤linux的时候出现,⼤多数情况是由于程序没有正常关闭⼀些资源引起的,所以出现这种情况,请检查io读写,socket通讯等是否正常关闭。3、经典案例:
很多项⽬上线不久运⾏了⼀段时间后,服务突然宕了,经检查⽇志,出现了too many open files 错误。
4、解决⽅案:
前奏:其实Linux是有⽂件句柄的,⽽且默认不是很⾼,⼀般都是1024,作为⼀台⽣产服务器,其实很容易就达到 这个数量,因此我们需要把这个值改⼤⼀些。我们可以⽤ulimit -n 来查看当前⽤户句柄数。那么这个1024是系统的,还是⽤户的呢。其实,这个是⽤户来的,完整的说法,应该是当前⽤户准备要运⾏的程序的。 1、这个是针对单个程序的
2、这个不会改变之前已经运⾏了的程序的 3、对这个值的修改,退出了当前的shell就会消失 因此出现这种问题有两种解决⽅式:
第⼀:增⼤⽂件句柄数。这种⽅式能及时解决问题,但是不能够彻底的解决问题,可以为彻底解决问题提供⼀定的时间保证。那么如何增⼤⽂件句柄数数呢?
如修改⽂件句柄数为65535,ulimit -n 65535.此时系统的⽂件句柄数为65535. 2)将ulimit 值添加到/etc/profile⽂件中(适⽤于有root权限登录的系统)
为了每次系统重新启动时,都可以获取更⼤的ulimit值,将ulimit 加⼊到/etc/profile ⽂件底部。 echo ulimit -n 65535 >>/etc/profile
source /etc/profile #加载修改后的profile ulimit -n #显⽰65535,修改完毕!
到此为⽌,你以为⼤功告成了么,其实不然,突然发现⾃⼰再次登录进来的时候,ulimit的值还是1024,这是为什么呢? ⽤户登录的时候执⾏sh脚本的顺序: /etc/profile.d/file /etc/profile /etc/bashrc
/mingjie/.bashrc
/mingjie/.bash_profile
由于ulimit -n的脚本命令加载在第⼆部分,⽤户登录时由于权限原因在第⼆步还不能完成ulimit的修改,所以ulimit的值还是系统默认的1024。所以想彻底改变这种问题,就必须做如下操作:修改/etc/security/limits.conf ⾥⾯有很详细的注释,⽐如 * soft nofile 2048 * hard nofile 32768
就可以将⽂件句柄统⼀改成软2048,硬32768 那么什么是软,什么是硬
硬是实际的,⽽软,是warnning,只会做出warning 这样就实实际际的增⼤了⽂件句柄数。
第⼆:分析句柄数,查找原因,这是解决问题最根本的办法。那么如何分析那,就需要⽤到lsof这个命令了(关于这个命令⼤家可以在⽹上学习学习)。
(1)统计各进程打开句柄数:lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr (2)统计各⽤户打开句柄数:lsof -n|awk '{print $3}'|sort|uniq -c|sort -nr (3)统计各命令打开句柄数:lsof -n|awk '{print $1}'|sort|uniq -c|sort -nr
就掌商通来说,通过命令分析发现是⼀个叫xmpp的东西打开的连接数居多,占到了单个进程总打开连接数的百分之⼋⼗以上,再仔细分析,xmpp是消息推送产⽣的连接,那么到这⾥问题⽐较明确了,接下来就是要分析为什么消息推送会打开如此多的⽂件句柄,且⼀直连着也不断开。这样问题就定位了。另外还有⼀些进程打开⽂件句柄数也⽐较多,这时你可以对⽐其他服务器,看是否其他服务器也是如此,以保证全⾯的解决问题。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务