当前位置: 首页 > 知识库问答 >
问题:

远程执行上的Hazelcast OperationTimeoutException

祁柏
2023-03-14

我正在AWS的3.6.6版本中运行一个5节点Hazelcast集群。我使用它作为工作负载分发器

IExecutorService
<T> void submit(Runnable  task,
              MemberSelector memberSelector,
              ExecutionCallback<T> callback)

API对我选择的成员执行任务。我不使用基于分区的平衡,因为不同的分区会有不同的权重。

世界协调时2019年7月3日10时54分01秒:

560000毫秒无响应。正在中止调用!调用{ServiceName='Hz:Impl:ExecutorService“,op=com.hazelcast.executor.impl.operations.MemberCallableTaskOperation{identityHash=1179024466,ServiceName='Hz:Impl:ExecutorService”,PartitionID=-1,ReplicaIndex=0,Callid=684145,InvocationTime=1562150679963(Wed Jul 03 10:44:39 UTC 2019),WaitTimeout=-1,CallTimeout=500000,Name=exec_Service_3},备份-预期:0备份-已完成:0,执行时间:3445毫秒

堆栈跟踪:

at com.hazelcast.spi.impl.operationservice.impl.Invocation.newOperationTimeoutException(Invocation.java:536) ~[anodot-arnorld-1.0-SNAPSHOT.jar:na]
    at com.hazelcast.spi.impl.operationservice.impl.IsStillRunningService$IsOperationStillRunningCallback.setOperationTimeout(IsStillRunningService.java:241)
    at com.hazelcast.spi.impl.operationservice.impl.IsStillRunningService$IsOperationStillRunningCallback.onResponse(IsStillRunningService.java:229)
    at com.hazelcast.spi.impl.operationservice.impl.InvocationFuture$1.run(InvocationFuture.java:127)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_121]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:76) [anodot-arnorld-1.0-SNAPSHOT.jar:na]
    at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:92)
    at ------ End remote and begin local stack-trace ------.(Unknown Source) ~[na:na]
    ... 8 frames truncated

异常出现的时机相当诡异:

July 3rd 2019, 10:53:57.956 - task submitted for execution by sending instance
July 3rd 2019, 10:53:58.024 - execution starts on target instance
July 3rd 2019, 10:54:01.391 - the sending instance receives the exception

在我的日志中,我看到超时发生在任务提交后不久,异常的“execution take:”部分非常精确,在引用的例子中,从任务发送到执行的时间大约是3.5秒。另一方面,引用大小写中的“invocationtime”(Wed Jul 03 10:44:39 UTC 2019)大约是过去的10分钟,甚至在作业实际提交执行之前(Jul 3日,2019年10:53:57 UTC)

我看到过这种异常被归因于长时间的GC暂停,但由于我一直在监视GC,所以我非常肯定情况并非如此。此外,集群成员之间的网络看起来相当活跃,延迟很低。

从我在Hazelcast代码中看到的情况来看,“invocationTime”取自“clusterClock”,而不是直接取自系统时间,这意味着由于某种原因集群时钟会延迟10分钟,但我不明白为什么会出现这种情况。集群很忙,但当这个异常开始发生时,我没有看到任何异常的负载激增。当我取下整个集群,然后重新启动它时,问题就消失了。我计划增加对集群时间的监视,以查看它何时开始漂移,但它仍然无法解释为什么会发生这种情况。有什么想法吗?

更新:简而言之,集群时间随着时间的推移而偏离系统时间,一旦间隔足够大,任务就会以超时异常开始失败。详情:https://github.com/hazelcast/hazelcast/issues/15339

共有1个答案

韩智明
2023-03-14

最后,通过将Hazelcast版本升级到3.12.11(4.x.x中断了太多内容)解决了这个问题,看起来集群时间的管理方式对GC暂停并不敏感。一些API被破坏了,需要在代码中进行调整,没有太严重的问题。一个警告说明,3.6.6与3.12.11不兼容,因此无法进行滚动集群升级。我们做了一个完整的集群重启,幸运的是,这是可能的。

 类似资料:
  • 问题内容: 我正在Ubuntu上用python编写程序,以在RaspberryPi上执行命令,并与网络连接。 有人可以指导我该怎么做吗? 问题答案: 当然,有几种方法可以做到! 假设您在主机上安装了Raspberry Pi,并且用户名是。 这是运行命令的默认Python库。 您可以使其运行并在远程服务器上执行所需的任何操作。 scrat已在他的回答中提及。如果您不想使用任何第三方库,则绝对应该这样

  • 我能够在本地实例上成功执行JMX文件,但在远程系统(从属)上执行失败。我使用的是最新版本的捷视通。这是我第二次面对这个问题。 你能告诉我这里有什么遗漏吗。我最初认为这是因为我已将脚本从“执行”中关闭,但这里并非如此。 我的脚本(JMX)有一个事务控制器(在线程组下),带有一些超文本传输协议请求。 从命令行执行的代码如下所示。当我从 Run 执行时,它的结果相同 sh Jmeter.sh -n -t

  • 我们目前正在将jBPM(7.37.final)规则部署到一个Kie执行服务器,并使用执行服务器自动公开的REST API调用规则。 但是由于一些体系结构的限制,我们不能使用REST API调用规则。该选项是执行一个基于jar(kie服务器客户机或其他)的集成,并从客户机(java应用程序)远程调用执行服务器上的规则。 Virges Vinay

  • 问题内容: 如何在远程Linux机器上执行命令/脚本?说我想从框a的框b开始服务tomcat。 问题答案: 我想这是最好的安全方式,例如: 必须根据您的特定需求(例如,仅绑定到ipv4)部署OPTIONS的地方,并且您的远程命令可能正在启动您的tomcat守护程序。 注意 : 如果不想在每次运行ssh时都提示您,也请查看ssh- agent,以及系统允许的情况。关键是…了解ssh密钥交换过程。请仔

  • 问题内容: 如何执行网站上的python脚本?例如,以下似乎有效。但这是正确的方法吗? 我想知道是否可以从python命令提示符>>>导入网页。 问题答案: 好吧,你可以这样做: 但是,如果您确实在执行此操作,则将它或将其导入本地计算机肯定更有意义,然后正常导入该模块。

  • 我已经定义了partitioner类,它返回与网格大小相同的executionContext。执行上下文={part3=start=0,part1=start=0,part2=start=0} 日志:-