spring - 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 攻击一样。
解决方案
您应该增加文件描述符的大小。ulimit 本身是不够的。您应该对其他一些文件应用一些更改。看到这个链接
推荐阅读
- reactjs - 404 错误:无法使用 django rest 框架提供静态反应构建,除非我去 /index.html
- reactjs - 如何使实用程序功能可用于所有组件
- pyarrow - 使用类似于 pandas 阅读器功能的 pyarrow 读取大型压缩 json 文件
- angular - Angular 9 Ivy 已禁用,但未定义文档中的错误
- python - 减少 matplotlib 中 log-log 子图的 bin 数量
- serenity-platform - 宁静平台;LocalText.Get("Db.something") 使用特定语言而不是所选语言?
- assembly - 使用 CPUID 指令了解 C 的编译器 mov [mem]、reg 指令
- reactjs - undefined 不是 react-native 中的对象(评估'context._context')
- css - 在不使用 flex-col 的情况下对齐 2 个元素
- reactjs - React-admin 在 List 中创建对话框