Apache Solr节点GC频繁且耗时过长,恳请优化建议
Apache Solr GC频繁且耗时过长的优化方案
环境与问题概述
- 集群规模:6个节点,单节点配置为8核CPU、32GB内存
- 当前问题:GC运行过于频繁,且单次GC耗时久,影响Solr服务性能
当前Solr Java配置
-DSTOP.KEY=solrrocks -DSTOP.PORT=7983 -Dhost=10.0.140.240 -Djetty.home=/opt/solr/server -Djetty.port=8983 -Dlog4j2.formatMsgNoLookups=true -Dnewrelic.environment=production-v2 -Dsolr.data.home= -Dsolr.default.confdir=/opt/solr/server/solr/configsets/_default/conf -Dsolr.documentCache.initialSize=8339 -Dsolr.documentCache.size=8339 -Dsolr.filterCache.initialSize=8339 -Dsolr.filterCache.size=8339 -Dsolr.install.dir=/opt/solr -Dsolr.jetty.inetaccess.excludes= -Dsolr.jetty.inetaccess.includes= -Dsolr.log.dir=/var/solr/data/logs -Dsolr.log.muteconsole -Dsolr.queryResultCache.initialSize=6671 -Dsolr.queryResultCache.size=6671 -Dsolr.solr.home=/var/solr/data/data -Duser.timezone=UTC -DzkClientTimeout=30000 -DzkHost=ip-10-0-12-249.ap-south-1.compute.internal:2181,ip-10-0-12-250.ap-south-1.compute.internal:2181,ip-10-0-12-251.ap-south-1.compute.internal:2181/solr -XX:+AggressiveOpts -XX:+AlwaysPreTouch -XX:+ParallelRefProcEnabled -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+UseG1GC -XX:+UseGCLogFileRotation -XX:+UseLargePages -XX:-OmitStackTraceInFastThrow -XX:-OmitStackTraceInFastThrow -XX:ConcGCThreads=4 -XX:G1ReservePercent=10 -XX:GCLogFileSize=20M -XX:InitiatingHeapOccupancyPercent=80 -XX:MaxGCPauseMillis=100 -XX:MaxTenuringThreshold=8 -XX:NewRatio=3 -XX:NumberOfGCLogFiles=9 -XX:OnOutOfMemoryError=/opt/solr/bin/oom_solr.sh 8983 /var/solr/data/logs -XX:ParallelGCThreads=4 -XX:PretenureSizeThreshold=64m -XX:SurvivorRatio=4 -Xloggc:/var/solr/data/logs/solr_gc.log -Xms23862m -Xmx23862m -Xss256k -javaagent:/opt/solr/contrib/newrelic/newrelic.jar -verbose:gc
优化建议
1. G1GC核心参数调整
- 降低InitiatingHeapOccupancyPercent(IHOP):当前设置为80,G1在堆占用80%时才启动并发标记,易导致后续触发Full GC。建议调整为40-50,让G1更早启动并发回收,避免堆内存耗尽。
- 调整MaxGCPauseMillis:当前设为100ms,若实际场景无法达到,会迫使G1频繁调整新生代大小,加剧GC频率。建议根据业务容忍度调整为200-300ms,给G1更合理的回收空间。
- 优化新生代比例:当前
NewRatio=3意味着新生代占堆的1/4(约6G),Solr作为查询密集型服务,适当增大新生代可减少Minor GC频率。建议改为-XX:NewRatio=2(新生代占1/3,约8G),或直接用-XX:MaxNewSize=8G -XX:NewSize=8G固定新生代大小,避免动态调整的波动。 - 调整GC线程数:单节点8核,当前
ConcGCThreads=4、ParallelGCThreads=4,线程数过高会占用过多CPU影响业务。建议设置为:-XX:ParallelGCThreads=6(并行GC线程数取CPU核心数的75%),-XX:ConcGCThreads=2(并发线程数取并行线程数的1/3左右)。
2. 堆内存与缓存优化
- 提升堆内存预留比例:当前
G1ReservePercent=10,预留空间不足可能导致对象晋升失败触发Full GC。建议提升至15-20,增加内存缓冲。 - 优化Solr缓存配置:当前documentCache、filterCache大小均为8339,queryResultCache为6671,需结合实际查询热度调整。通过Solr Admin的Cache页面查看缓存命中率,若命中率低于90%,适当增大缓存大小;若命中率高但内存压力大,可设置
solr.documentCache.softReferences=true,让缓存对象在内存不足时被回收。
3. 其他参数优化
- 移除重复参数:配置中重复出现
-XX:-OmitStackTraceInFastThrow,删除其中一条即可。 - 关闭AggressiveOpts:该参数为早期JVM激进优化,在JDK8+中已不推荐,可能引入不稳定因素,建议移除
-XX:+AggressiveOpts。 - 验证LargePages配置:
-XX:+UseLargePages需要系统层面支持,若未正确配置则会失效,建议检查系统大页配置,未配置则移除该参数。
内容的提问来源于stack exchange,提问作者Rajat Jain
相关产品推荐
相关产品推荐

