媒资系统Too many open files异常

今天遇到两个问题,在系统运行时间太长的情况下,会出现:

严重: Socket accept failed
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:453)
at java.net.ServerSocket.accept(ServerSocket.java:421)
at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:61)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:310)
at java.lang.Thread.run(Thread.java:619)

的异常,经过查询,问题出在linux中,即使socket也是占用文件句柄的,在大并发访问下,如果系统设置的open files数目太小,JVM就会抛出java.net.SocketException: Too many open files异常。

在几个并发用户连接到服务器之后通常会发生此问题。Java 打开许多文件,以便读取运行应用程序所必需的类。大量应用程序会使用许多文件描述符,这会导致缺乏新的文件描述符。同样,每个新的套接字都需要一个描述符。客户端和服务器通过 TCP 套接字进行通信。在与服务器建立连接时,每个浏览器的 http 请求都使用 TCP 套接字。

一定要首先监视文件描述符并了解这些诊断方法如何告知您有关打开文件的状态和其它潜在问题。在针对操作系统逐步执行此故障排除部分之后,可能有必要增加文件描述符的数量.

解决办法:

1.中策:ulimit -n 32768 扩大ulimit -a的open file限制,一般是1024

2.注意是否在BufferReader中有打开但是没有close的,如果有的话时间长了会占用文件句柄但是不释放,导致问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要解决"too many open files"的问题,可以从两个方面入手:修改系统配置和从程序层面解决。 首先,我们可以尝试修改系统的配置信息。根据引用所述,Linux系统维护了一个open files table来记录当前打开的文件信息,这个表有一个最大容量限制。如果超过这个限制,系统会拒绝其他文件操作并报错"Too many open files"。因此,我们可以通过修改系统配置来增加open files table的容量。 具体来说,可以通过修改Linux系统的文件描述符限制来提高open files table的容量。可以使用命令ulimit来查看和修改文件描述符限制。首先,使用ulimit -n命令查看当前文件描述符的限制。然后,根据实际需求,可以使用ulimit -n <new_limit>命令将文件描述符限制设置为一个较大的值。 除了修改系统配置,我们还可以从程序层面解决这个问题。引用提到,要复现这个问题通常需要一定的业务量和运行一段时间,才能达到系统的阈值。因此,我们可以通过优化程序的资源管理来避免打开过多的文件。 可以尝试以下几种方法来解决这个问题: 1. 确保在程序中正确关闭所有打开的文件。在程序运行结束或不再需要打开的文件时,及时关闭文件。 2. 使用文件池或缓存来管理文件的打开和关闭。通过维护一个固定大小的文件池,在需要访问文件时,从池中获取可用的文件句柄,使用完毕后将文件句柄放回池中。 3. 优化程序的资源使用。检查程序中是否存在资源泄漏或重复打开文件的情况,及时释放不再使用的资源。 综上所述,要解决"too many open files"的问题,可以通过修改系统配置来增加open files table的容量,以及从程序层面优化资源管理来避免打开过多的文件。这样可以提高系统的稳定性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值