首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用Client-Server的Hazelcast中面临性能问题

在使用Client-Server的Hazelcast中面临性能问题
EN

Stack Overflow用户
提问于 2020-05-18 21:14:53
回答 2查看 931关注 0票数 2

我面临着将hazelcast配置为客户端-服务器的性能问题。我有一个由5个节点和1个主节点组成的K8S集群。每个节点有64 GB的内存和16个核心(Hazelcast版本3.12.4),Hazelcast服务器部署在K8S上,一个POD部署在集群中的一个可用节点上。我的客户端部署在K8S上,它通过智能客户端连接到上面的Hazelcast (为K8S启用了Hazelcast发现)。我的应用程序总共有10个PODs,每个节点包含我的应用程序的2个PODs。

我正在运行不同的API并对我的应用程序执行负载测试(一次在所有10个PODs中共享约110个线程)

我在我的应用程序中有下面这段代码来获取缓存。

代码语言:javascript
运行
复制
public Map<Object, Object> get(String cacheId, Long lTenantId) {
     String strMethodName="get";
     long t1 = System.currentTimeMillis();
     Map<Object,Object> cacheDataMap=hazelcastInstance.getMap(cacheId);
     long totalTimeTaken = (System.currentTimeMillis()-t1);
     if(totalTimeTaken > 10){
         logger.warnLog(CLASSNAME, strMethodName,"Total time taken by "+cacheId+" identifier for get operation is : "+totalTimeTaken+" ms");
      }
      return cacheDataMap;
}

我的应用程序使用此地图的方式不同,如下所示

1)

代码语言:javascript
运行
复制
map.get(key);

2)

代码语言:javascript
运行
复制
Set keys = map.keySet();
   Iterator iterator = keys.iterator(); //I changed to keyset iterator because entryset was causing lot of performance issues
   while (iterator.hasNext()) {
      // doing stuff
   }

当我的所有API都启动加载时,我将在应用程序中打印这些日志(总时间为....)其中每个缓存访问时间> 10毫秒,这会导致性能问题,因此我无法为所有API实现所需的TPS。

缓存中存储了大约300个地图,其中缓存的总大小为4.22 MB

我使用的是近缓存配置,在管理中心也显示出100%的效率。(这是在启用hazelcast.client.statistics.enabled时拍摄的)。

我还尝试了在4个节点上部署8个PODs,并为Hazelcast服务器部署了1个专用节点,但问题仍然存在。当我以嵌入式方式连接Hazelcast时,没有观察到任何问题,并且我能够为所有API实现所需的TPS。

我是否遗漏了任何配置或任何其他导致此问题的东西?

这是我的hazelcast-client.xml

代码语言:javascript
运行
复制
<hazelcast-client
xmlns="http://www.hazelcast.com/schema/client-config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.hazelcast.com/schema/client-config
                  http://hazelcast.com/schema/client-config/hazelcast-client-config-3.11.xsd">

<group>
<name>dev</name>
</group>
<instance-name>hazelcast</instance-name>
<properties>
<property name="hazelcast.client.shuffle.member.list">true</property>
<property name="hazelcast.client.heartbeat.timeout">600000</property>
<property name="hazelcast.client.heartbeat.interval">180000</property>
<property name="hazelcast.client.event.queue.capacity">1000000</property>
<property name="hazelcast.client.invocation.timeout.seconds">120</property>
<property name="hazelcast.client.statistics.enabled">false</property>
<property name="hazelcast.discovery.enabled">true</property>
<property name="hazelcast.map.invalidation.batch.enabled">false</property>
</properties>

<network>
<discovery-strategies>
<discovery-strategy enabled="true"
class="com.hazelcast.kubernetes.HazelcastKubernetesDiscoveryStrategy">
<properties>
<property name="service-name"><service-name></property>
<property name="namespace"><namespace></property>
</properties>
</discovery-strategy>
</discovery-strategies>
<smart-routing>true</smart-routing>
<redo-operation>true</redo-operation>
<connection-timeout>90000</connection-timeout>
<connection-attempt-period>100</connection-attempt-period>
<connection-attempt-limit>0</connection-attempt-limit>

</network>

<near-cache name="default">
                <in-memory-format>OBJECT</in-memory-format>
                <serialize-keys>true</serialize-keys>
                <invalidate-on-change>true</invalidate-on-change>
                <eviction eviction-policy="NONE" max-size-policy="ENTRY_COUNT"/>
        </near-cache>
</hazelcast-client>

这是我的hazelcast.xml

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>

<hazelcast xsi:schemaLocation="http://www.hazelcast.com/schema/config hazelcast-config-3.11.xsd"
           xmlns="http://www.hazelcast.com/schema/config"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <management-center enabled="${hazelcast.mancenter.enabled}">${hazelcast.mancenter.url}</management-center>

</hazelcast>
EN

回答 2

Stack Overflow用户

发布于 2020-05-19 00:28:48

缓存的目标是尽可能快地从键中获取值。通常,您已经有了密钥,并请求了值。这意味着您向任何节点发送请求,这将在分区表中查找键所属的分区,并将查询转发到相关节点。

在第二个用例中,您尝试从所有节点获取所有密钥:

代码语言:javascript
运行
复制
Set keys = map.keySet();
Iterator iterator = keys.iterator();
while (iterator.hasNext()) {
    // doing stuff
}

为了尽可能快地返回,Hazelcast将返回Iterator的延迟实现。对于每个对next()的调用,它首先需要在上述过程之后检索密钥。另外,我假设// doing stuff代码实际上是从键中加载值。

总之,请不惜一切代价避免使用map.keySet()。不幸的是,除非我更多地了解您的上下文和用例,否则我无法提供相关的替代方案。

票数 1
EN

Stack Overflow用户

发布于 2020-06-17 12:46:14

最后,我设法通过一些调整获得了我的表现。我使用通用代码将数据放入缓存,并从缓存中访问数据。我所做的是在将数据放入最终的map之前,我添加了一个虚拟的键"ALL“。因此,当我的数据被访问时,我总是从所有的键中检索数据,然后迭代它。虽然这不是一个适当的解决方案,但设法节省了大量的精力。将此作为答案发布,可能对处于相同情况的其他人很有用。

感谢所有人抽出时间来帮助我寻找可能的选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61870419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档