在服务器端,内存消耗正常,线程量约为250个,看起来一切正常。我没有看到任何问题,所以我决定解决服务器端标记为严重的所有问题。
我遇到的第一个是:
检测到阻塞的系统关键线程。这可能导致群集范围内的未定义行为[threadname=tcp-comm-worker,blockedfor=13s]
https://yadi.sk/d/mme0xrgi3k6lka
补充:这个问题似乎不是无关紧要的,这个消息每秒钟从不同的线程中出现,“blockedfor”值从秒增加到小时。
服务器上的负载很低,但是当服务器的线程被锁定时,它将停止响应和注册新的客户端。
https://yadi.sk/d/bcbq7ee4puzq2w
客户端日志的最后一行是19:03:52,服务器重新启动时。
在其他异常中,我看到了以下。NET特定的异常,但它应该是由另一个问题触发的。不管怎样,这一条是上报给社区的。
class org.apache.ignite.IgniteException: Platform error:System.NullReferenceException: Ññûëêà íà îáúåêò íå óêàçûâàåò íà ýêçåìïëÿð îáúåêòà.
â Apache.Ignite.Core.Impl.Unmanaged.UnmanagedCallbacks.CacheEntryFilterApply(Int64 memPtr)
â Apache.Ignite.Core.Impl.Unmanaged.UnmanagedCallbacks.InLongOutLong(Int32 type, Int64 val)
at org.apache.ignite.internal.processors.platform.PlatformProcessorImpl.loggerLog(PlatformProcessorImpl.java:404)
at org.apache.ignite.internal.processors.platform.PlatformProcessorImpl.processInStreamOutLong(PlatformProcessorImpl.java:460)
at org.apache.ignite.internal.processors.platform.PlatformProcessorImpl.processInStreamOutLong(PlatformProcessorImpl.java:512)
at org.apache.ignite.internal.processors.platform.PlatformTargetProxyImpl.inStreamOutLong(PlatformTargetProxyImpl.java:67)
at org.apache.ignite.internal.processors.platform.callback.PlatformCallbackUtils.inLongOutLong(Native Method)
at org.apache.ignite.internal.processors.platform.callback.PlatformCallbackGateway.cacheEntryFilterApply(PlatformCallbackGateway.java:143)
at org.apache.ignite.internal.processors.platform.cache.PlatformCacheEntryFilterImpl.apply(PlatformCacheEntryFilterImpl.java:70)
at org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$InternalScanFilter.apply(GridCacheQueryManager.java:3139)
第一个例外与网络级别的通信问题有关。见下文:
java.io.IOException: Óäàëåííûé õîñò ïðèíóäèòåëüíî ðàçîðâàë ñóùåñòâóþùåå ïîäêëþ÷åíèå
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(Unknown Source)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source)
at sun.nio.ch.IOUtil.read(Unknown Source)
at sun.nio.ch.SocketChannelImpl.read(Unknown Source)
at org.apache.ignite.internal.util.nio.GridNioServer$DirectNioClientWorker.processRead(GridNioServer.java:1282)
at org.apache.ignite.internal.util.nio.GridNioServer$AbstractNioClientWorker.processSelectedKeysOptimized(GridNioServer.java:2386)
at org.apache.ignite.internal.util.nio.GridNioServer$AbstractNioClientWorker.bodyInternal(GridNioServer.java:2153)
at org.apache.ignite.internal.util.nio.GridNioServer$AbstractNioClientWorker.body(GridNioServer.java:1794)
at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:120)
at java.lang.Thread.run(Unknown Source)
[18:46:12,846][WARNING][grid-nio-worker-tcp-comm-0-#48][TcpCommunicationSpi] Closing NIO session because of unhandled exception [cls=class o.a.i.i.util.nio.GridNioException, msg=Óäàëåííûé õîñò ïðèíóäèòåëüíî ðàçîðâàë ñóùåñòâóþùåå ïîäêëþ÷åíèå]
[18:46:13,861][WARNING][tcp-comm-worker-#1][TcpCommunicationSpi] Connect timed out (consider increasing 'failureDetectionTimeout' configuration property) [addr=/127.0.0.1:47101, failureDetectionTimeout=10000]
[18:46:14,893][WARNING][tcp-comm-worker-#1][TcpCommunicationSpi] Connect timed out (consider increasing 'failureDetectionTimeout' configuration property) [addr=BB-SRV-DELTA/169.254.40.231:47101, failureDetectionTimeout=10000]
看起来,服务器或某些客户机在10秒内不会对心跳或其他网络请求做出反应。还要检查客户端节点的日志。您可能需要扩展集群,添加更多服务器以实现负载平衡,或者调整FailureDetectionTimeou
。
检测到阻塞的系统关键线程...
错误消息无关紧要,但令人困惑。我重新开始了下面的对话。
检测到[严重][tcp-disco-msg-worker-#2][G]阻塞的系统关键线程。这可能导致群集范围内未定义的行为[threadname=partition-exchanger,blockedfor=10s][12:32:21,772][严重][tcp-disco-msg-worker-#2][]检测到严重系统错误。将相应地处理配置的处理程序[hnd=stopnodeorhaltfailu
我有一个由6个节点组成的Apache Ignite集群。偶尔,在运行几个小时后,日志中会记录一些如下所示的异常,节点会停止。我不在受影响的服务中使用事件处理程序或pub/sub处理程序。什么会导致这些例外?在这些错误消息中总是提到“分区-交换器”线程,这意味着什么吗? 我在Kubernetes管理的Linux容器上使用Apache Ignite for.NET V2.7。谢谢!
在Java中,线程可以有不同的状态: 新建、可运行、阻止、等待、定时等待、终止 但是,当线程被IO阻塞时,其状态为“RUNNABLE”。我如何判断它是否被IO阻止?
我不明白以下几点: 用户级线程需要非阻塞系统调用,即多线程内核。否则,整个进程将在内核中阻塞,即使进程中还有可运行的线程。 内核线程如何处理阻塞系统调用?在用户级线程中,当一个线程进行阻塞系统调用(例如读取)时,为什么其他线程不能继续工作?
从进程调度谈起 现代操作系统(如 Windows、Linux 等)都是分时系统。分时系统允许同时允许多个任务,但实际上,由于一台计算机通常只有一个 CPU,所以不可能真正地同时运行多个任务。这些进程实际上是轮番运行,每个进程运行一个时间片。由于时间片通常很短,用户不会感觉到,所以这些进程看起来就像是同时运行。 每个进程的时间片由操作系统完成初始化,所有进程轮番地执行相应的时间。具体下一个时间片轮到
我们正在对网络套接字使用阻塞系统I/O调用。我们想要的行为是当对套接字调用时,阻塞调用需要返回并抛出一个异常(引用), 看看OpenJDK,这就是它的实现方式。它使用用户信号唤醒阻塞线程。相应的信号处理程序是no-op。在阻塞调用之前,它注册可能被阻塞的线程。当关闭文件描述符时,关闭线程向阻塞的I/O线程发送信号,这导致阻塞调用返回。 不过,我还是认为下面的代码块源代码中存在一个潜在的竞争条件: