ignite - 已检测到阻塞的系统关键线程
问题描述
我正在使用 Ignite.NET 2.7.6。有来自一台服务器和大约 40 个客户端的配置。工作 8 小时后,服务器开始出现奇怪的行为:客户端无法连接,某些查询没有结果等。
在服务器端,内存消耗还可以,线程数在 250 左右,一切正常。我没有看到任何问题,所以我决定解决服务器端标记为严重的所有问题。
我遇到的第一个是:
已检测到阻塞的系统关键线程。这可能导致集群范围的未定义行为 [threadName=tcp-comm-worker, blockedFor=13s]
所以我想了解发生这种情况的原因。完整的服务器日志可以在这里找到:
https://yadi.sk/d/LF03Vz5vz4tRcw
https://yadi.sk/d/MMe0xrgI3k6lkA
补充: 这个问题似乎不是无害的,这个消息每秒都会从各个线程出现,“blockedFor”值从几秒增加到几小时。
服务器上的负载很低,但随着服务器的线程被锁定,它会停止响应和注册新客户端。
以下是来自服务器的日志:
https://yadi.sk/d/tc3g2hb9B0jtvg
https://yadi.sk/d/05YrlYXcp4xPqg
这是来自一位客户的日志:
https://yadi.sk/d/bcbQ7ee4PUzq2w
客户端日志的最后一行是在 19:03:52,服务器重新启动时。
解决方案
正如 Denis 所描述的,存在很多网络通信问题。
一般来说,客户端想要执行一些缓存操作,但是来自条带池的服务器线程被阻塞了很长时间。我认为它与.NET 部分无关。
您可以看到以下消息:
[18:53:04,385][SEVERE][tcp-disco-msg-worker-#2][G] Blocked system-critical thread has been detected. This can lead to cluster-wide undefined behaviour [threadName=sys-stripe-7, blockedFor=13s]
如果你看一下线程:
hread [name="sys-stripe-7-#8", id=28, state=WAITING, blockCnt=51, waitCnt=3424]
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(Unknown Source)
at o.a.i.i.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:178)
at o.a.i.i.util.future.GridFutureAdapter.get(GridFutureAdapter.java:141)
at o.a.i.spi.communication.tcp.TcpCommunicationSpi.reserveClient(TcpCommunicationSpi.java:2911)
at o.a.i.spi.communication.tcp.TcpCommunicationSpi.sendMessage0(TcpCommunicationSpi.java:2713)
at o.a.i.spi.communication.tcp.TcpCommunicationSpi.sendMessage(TcpCommunicationSpi.java:2672)
at o.a.i.i.managers.communication.GridIoManager.send(GridIoManager.java:1656)
at o.a.i.i.managers.communication.GridIoManager.sendOrderedMessage(GridIoManager.java:1879)
at o.a.i.i.processors.continuous.GridContinuousProcessor.sendWithRetries(GridContinuousProcessor.java:1904)
at o.a.i.i.processors.continuous.GridContinuousProcessor.sendWithRetries(GridContinuousProcessor.java:1875)
at o.a.i.i.processors.continuous.GridContinuousProcessor.sendWithRetries(GridContinuousProcessor.java:1857)
at o.a.i.i.processors.continuous.GridContinuousProcessor.sendNotification(GridContinuousProcessor.java:1275)
at o.a.i.i.processors.continuous.GridContinuousProcessor.addNotification(GridContinuousProcessor.java:1212)
线程正在尝试发送连续查询回调,但未能建立与客户端节点的连接。这会导致线程被阻塞,并且它不能为需要相同分区的其他缓存 API 请求提供服务。
乍一看,你可以尝试减少#clientFailureDetectionTimeout
,默认是 30 秒。但这不会完全解决网络问题。
推荐阅读
- node.js - 如何重用 graphQl 解析器
- javascript - 样式化组件 v5.3 createGlobalStyles 不起作用
- multithreading - 为什么这会抛出 java.lang.IllegalMonitorStateException
- tensorflow - 连接两个相同维度的输出层
- c# - 通过 context.MergedJobDataMap 使用 JobChainingJobListener 在作业之间传递数据
- python - 使用python从pdf中提取特定数据到excel
- latex - (页)MS Word 文档 - 在 LaTeX 而不是 MathML 中导出方程?
- node.js - 在移动浏览器上对 toastify return 的错误做出反应
- node.js - 使用 papaparse 忽略 csv 文件的标题
- sql - 在同一个表中分组和连接行 - SQLite