简体   繁体   English

SingleKeyBackupWriteCommand 内存不足

[英]SingleKeyBackupWriteCommand run out of memory

Our System has 8 nodes(vm in openstack) to run infinispan.我们的系统有 8 个节点(openstack 中的 vm)来运行 infinispan。 It works well at beginning.它在开始时运作良好。 However, 7 days later, the SingleKeyBackupWriteCommands run out of one node's memory in 4 hours(Others' memory are fine.).然而,7天后,SingleKeyBackupWriteCommands在4小时内耗尽了一个节点的内存(其他人的内存没问题。)。 Does Anyone know what's the problem that make infinispan just receives the cmd but never execute them?有谁知道使 infinispan 只接收 cmd 但从不执行它们的问题是什么?

 num     #instances         #bytes  class name
----------------------------------------------
   1:      16830203    13201657008  [B
   2:      29186377     3822907360  [C
   3:      20916364     1505978208  java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask
   4:      30043274      721038576  java.lang.String
   5:     **5750667**    506058696  org.infinispan.commands.triangle.SingleKeyBackupWriteCommand

base on the TriangleSequencer's logic基于 TriangleSequencer 的逻辑

If any issue happens once in sender side/Network side, the receiver side will never execute any subsequent cmd.如果在发送方/网络方发生任何问题,接收方将永远不会执行任何后续 cmd。 It's very fragile logic in TriangleOrderManager. TriangleOrderManager 中的逻辑非常脆弱。

enter image description here在此处输入图片说明

private synchronized boolean isNext(int commandTopologyId, long sequenceNumber) {
if (receiverTopologyId == commandTopologyId) {
if (trace)

{ log.tracef("Receiver old topology. Current sequence (%s:%s), command sequence (%s:%s)", receiverTopologyId, receiverSequenceNumber, commandTopologyId, sequenceNumber); }
**return receiverSequenceNumber == sequenceNumber;**
} else if (receiverTopologyId < commandTopologyId) {
//update topology. this command will be the first
if (trace)

{ log.tracef("Receiver update topology. CommandTopologyId=%s, command sequence=%s", commandTopologyId, sequenceNumber); }
receiverTopologyId = commandTopologyId;
receiverSequenceNumber = 1;
return 1 == sequenceNumber;
} else {
if (trace)

{ log.tracef("Receiver old topology. Current sequence (%s:%s), command sequence (%s:%s)", receiverTopologyId, receiverSequenceNumber, commandTopologyId, sequenceNumber); }
//this topology is higher than the command topology id.
//another topology was installed. this command will fail with OutdatedTopologyException.
return true;
}
}

More details can be found in https://issues.redhat.com/browse/ISPN-12435更多细节可以在https://issues.redhat.com/browse/ISPN-12435 中找到

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM