
keycloak是运行在jboss上面并且部署到了容器里在k8s上面进行编排现在遇到gc在某个时刻垃圾回收速度变慢CPU接近100%容器导致存活探针失败容器最后重启二 问题分析与解决方案这是一个典型的 JVM GC 问题导致的容器重启场景。让我分析一下你的配置和可能的原因2.1 问题分析根据你的devops.yaml配置value: -Xms1024M -Xmx1024M -XX:ConcGCThreads13 -XX:ParallelGCThreads13 -XX:UnlockExperimentalVMOptions -XX:UseG1GC -Djboss.bind.address.management0.0.0.0resources: limits: memory: 10Gi # 限制的内存量 cpu: 2 # 限制的 CPU 核心数 requests: cpu: 100m memory: 500mlivenessProbe: #存活检测 failureThreshold: 2 #探测失败的重试次数重试一定次数后将认为失败在 readiness 探针中Pod会被标记为未就绪默认为 3最小值为 1 initialDelaySeconds: 120 #容器启动后要等待多少秒后就探针开始工作单位秒默认是 0 秒最小值是 0 periodSeconds: 10 #执行探测的时间间隔单位是秒默认为 10s单位秒最小值是 1 successThreshold: 1 #探针检测失败后认为成功的最小连接成功次数默认为 1 timeoutSeconds: 5 #探针执行检测请求后等待响应的超时时间默认为 1s单位秒最小值是 1 httpGet: path: /auth scheme: HTTP port: 8080 2.2 发现的关键问题1.GC 线程数配置过高-XX:ConcGCThreads13 -XX:ParallelGCThreads13问题你配置了 13 个并发 GC 线程和 13 个并行 GC 线程但 CPU 限制只有2 核ParallelGCThreads13并行 GC 阶段使用 13 个线程ConcGCThreads13并发标记阶段使用 13 个线程当 13 个线程竞争 2 个 CPU 核心时会导致严重的 CPU 上下文切换GC 线程互相等待 CPU 时间片GC 暂停时间变长CPU 使用率飙升到 100%推荐配置-XX:ParallelGCThreads2 -XX:ConcGCThreads1公式参考ParallelGCThreads CPU 核心数或稍少ConcGCThreads max(1, ParallelGCThreads / 4)2.堆内存设置过小-Xms1024M -Xmx1024M问题Keycloak 是一个比较重的应用1GB 堆内存可能不够用尤其是用户会话多时存在大量认证请求时Infinispan 缓存占用内存这会导致频繁触发 GCFull GC 增多GC 时间变长推荐容器内存限制是 10Gi可以适当增加堆内存-Xms2048M -Xmx4096M3.存活探针配置过于严格livenessProbe: failureThreshold: 2 # 只允许失败 2 次 periodSeconds: 10 # 每 10 秒探测一次 timeoutSeconds: 5 # 超时 5 秒问题当发生 Full GC 或长时间 GC 暂停时GC STWStop The World可能超过 5 秒只需要 2 次失败20 秒内就会重启容器这个配置对 Java 应用过于苛刻推荐调整livenessProbe: failureThreshold: 3 # 允许 3 次失败 periodSeconds: 15 # 每 15 秒探测 timeoutSeconds: 10 # 超时 10 秒4.缺少关键的 G1GC 调优参数当前配置缺少最大 GC 暂停时间目标G1 Region 大小堆内存使用率阈值三 优化JAVA_OPTS配置问题-XX:PrintGCDetails在 Java 9 已被弃用应该使用统一的-Xlog语法。优化建议的完整 JAVA_OPTS非堆内存限制-XX:MaxMetaspaceSize512M -XX:MaxDirectMemorySize512M -XX:ReservedCodeCacheSize256M并行与并发配置过于保守可根据CPU核数来配置如4核的CPU配置如下ParallelGCThreads 并行GC线程数约为CPU核数的5/8ConcGCThreads 并发GC线程数约为ParallelGCThreads的1/4)-XX:UseG1GC -XX:ParallelGCThreads4 -XX:ConcGCThreads1 -XX:MaxGCPauseMillis200完整的JAVA_OPTS配置- name: JAVA_OPTS value: - -Xms10240M -Xmx10240M -XX:UseG1GC -XX:ParallelGCThreads5 -XX:ConcGCThreads2 -XX:MaxGCPauseMillis200 -XX:G1HeapRegionSize16M -XX:InitiatingHeapOccupancyPercent45 -XX:MaxMetaspaceSize512M -XX:MaxDirectMemorySize512M -XX:ReservedCodeCacheSize256M -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/tmp/heapdump.hprof -Xlog:gc*:file/tmp/gc.log:time,uptime,level,tags -Djboss.bind.address.management0.0.0.0