首页 > 解决方案 > WebSockets 是否会触发 IOException:打开的文件过多?

问题描述

我有 spring-boot(版本:2.2.1.Release)应用程序。该应用程序有一个计划任务(称为Task-A),它向第三个 api 发出大量请求,有时可能会关闭。此外,应用程序有一个打开的 WebSocket,以便客户端可以检查某些进程的实时状态。Web 套接字具有以下配置:

@Configuration
@EnableWebSocketMessageBroker
@EnableWebSocket
class WebSocketConfig : WebSocketMessageBrokerConfigurer {


    override fun registerStompEndpoints(registry: StompEndpointRegistry) {

        registry.addEndpoint("/ws/activity")
                .setAllowedOrigins("origin-from-where-connection-to-socket-comes.com")
                .withSockJS()
    }
} 

还有第二个计划任务(称为Task-B)每 5 秒将客户端信息写入套接字:

@Component
class ChargersScheduled
@Autowired constructor(
        private val processMonitor: ProcessMonitor,
        private val messagingTemplate: SimpMessagingTemplate
) {

    @Scheduled(fixedDelay = 5000)
    fun getSchedulersActivity () {
        messagingTemplate.convertAndSend("/web-socket/activity", processMonitor.checkActivity())
    }

}

在某个时间点Task-A开始发出IOException : Too many open files,一两分钟后的日志开始填充:

o.a.t.u.n.Acceptor                       : Socket accept failed
java.io.IOException: Too many open files
        at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
        at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
        at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
        at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:461)
        at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:73)
        at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:95)
        at java.lang.Thread.run(Thread.java:748)

这是由于客户端尝试连接到 WebSocket 或向服务器发出简单请求,还是两者兼而有之?除了增加ulimit(已经完成)之外,缓解问题的方法是什么?至于现在我不得不重新启动应用程序,因为它挂起,好像它受到 DDOS 攻击一样。

标签: springspring-boottomcatwebsocketspring-websocket

解决方案


您应该增加文件描述符的大小。ulimit 本身是不够的。您应该对其他一些文件应用一些更改。看到这个链接


推荐阅读