Apache Ignite:两表交叉连接时出现长时间GC停顿问题
Apache Ignite集群GC日志未生成问题排查
环境与问题描述
- 搭建了4节点Apache Ignite集群,使用的JVM参数如下:
ENV JAVA_OPTS="-Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -server -Xms1g\ -Xmx1500m -XX:+AlwaysPreTouch -XX:+UseParNewGC \ -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled \ -XX:+CMSPermGenSweepingEnabled -XX:+CMSScavengeBeforeRemark \ -XX:+ScavengeBeforeFullGC -XX:+DisableExplicitGC \ -XX:+UseContainerSupport \ -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation\ -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xloggc:/opt/ignite/logs/log.txt"
- 尝试过G1、CMS两种垃圾收集器,JVM内存配置为最小1GB、最大1500MB,集群关联两张各含10万条数据的表。
- 已添加GC日志相关参数并指定日志路径,但
/opt/ignite/logs/目录下未生成GC日志(该目录已存在)。
可能的原因及排查方案
1. JDK版本兼容性问题
如果使用Java 9及以上版本,原有GC日志参数存在废弃项:
-Xloggc、-XX:+PrintGCDetails等参数已被统一的-Xlog参数替代,旧参数可能无法生效。建议替换为符合新版本的参数:
-Xlog:gc*:/opt/ignite/logs/log.txt:time,uptime:filecount=10,filesize=10M
-XX:+CMSPermGenSweepingEnabled在Java 8之后已废弃(PermGen被Metaspace取代),无效参数可能导致JVM忽略部分配置。
2. 目录权限不足
运行Ignite的进程用户可能没有/opt/ignite/logs/目录的写入权限:
- 验证权限:切换到Ignite运行用户,执行
touch /opt/ignite/logs/test.txt,若无法创建则需调整权限:
chown -R <ignite运行用户>:<用户组> /opt/ignite/logs/ chmod 755 /opt/ignite/logs/
3. JVM参数未实际生效
部分Ignite部署方式(如Docker)可能覆盖JAVA_OPTS,或使用专属变量(如IGNITE_JVM_OPTS):
- 查看进程实际参数:执行
jps -v | grep Ignite,确认GC日志相关参数是否出现在输出中。 - 检查启动脚本:确认脚本是否正确读取并应用了
JAVA_OPTS。
4. GC未触发
若集群负载极低,可能尚未触发GC操作,导致日志未生成:
- 手动触发GC:执行
jcmd <ignite进程ID> GC.run,之后检查日志目录是否生成文件。
内容的提问来源于stack exchange,提问作者JDRanpariya
相关产品推荐
相关产品推荐

