28

K8S环境的Jenkin性能问题处理

 3 years ago
source link: http://www.cnblogs.com/bolingcavalry/p/13770967.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

环境信息

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

  1. kubernetes:1.15
  2. jenkins:2.190.2
  3. helm版本:2.16.1

如果您想了解helm部署Jenkins的详情,请参考《》

问题描述

在Jenkins任务密集时,Jenkins页面响应缓慢,偶尔有白屏情况发生(稍后自动回复),而且构建速度也明显变缓,查看具体的数据:

  1. K8S环境已装了metrics-server,用命令kubectl top pod --all-namespaces可以看到Jenkins所占内存仅有410兆,如下图:
    F7vmaaf.png!mobile
  2. Jenkins是Java应用,在处理大量任务的时候,410兆的内存应该是不够的,JVM内存不足会导致频繁的垃圾回收,接下来顺着这个思路去看JVM内存情况;
  3. 由上图可知pod名为my-jenkins-74bcdfc566-lmhnw,通过kubectl describe pod my-jenkins-74bcdfc566-lmhnw -n helm-jenkins查看此pod详情:
    jmq2ii2.png!mobile
  4. 由上图红框1可知此pod运行在node3节点,红框2显示对应的docker容器ID为f9ae211abe99(前12位);
  5. 去node3机器上执行docker ps,果然发现了ID为f9ae211abe99的容器,如下图:
    meaUZ3Y.png!mobile
  6. 执行命令docker exec f9ae211abe99 jps查看容器内所有java进程的PID,如下图,可见Jenkins服务在容器内的PID等于6:
    iAFra2u.png!mobile
  7. 知道了容器ID和java进程的PID,就可以查看JVM信息了,执行命令docker exec f9ae211abe99 jstat -gcutil 6 3s 99查看GC情况,如下图,除了YGC频繁,还出现了FGC:
    NbENb2M.png!mobile
  8. 再用命令docker exec f9ae211abe99 jmap -heap 6查看JVM内存情况,如下图,年轻代太小了,只有100兆:
    V7j67f.png!mobile
  9. 最后用命令docker exec f9ae211abe99 ps -ef | grep java查看该进程的启动命令,如下图,可见启动该java进程时并有指定内存参数:
    3aiI3aM.png!mobile
  10. 在观察内存参数的过程中,ID为f9ae211abe99的容器突然不见了,取而代之的是一个ID为7f1f94d79e46新容器,如下图所示:
    vMfIvqe.png!mobile 11. 执行命令kubectl get event -n helm-jenkins查看该命名空间的所有事件,如下图红框所示,发现原来是探针不响应迫使K8S重启该pod:
    zuyINz7.png!mobile 对当前系统的诊断已经完成,根据前面的信息可以推测:JVM内存太小,YGC频繁,甚至会有FGC出现,系统响应过慢还可能导致K8S探针判断容器不健康,引发docker容器被删除后重新创建,接下来就调整JVM参数,验证推测是否正确;

调整参数

  1. 宿主机节点有16G物理内存,没有其他业务,因此打算划分8G内存给Jenkins;
  2. 执行命令kubectl edit deployment my-jenkins -n helm-jenkins,编辑jenkins的deployment,找到JAVA_OPTS参数的位置,在下面增加value,如下图红框所示:
    uQjmUrQ.png!mobile
  3. 找到docker容器ID后,执行命令docker exec 591dc47d4d57 jmap -heap 6查看JVM内存,如下图所示,堆上限已经达到8G,年轻代是3686兆(调整前只有106兆)
    7NNJvub.png!mobile
  4. 并发执行任务一段时间后,观察GC情况发现并不频繁:
    7ZnuUnn.png!mobile
  5. 再来看看该进程的启动命令,执行命令docker exec 591dc47d4d57 ps -ef|grep java,如下图红框所示 ,刚才设置的内存参数已经被用在启动命令中了:
    RJjMvqz.png!mobile
  6. 运行一段时间,确认任务可正常执行,页面操作也比较流畅,查看K8S事件,再也没有出现pod重启的事件;

关于修改参数的方法

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

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

https://github.com/zq2599/blog_demos

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK