写点什么

K8S 环境的 Jenkin 性能问题处理

作者:程序员欣宸
  • 2022-11-19
    广东
  • 本文字数:1440 字

    阅读完需:约 5 分钟

K8S环境的Jenkin性能问题处理

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

环境信息

  • 在 K8S 环境通过 helm 部署了 Jenkins(namespace 为 helm-jenkins),用于日常 Java 项目构建:


  1. kubernetes:1.15

  2. jenkins:2.190.2

  3. helm 版本:2.16.1


问题描述

  • 当 Jenkins 任务密集时,Jenkins 页面响应缓慢,偶尔有白屏情况发生(稍后自动恢复),且构建速度明显变缓,此时去后台看一下环境信息:

  • K8S 环境已装了 metrics-server,用命令 kubectl top pod --all-namespaces 可以看到 Jenkins 所占内存仅有 410 兆,如下图:


  • Jenkins 是 Java 应用,在处理大量任务的时候,410 兆的内存应该是不够的,JVM 内存不足会导致频繁的垃圾回收,接下来顺着这个思路去看 JVM 内存情况;

  • 由上图可知 pod 名为 my-jenkins-74bcdfc566-lmhnw ,通过 kubectl describe pod my-jenkins-74bcdfc566-lmhnw -n helm-jenkins 查看此 pod 详情:


  • 由上图红框 1 可知此 pod 运行在 node3 节点,红框 2 显示对应的 docker 容器 ID 为 f9ae211abe99 (前 12 位);

  • 去 node3 机器上执行 docker ps ,果然发现了 ID 为 f9ae211abe99 的容器,如下图:


  • 执行命令 docker exec f9ae211abe99 jps 查看容器内所有 java 进程的 PID,如下图,可见 Jenkins 服务在容器内的 PID 等于 6:


  • 知道了容器 ID 和 java 进程的 PID,就可以查看 JVM 信息了,执行命令 docker exec f9ae211abe99 jstat -gcutil 6 3s 99 查看 GC 情况,如下图,除了 YGC 频繁,还出现了 FGC:


  • 再用命令 docker exec f9ae211abe99 jmap -heap 6 查看 JVM 内存情况,如下图,年轻代太小了,只有 100 兆:


  • 最后用命令 docker exec f9ae211abe99 ps -ef | grep java 查看该进程的启动命令,如下图,可见启动该 java 进程时没有指定内存参数:


  • 在观察的过程中,ID 为 f9ae211abe99 的容器突然不见了,取而代之的是一个 ID 为 7f1f94d79e46 新容器,如下图所示:


  • 执行命令 kubectl get event -n helm-jenkins 查看该命名空间的所有事件,如下图红框所示,发现原来是探针不响应迫使 K8S 重启该 pod:


  • 诊断完成,根据前面的信息可以推测:JVM 内存太小,YGC 频繁,甚至会有 FGC 出现,系统响应过慢还可能导致 K8S 探针判断容器不健康,引发 docker 容器被删除后重新创建;

  • 基于上述结果制定的应对措施:调整 JVM 参数,减少 GC;

调整参数

  • 宿主机节点有 16G 物理内存,没有其他业务,因此打算划分 8G 内存给 Jenkins;

  • 执行命令 kubectl edit deployment my-jenkins -n helm-jenkins ,编辑 jenkins 的 deployment,找到 JAVA_OPTS 参数的位置,在下面增加 value,如下图红框所示:

  • 就像 vi 工具编辑文本文件那样操作,保存退出后,pod 被重建;

  • 找到 docker 容器 ID 后,执行命令 docker exec 591dc47d4d57 jmap -heap 6 查看 JVM 内存,如下图所示,堆上限已经达到 8G,年轻代是 3686 兆(调整前只有 106 兆):

  • 并发执行任务一段时间后,观察 GC 情况发现并不频繁:

  • 再来看看该进程的启动命令,执行命令 docker exec 591dc47d4d57 ps -ef|grep java ,如下图红框所示 ,刚才设置的内存参数已经被用在启动命令中了:

  • 运行一段时间,确认任务可正常执行,页面操作也比较流畅,查看 K8S 事件,再也没有出现 pod 重启的事件;

关于修改参数的方法

  • 除了 kubectl edit 命令,还可以将 helm 的 Jenkins 配置信息全部下载到本地,修改后再部署 Jenkins 服务,如果您想了解更多,请参考《Helm部署的服务如何修改配置》

  • 至此,K8S 环境下 Jenkins 性能问题处理已经完成,希望能给您带来一些参考;

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...


发布于: 刚刚阅读数: 4
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018-04-19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
K8S环境的Jenkin性能问题处理_Kubernetes_程序员欣宸_InfoQ写作社区