首页 > 解决方案 > 已检测到阻塞的系统关键线程

问题描述

我正在使用 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,服务器重新启动时。

标签: ignite

解决方案


正如 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 秒。但这不会完全解决网络问题。


推荐阅读