Ubuntu 20.04环境下puppetserver 6.17.1内存泄漏成因及经验问询
答复
共性问题说明
puppetserver 6.17.x是官方记录了多起内存泄漏问题的迭代版本,大量同版本生产环境部署的开发者都反馈过内存持续上涨、最终触发OOM的同类问题。
核心成因
- JRuby类加载泄漏:该版本依赖的JRuby runtime存在类加载器无法被GC回收的缺陷,每次处理puppet资源编译、模板渲染请求后生成的临时类实例会持续驻留堆内存,请求量越大泄漏速度越快,自定义fact资源、嵌套模板较多的场景泄漏现象会更明显。
- 配置不合理推高内存占用:当前配置的堆内存上限
-Xmx1G和代码缓存大小-XX:ReservedCodeCacheSize=1G合计已预留2G内存,叠加进程运行所需的元空间、堆外内存、线程栈等占用,进程实际运行所需的总内存至少需要3G,若系统对进程的内存配额低于该值,会触发系统OOM killer终止进程,容易被误判为堆内存泄漏。 - 日志组件泄漏:配置中使用的
com.puppetlabs.jruby_utils.jruby.Slf4jLogger适配组件在6.17版本存在异步日志队列积压问题,当日志输出级别设置为DEBUG、或短时间内生成大量错误日志时,队列中堆积的日志对象会直接进入老年代,无法被GC回收。
优化建议
- 临时缓解可先将
-Xmx调整为2G,-XX:ReservedCodeCacheSize调整为512M,观察内存上涨速度是否放缓 - 若允许版本升级,建议直接升级到puppetserver 6.19.0及以上版本,官方已在该版本修复了上述两类已知的内存泄漏缺陷
- 如需定位具体泄漏点,可在JAVA_ARGS中添加
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/puppetserver/参数,OOM触发时自动导出堆快照,使用内存分析工具定位具体泄漏对象。
内容的提问来源于stack exchange,提问作者santer
相关产品推荐
相关产品推荐

