too many open files是Linux系统中常见的错误,从字面意思上看就是说程序打开的文件数过多,不过这里的files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端口等等,所以有时候也可以叫做句柄(handle),这个错误通常也可以叫做句柄数超出系统限制。
       引起的原因就是进程在某个时刻打开了超过系统限制的文件数量以及通讯链接数,通过命令ulimit -a可以查看当前系统设置的最大句柄数是多少.

我是用java的websocket,然后连到4000左右服务端就报这个错误了。然后通过 ulimit -HSn 10000 命令修改连接数.

 

Linux JAVA服务端报 Too many open files 错误


进行修改,修改后,需要重新系统 。

通过jps查看进程ID

Linux JAVA服务端报 Too many open files 错误

 查看当前进程占用多少个连接数  lsof -p 1714 | wc -l 

Linux JAVA服务端报 Too many open files 错误

当以为没问题的时候,发现客户端又报错了 No buffer space available (maximum connections reached?): connect

Linux JAVA服务端报 Too many open files 错误

解决思路:
这个问题困扰了我很久,tomcat一启动,就开始报这个错。导致网站也访问不了。网上很多人说关闭防火墙什么的,重装jdk什么的都试过,没用。其实认真看一下报错日志,说的是:No buffer space available 想想应该是window中有什么大的链接没有关闭导致空间不足。查一查,果然,进程都结束了,依然后很多TIME_WAIT状态的连接未释放,再查看所有的time_wait连接。

解决过程:
1.cmd—>regedit 进入注册表

2.进入 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters

3.新建 DWORD 类型的注册表项,命名为:MaxUserPort

4.值数据(双击MaxUserPort提示输入值): 60000(用十进制的格式录入进去,此值的有效范围为5000-65534)

5.新建 DWORD 类型的注册表项,命名为:TCPTimedWaitDelay

6.值数据: 30(TIME_WAIT的自动断开时间,默认为4分钟);

通过以上几步操作,重新启动tomcat。问题不复现,开心!!!!

结论:
由于大量的TIME_WAIT连接未被释放,导致占用的端口资源一直未被回收,出现了缓冲区空间不足的问题,应用也总是自动断线。

重新电脑后,发现不生效。。。

 

相关文章: