1.解决办法

(1)查看

查看当前系统打开的文件数量

lsof | wc -l 
watch "lsof | wc -l"

查看某一进程的打开文件数量

lsof -p pid | wc -l 
lsof -p 1234 | wc -l

该问题最大的可能是打开的文件或是socket没有正常关闭。为了定位问题是否由Java进程引起,通过Java进程号查看当前进程占用文件描述符情况:

lsof -p $java_pid  # 每个文件描述符的具体属性 
lsof -p $java_pid | wc -l   # 当前Java进程file descriptor table中FD的总量

排序查看当前进程打开了多少句柄数

lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more

(2)系统级

系统级设置对所有用户有效。可通过以下方式查看系统最大文件限制

  • cat /proc/sys/fs/file-max  # file-max是设置系统所有进程一共可以打开的文件数量。
  • sysctl -a  # 查看结果中fs.file-max这项的配置数量
  • /etc/security/limits.conf
    • * soft noproc 102400
    • * hard noproc 102400
    • * soft nofile 102400
    • * hard nofile 102400
    • 注意:* 表示所有用户,可根据需要设置某一用户
  • vim /proc/19800/limits  # 查看某个进程允许的参数

(3)用户级

Linux限制每个登录用户的可连接文件数。可通过ulimit -n来查看当前有效设置。如果想修改这个值就使用 ulimit -n <setting number> 命令。
对于文件描述符增加的比例,资料推荐是以2的幂次为参考。如当前文件描述符数量是1024,可增加到2048,如果不够,可设置到4096,依此类推。

2.文件句柄是用来干嘛的?

句柄是表示你的进程与外界的i/o连接,文件句柄是一个十六位长度的二进制代码(Windows95后为32位无符号整数),代表一个已被打开文件的通道号,借助于这个句柄,你的应用程序即可使用这个相应的句柄对文件进行随意存取操作,说白了文件句柄其实是一串代表着特殊含义的号码; 当然其实系统是用句柄与一些资源联系起来的,当由系统管理,动态分配给你应用程序的某些资源的代号,你就可以使用句柄访问相应的资源了,尤其在Windows系统中,有很多东东都使用句柄,如窗口,socket。

简单看来程序通过句柄获得资源的引用,来进行资源的打开和关闭的操作。

3.为什么会出现文件句柄耗尽的情况?

主要是因为linux在文件句柄的数目上有两个级别的限制。一个是系统级别的总数限制,一个是针对用户的限制。默认情况下每个用户所能使用的句柄数是1024。一般情况下1024也够用了,但是在大容量的系统上,特别是会频繁使用网络通信和文件IO的系统上,1024很快就被耗光了。所以首先我们要调整这个值。

最新文章

  1. ActiveMQ2
  2. Sublime Text2 javascript格式化插件JsFormat
  3. 41、javaMail机制
  4. 6to5 – 让你即刻体验 ECMAScript 6 编程
  5. 【BZOJ 2648】SJY摆棋子 &amp; 【BZOJ 2716】【Violet 3】天使玩偶
  6. Atitit.列表页面and条件查询的实现最佳实践(1)------设置查询条件and提交查询and返回json数据
  7. C#获取当前日期时间(转)
  8. how to reset mac root password
  9. hdu 2029
  10. [jPlayer] HTML5 Audio &amp; Video for jQuery
  11. Android--启动系统的剪切图像功能并返回结果
  12. java.util.logging.Logger使用详解
  13. mysql命中索引规律
  14. 华为Oj 找出字符串第一个出现一次的字符
  15. 使用ES6进行开发的思考
  16. linux串口编程(c)
  17. POPTEST学员就业面试题目!!!!!
  18. DATA VISUALIZATION – PART 2
  19. 《An Industrial-Strength Audio Search Algorithm》译文
  20. 获取mp3文件的采样率

热门文章

  1. Unity3D学习笔记——组件之Mesh(网格)
  2. struts2之constant 讲解 (转)
  3. MathType公式行距设置的方法
  4. 转:SSD详解
  5. iOS学习笔记(四)——iOS应用程序生命周期
  6. HDU4027(Can you answer these queries?)
  7. delphi 创建服务,安装与卸载服务
  8. A Universally Unique IDentifier (UUID) URN Namespace
  9. Nuxt使用scss
  10. python模块学习(三)