spring WebSocket是否触发IOException:打开的文件太多?

dw1jzc5e  于 2023-02-18  发布在  Spring
关注(0)|答案(1)|浏览(188)

我有Spring Boot(版本:2.2.1.Release)应用程序。该应用程序有一个调度任务(称为Task-A),该任务向第三个API发出了大量请求,偶尔可能会出现宕机。该应用程序还打开了一个Web Socket,以便客户端可以查看某个进程的实时状态。Web Socket具有以下配置:

@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)

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

qyzbxkaa

qyzbxkaa1#

你应该增加文件描述符的大小。Ulimit本身是不够的。你应该在其他文件上应用一些更改。请参阅link

相关问题