Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建索引花费的时间太长_Java_Garbage Collection_Gemfire_Spring Data Gemfire - Fatal编程技术网

Java 创建索引花费的时间太长

Java 创建索引花费的时间太长,java,garbage-collection,gemfire,spring-data-gemfire,Java,Garbage Collection,Gemfire,Spring Data Gemfire,我们使用Gemfire作为数据缓存。最近,我们使用完全相同的区域、数据和索引从gemfire 8.2.1迁移到9.5.1。但是在一个区域上创建索引花费的时间太长,entrycount为7284500。我们已经使用SpringDataGemFireV2.4.1.RELEASE来定义缓存服务器。以下是问题区域的配置: <gfe:replicated-region id="someRegion" shortcut="REPLICATE_PERSISTENT" concur

我们使用Gemfire作为数据缓存。最近,我们使用完全相同的区域、数据和索引从gemfire 8.2.1迁移到9.5.1。但是在一个区域上创建索引花费的时间太长,entrycount为7284500。我们已经使用SpringDataGemFireV2.4.1.RELEASE来定义缓存服务器。以下是问题区域的配置:

<gfe:replicated-region id="someRegion"
            shortcut="REPLICATE_PERSISTENT" concurrency-level=100
            persistent="true" disk-synchronous="true" statistics="true">
            <gfe:eviction action="OVERFLOW_TO_DISK" type="ENTRY_COUNT"
                    threshold=1000></gfe:eviction>
</gfe:replicated-region>
当运行时没有
XX:+CleavenebeForoullGC-XX:+CMSScavengeBeforeRemark-XX:+DisableExplicitGC
,我们在应用索引时通常会出现以下错误:

org.apache.geode.ForcedDisconnectException:成员未响应心跳请求

我们尝试将
成员超时
属性从5000增加到300000,但同样的问题仍然存在


添加上述与GC相关的java参数后,应用每个索引大约需要24分钟,但这次没有错误。这导致服务器需要花费太多时间才能与大约15个其他区域一起运行。其他地区不存在此类问题。(该地区的数据计数最大。其他地区的条目计数约为500K到3M)

我从您的配置中看到一些需要调整的内容。对于其中一些,我需要进行推测,因为我不知道您的一般终身堆消耗量

  • Xmx必须等于Xms,并将两者都设置为80g,因为堆的增长可能会导致重大问题
  • 显式设置NewSize=MaxNewSize。如果我能看到GC日志,我可以提供帮助,但我将给出这个配置作为起点
  • 将NewSize和MaxNewSize设置为9gb 将survivoratio设置为1 将TargetSurvivorRatio设置为85 添加PrintTenuringDistribution标志以帮助我们进行微调

  • 我不是清道夫旗帜的粉丝,因为它们在没有微调的情况下会导致更多的颠簸。现在,您可以将它们保留在其中,但我将删除screevebeforeallgc和screevebeforecark。保留DisableExplicitGC标志。更重要的是,当我读到您的行为在使用这些标志的基础上发生变化时,找到索引创建时间和这些标志之间的相关性是一个挑战。更有可能的是,由于堆配置不好,成员变得没有响应,所以让我们来解决这个问题

  • 关于您的逐出配置,我看到您说在这个“问题”区域中有700多万个条目,但是您有一个逐出算法,在该算法中,除了前1000个条目外,所有条目都溢出到磁盘??为什么?磁盘溢出是用来处理突发活动的,而不是“给定的”。可能是磁盘问题导致了问题的某些方面。也许需要访问磁盘上的所有这些条目是一个问题。当所有条目实际上都在堆中时,您是否遇到过这个问题

  • 启用GC日志,并将所有标志设置为打印GC详细信息、日期戳等

  • 如果尚未为GemFire启用统计信息,请同时启用这些统计信息

  • 如果发现成员超时不足,则可能是您的环境中存在问题。应该解决这些问题,而不是考虑增加成员超时来掩盖这些问题


  • 关于索引创建时间——正如David指出的,您已将此区域配置为磁盘上几乎所有的数据

    这将使索引创建成本更高,因为索引创建过程必须从磁盘读取所有条目

    但是,如果在索引上使用
    define
    标志,则使用此配置可以使索引创建速度更快

    <gfe:index id="someRegion_idx3" expression="o3.var3" from="/someRegion o3" define="true"/>
    
    
    
    这将导致在ApplicationContext初始化结束时一次创建所有索引。所以希望您的总时间将接近24分钟,因为GemFire只需扫描磁盘上的所有数据一次

    有关定义索引的详细信息,请参阅

    这并不能真正解释你的垃圾收集问题——我会看看David的答案以了解更多细节

    <gfe:cache
        properties-ref="gemfireProperties"
        close="true"
        critical-heap-percentage=85
        eviction-heap-percentage=75
        pdx-serializer-ref="pdxSerializer"
        pdx-persistent="true"
        pdx-read-serialized="true"
        pdx-ignore-unread-fields="false" />
    
    java -Xms50G -Xmx80G -XX:+UseConcMarkSweepGC 
    -XX:+UseCMSInitiatingOccupancyOnly 
    -XX:CMSInitiatingOccupancyFraction=70 
    -XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark 
    -XX:+UseParNewGC -XX:+UseLargePages 
    -XX:+DisableExplicitGC 
    -Ddw.appname=$APPNAME \
    -Dgemfire.Query.VERBOSE=true \
    -Dgemfire.QueryService.allowUntrustedMethodInvocation=true \
    -DDistributionManager.MAX_THREADS=20 \
    -DDistributionManager.MAX_FE_THREADS=10 \
    -Dcom.sun.management.jmxremote \
    -Dcom.sun.management.jmxremote.port=11809 \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Dconfig=/config/location/ \
    com.my.package.cacheServer
    
    <gfe:index id="someRegion_idx3" expression="o3.var3" from="/someRegion o3" define="true"/>