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

[经验分享] 日志抛出大量Too Many Open Files的异常

[复制链接]

尚未签到

发表于 2019-1-27 13:02:04 | 显示全部楼层 |阅读模式
  转自:https://blog.csdn.net/shootyou/article/details/6579139
  一、问题的表现:
  tomcat服务在重启之后,短时间内会承受大量访问,由于这个时候缓存还没建立,每次访问都将消耗一定资源(数据库连接或者文件IO),
  并发量在2000左右的时候tomcat服务开始抛出大量Too Many Open Files的异常,主要是文件IO一块的异常,数据库连接池配置恰当就不会抛异常。
  二、问题分析:
  这是一个典型的文件句柄耗尽的异常,在linux里头“一切皆文件”,所以虽然提示“文件”打开太多,其实也有可能是socket打开太多或者设备打开太多。
  文件句柄是用来干嘛的?
  句柄当做一个人的名字,并"可以通过名字(句柄),实现对句子的引用和访问",感觉这种比喻好象贴近,但问题是可能有许多人叫同一个名字,但句柄所以有意义正因为它具有唯一性,
  所以这种比喻也有问题,如果换个说法,说句柄是表示你的进程与外界的i/o连接,把它当作是一个连接的名字是不是更恰当些? 文件句柄是一个十六位长度的二进制代码(Windows95后为32位无符号整数),
  代表一个已被打开文件的通道号,借助于这个句柄,你的应用程序即可使用这个相应的句柄对文件进行随意存取操作,说白了文件句柄其实是一串代表着特殊含义的号码;
  当然其实系统是用句柄与一些资源联系起来的,当由系统管理,动态分配给你应用程序的某些资源的代号,你就可以使用句柄访问相应的资源了,尤其在Windows系统中,有很多东东都使用句柄,如窗口,socket。
  简单看来程序通过句柄获得资源的引用,来进行资源的打开和关闭的操作。
  为什么会出现文件句柄耗尽的情况?
  主要是因为linux在文件句柄的数目上有两个级别的限制。一个是系统级别的总数限制,一个是针对用户的限制。默认情况下每个用户所能使用的句柄数是1024。一般情况下1024也够用了,但是在大容量的系统上,特别是会频繁使用网络通信和文件IO的系统上,1024很快就被耗光了。所以首先我们要调整这个值。修改方法如下:
  1. ulimit -a 查看当前用户的文件句柄限制
  2. 用户级别的句柄数限制修改。
  (1)要使 limits.conf 文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中。查看 /etc/pam.d/login 文件中有:
session required /lib64/security/pam_limits.so  (2)Linux更改最大连接数.
  解决办法:解除 Linux 系统的最大进程数和最大文件打开数限制:
vi /etc/security/limits.conf  
*                soft    nproc          655350
  
*                hard    nproc          655350
  
*                soft    nofile         655350
  
*                hard    nofile         655350
  用户名(或者用*表示所有用户),有两种限制,一种是soft软限制,在数目超过软限制的时候系统会给出warning警告,但是达到hard硬限制的时候系统将拒绝或者异常了。
  3、sysctl -p并退出shell。不过最好重启服务器,要不有些占用的不会释放。重启完成后ulimit -n验证。
  4. 系统级别的句柄数限制修改。
sysctl -w fs.file-max 65536  
或者
  
echo "65536" > /proc/sys/fs/file-max
  两者作用是相同的,前者改内核参数,后者直接作用于内核参数在虚拟文件系统(procfs, psuedo file system)上对应的文件而已。
  可以用下面的命令查看新的限制
sysctl -a | grep fs.file-max  
或者
  
cat /proc/sys/fs/file-max
  修改内核参数
/etc/sysctl.conf  
echo "fs.file-max=65536" >> /etc/sysctl.conf
  
sysctl -p
  查看系统总限制 命令:cat /proc/sys/fs/file-max
  查看整个系统目前使用的文件句柄数量命令:cat /proc/sys/fs/file-nr
  查看某个进程开了哪些句柄 :lsof -p pid
  某个进程开了几个句柄 :lsof -p pid |wc -l
  也可以看到某个目录 /文件被什么进程占用了,显示已打开该目录或文件的所有进程信息 :lsof path/filename
  具体这个值应该设置成多少?
  优先级(Open File Descriptors):
  soft limit < hard limit < kernel < 实现最大file descriptor数采用的数据结构所导致的限制
  其实这个值倒是没有具体限制,但是分配的值如果太大反而会影响系统性能,所以要根据具体应用调配权衡。



运维网声明 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-668257-1-1.html 上篇帖子: Workaround for Java 8u131 “attempted to open sandb 下篇帖子: error while loading shared libraries: libssl.so.6: cannot open shared object fil
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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