Java 创建索引花费的时间太长
我们使用Gemfire作为数据缓存。最近,我们使用完全相同的区域、数据和索引从gemfire 8.2.1迁移到9.5.1。但是在一个区域上创建索引花费的时间太长,entrycount为7284500。我们已经使用SpringDataGemFireV2.4.1.RELEASE来定义缓存服务器。以下是问题区域的配置: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
<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)我从您的配置中看到一些需要调整的内容。对于其中一些,我需要进行推测,因为我不知道您的一般终身堆消耗量
关于索引创建时间——正如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"/>