java.net.SocketException Too many open files解决方法

Posted on

java.net.SocketException Too many open files解决方法 糊涂虫

登录

登录 下次自动登录 夜深了! 2012年2月22日 星期三 潍坊oa-中硕为中小企业信息化提供解决方案

详细内容

CSS隐藏文字的方法

详细内容

PHP magic_quotes_gpc的详细使用方法

详细内容

phpweb修改分页信息,去掉 右下角的 首页 尾页信息

详细内容

现在的位置: 首页linux, lnmp>正文

RSS

上篇 下篇

java.net.SocketException: Too many open files解决方法

2011年12月06日 ⁄ linux, lnmp暂无评论 最近随着网站访问量的提高把web服务器移到linux下了,在移服务器的第二天,tomcat频繁的报

java.net.SocketException: Too many open files错误,错误日志达到了100多兆,郁闷了,windows上运行了很长

时间都没出现这个错误,后来才知道linux对进程的打开文件数是有限制的。

用命令ulimit -a查看

[root@test security]/# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 7168 virtual memory (kbytes, -v) unlimited [root@test security]/# 通过以上命令,我们可以看到open files 的最大数为1024

对于并发量比较大的网站这个限制是有些捉襟见肘的,所以我通过这个命令

ulimit -n 4096 把打开文件数的上限设为了4096,这下好了,项目又稳定了

没想到过两天后又重新出这个错误了,郁闷,两个小时报一次,报之后就挂掉了

在重新用ulimit -a查看,发现open files (-n) 1024 又变回了1024了,

报这个错误就在我那次登陆更新之后又报的,原来ulimit -n 4096 命令只能临时的改变open files 的值,当

重新登陆后又会恢复,所以需要永久设置open files 的值才行啊, 用ulimit -n 修改open files 总是不能保持。所以用下面一个简单的办法更好些。修改/etc/security/limits.conf 添加如下一行:

/* - nofile 1006154

修改/etc/pam.d/login添加如下一行

session required /lib/security/pam_limits.so

这次永久修改后程序就再没那个问题了,一直稳定运行。

另外遇到这个问题这后还需要检查我们的程序对于操作io的流是否在操作完之后关闭,这才是从最更本上的解决。


linux 上tomcat 服务器抛出socket异常“文件打开太多”的问题 java.net.SocketException: Too many open files at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384) at java.net.ServerSocket.implAccept(ServerSocket.java:450) at java.net.ServerSocket.accept(ServerSocket.java:421) at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60) at org.apache.tomcat.util.net.PoolTcpEndpoint.acceptSocket(PoolTcpEndpoint.java:407) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:70) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595)

原本以为是tomcat的配置或是应用本身的问题,"谷歌"一把后才发现,该问题的根本原因是由于系统文件资源的限制导致的。

具体可以参考http://www.bea.com.cn/support_pattern/Too_Many_Open_Files_Pattern.html 的说明。具体的解决方式可以参考一下: 1。ulimit -a 查看系统目前资源限制的设定。 [root@test security]/# umlimit -a -bash: umlimit: command not found [root@test security]/# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 7168 virtual memory (kbytes, -v) unlimited [root@test security]/# 通过以上命令,我们可以看到open files 的最大数为1024 那么我们可以通过一下命令修改该参数的最大值

  1. ulimit -n 4096 [root@test security]/# ulimit -n 4096 [root@test security]/# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 4096 pipe size (512 bytes, -p) 8 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 7168 virtual memory (kbytes, -v) unlimited

这样我们就修改了系统在同一时间打开文件资源的最大数,基本解决以上问题。

以上部分是查找网络上的解决方法。设置了之后段时间内有作用。

后来仔细想来,问题还是要从根本上解决,于是把以前的代码由认真地看了一遍。终于找到了,罪魁祸首。

在读取文件时,有一些使用的BufferedReader 没有关闭。导致文件一直处于打开状态。造成资源的严重浪费。

修改之后的简单代码如下: public void test(){ BufferedReader reader =null; try{ reader = 读取文件; String line = ""; while( ( ine=reader.readLine())!=null){ 其他操作 }

} catch (IOException e){
    System.out.println(e);
} finally{  
     if(reader !=null){
            try {
                reader.close();
            } catch (IOException e) {
                  e.printStackTrace();
            }
      }
}

}

返回

作者: 糊涂虫

该日志由 糊涂虫 于79 天前发表在linux, lnmp分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。 转载请注明: java.net.SocketException: Too many open files解决方法 | 糊涂虫+复制链接

【上篇】Linux系统利用Crontab命令实现定时重启 【下篇】中小型的软件公司发展模式总结

您可能还会对这些文章感兴趣!

  1. linux 挂装u盘
  2. linux干掉进程的方法
  3. Linux系统利用Crontab命令实现定时重启

中小型的软件公司发展模式总结

变成了有车一族了,纪念一下 (2011-06-04 17:03:55) PHP magic_quotes_gpc的详细使用方法

phpweb修改分页信息,去掉 右下角的 首页 尾页信息

给我留言

点击这里取消回复。 留言无头像?

昵称 /*

邮箱 /*

网址

正在提交, 请稍候...

/#

插入图片

使用新浪微博登陆

有人回复时邮件通知我

最活跃的读者

网站统计

日志总数:27篇

评论总数:11条

分类总数:14个

标签总数:0个

友情链接:1个

网站运行:210天 最后更新:2012年2月22日

返回首页

Copyright © 2011-2012 糊涂虫 保留所有权利. 基于WordPress 技术创建 Theme by Robin

×

新浪微博 腾讯微博

希望本站内容对您有点用处,有什么疑问或建议请在后面留言评论
转载请注明作者(RobinChia)和出处 It so life ,请勿用于任何商业用途