Hazelcast集群成员由于大量的" IsStillRunningService"而导致内存不足。对象

时间:2016-04-03 18:32:50

标签: hazelcast hazelcast-imap

我们有一个系统,可以在3.5版本上使用Hazelcast IExecutor服务和IMap。我们最近遇到了Hazelcast集群成员一个接一个地停止生产内存,最后所有节点都与OOM崩溃。
在进行因果分析时,我们发现有数千个以下日志条目,日志文件大小呈指数级增长。此外,存在日志的存储空间也已用完了空间。

WARNING: [10.7.90.189]:30103 [FB] [3.5] Asking if operation execution has been started: com.hazelcast.spi.impl.operationservice.impl.IsStillRunningService$InvokeIsStillRunningOperationRunnable@48b3ac3b
Mar 30, 2016 11:09:29 AM com.hazelcast.spi.impl.operationservice.impl.Invocation
WARNING: [10.7.90.189]:30103 [FB] [3.5] While asking 'is-executing': Invocation{ serviceName='hz:core:partitionService', op=com.hazelcast.spi.impl.operationservice.impl.operations.IsStillExecutingOperation{serviceName='hz:core:partition
Service', partitionId=-1, callId=59834, invocationTime=1459349279980, waitTimeout=-1, callTimeout=5000}, partitionId=-1, replicaIndex=0, tryCount=0, tryPauseMillis=0, invokeCount=1, callTimeout=5000, target=Address[1.2.3.4]:30102, b
ackupsExpected=0, backupsCompleted=0}
com.hazelcast.core.OperationTimeoutException: No response for 10000 ms. Aborting invocation! Invocation{ serviceName='hz:core:partitionService', op=com.hazelcast.spi.impl.operationservice.impl.operations.IsStillExecutingOperation{servic
eName='hz:core:partitionService', partitionId=-1, callId=268177, invocationTime=1459349295209, waitTimeout=-1, callTimeout=5000}, partitionId=-1, replicaIndex=0, tryCount=0, tryPauseMillis=0, invokeCount=1, callTimeout=5000, target=Addr
ess[10.7.90.190]:30102, backupsExpected=0, backupsCompleted=0} No response has been received!  backups-expected:0 backups-completed: 0
        at com.hazelcast.spi.impl.operationservice.impl.Invocation.newOperationTimeoutException(Invocation.java:491)
        at com.hazelcast.spi.impl.operationservice.impl.IsStillRunningService$IsOperationStillRunningCallback.setOperationTimeout(IsStillRunningService.java:224)
        at com.hazelcast.spi.impl.operationservice.impl.IsStillRunningService$IsOperationStillRunningCallback.onFailure(IsStillRunningService.java:219)
        at com.hazelcast.spi.impl.operationservice.impl.InvocationFuture$1.run(InvocationFuture.java:137)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        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)
        at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:92)

据我所知,群集成员将继续制作Heartbeats以确保所有成员都活着,我相信默认值为10秒。现在的问题是,如果任何成员无法响应或处于休眠状态,其余成员将继续进行正在执行的呼叫。在查看Heap转储后,发现> 73%堆已经满了" IsStillRunningService"对象。

问题:

  1. 如何了解到底出了什么问题?
  2. 耗尽存储空间只是一个共同发生或可能有任何核心化?我们怀疑一个人可能会导致其他人,因为它在一周内发生了两次。
  3. Hazelcast XML配置:

    <hazelcast xsi:schemaLocation="http://www.hazelcast.com/schema/config http://www.hazelcast.com/schema/config/hazelcast-config-3.5.xsd"
               xmlns="http://www.hazelcast.com/schema/config"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    
        <map name="myMap">
            <backup-count>0</backup-count>
            <time-to-live-seconds>43200</time-to-live-seconds>
            <eviction-policy>LRU</eviction-policy>
            <max-size policy="USED_HEAP_PERCENTAGE">75</max-size>
            <eviction-percentage>10</eviction-percentage>
            <in-memory-format>OBJECT</in-memory-format>
        </map>
    
        <executor-service name="calculation">
                <pool-size>10</pool-size>
            <queue-capacity>400</queue-capacity>
        </executor-service>
    
        <executor-service name="loader">
                <pool-size>5</pool-size>
            <queue-capacity>400</queue-capacity>
        </executor-service>
    
        <properties>
            <property name="hazelcast.icmp.timeout">5000</property>
            <property name="hazelcast.initial.wait.seconds">10</property>
            <property name="hazelcast.connection.monitor.interval">5000</property>
        </properties>
    
        <network>
            <port auto-increment="true" port-count="100">30101</port>
            <join>
                <multicast enabled="false">
                    <multicast-group>224.2.2.3</multicast-group>
                    <multicast-port>54327</multicast-port>
                </multicast>
                <tcp-ip enabled="true">
                    <interface>1.2.3.4</interface>
                    <interface>1.2.3.5</interface>
                    <interface>1.2.3.6</interface>
                </tcp-ip>
                <aws enabled="false"/>
            </join>
            <interfaces enabled="false">
                <interface>127.0.0.1</interface>
            </interfaces>
        </network>
    </hazelcast>
    

    StackTrace
    LinkedBlockingQueue which holds IsStillRunningService Objects

1 个答案:

答案 0 :(得分:1)

可以升级到3.6。添加了修复程序以防止使用is-still-running进入OOME。在3.7中,整个机制将被删除,并由一个问题较少的方法取代。

https://github.com/hazelcast/hazelcast/pull/7719