too many open files是Linux系统中常见的错误,从字面意思上看就是说程序打开的文件数过多,不过这里的files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端口等等,所以有时候也可以叫做句柄(handle),这个错误通常也可以叫做句柄数超出系统限制。
引起的原因就是进程在某个时刻打开了超过系统限制的文件数量以及通讯链接数,通过命令ulimit -a可以查看当前系统设置的最大句柄数是多少.
我是用java的websocket,然后连到4000左右服务端就报这个错误了。然后通过 ulimit -HSn 10000 命令修改连接数.
进行修改,修改后,需要重新系统 。
通过jps查看进程ID
查看当前进程占用多少个连接数 lsof -p 1714 | wc -l
当以为没问题的时候,发现客户端又报错了 No buffer space available (maximum connections reached?): connect
解决思路:
这个问题困扰了我很久,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连接未被释放,导致占用的端口资源一直未被回收,出现了缓冲区空间不足的问题,应用也总是自动断线。
重新电脑后,发现不生效。。。
lsof –i:9999 中的9999为被占用的sockete服务端口号。
lsof –i:9999 > 1.txt 将结果保存成文件下载
netstat -anp |grep 9999 也是可以查看端口的连接
netstat -ano|findstr 7084 Windows下查看
cat wens1-error.log | grep '84194002109497341' -C 2 搜索指定内容 前后两行
zcat *.gz | grep '87722344004230482' -C 2 搜索所有.gz文件的内容
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 查看nginx的连接数量参照 :查看 nginx 的并发连接数 - 阳光小白 - 博客园
netstat -anop | grep PID 根据进程编号查看端口号
ss -tunlp ss 是新的 netstat,命令选项大致相同。它缺少一些 netstat 功能,但暴露了更多的 TCP 状态,而且速度稍快。