我有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攻击。
1条答案
按热度按时间qyzbxkaa1#
你应该增加文件描述符的大小。Ulimit本身是不够的。你应该在其他文件上应用一些更改。请参阅link