欢送拜访我的GitHub

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

K8S环境的Jenkin性能问题解决

本文是《K8S环境的Jenkin性能问题解决》的续篇,上一篇解决了Jenkins集群中的Master节点的性能问题,然而真正执行工作的并非Master节点,而是为每个工作长期创立的Pod,当这些Pod的性能问题决定着工作的快慢甚至成败;

环境信息

  1. 硬件:三台CentOS 7.7服务器
  2. kubernetes:1.15
  3. JDK:1.8
  4. maven:3.6.3

工作节点的性能问题

Java程序员罕用Jenkins编译构建Maven我的项目,如果构建参数用的是默认配置,很容易呈现性能问题,接下来就用开源我的项目来重现此问题:

  • 在配置Jenkins的kubernetes插件时,依照理论硬件状况给工作pod调配的内存是1G,如下图:

  • 接下来从GitHub下载Flink的源码(1.8.3-rc3版本),而后编译构建,本次工作对应的pipeline源码如下:
pipeline {  agent {    label 'my-jenkins-jenkins-slave'  }   tools {    maven 'mvn-3.6.3'  }   stages {    stage('Checkout') {      steps {        echo '从GitHub下载flink工程的源码(1.8.3-rc3归档包)'        sh 'wget https://codeload.github.com/apache/flink/tar.gz/release-1.8.3-rc3'        echo '下载完结,解压归档包'        sh 'tar -zxf release-1.8.3-rc3'      }    }         stage('Build') {      steps {        echo '开始编译构建'        sh 'cd flink-release-1.8.3-rc3 && mvn clean package -U -s /home/jenkins/settings/settings.xml'      }    }  }}
  • 在执行编译构建工作过程中,点击下图红框中的灰色圆球,即可跳转到执行工作的Pod的日志页面:
  • 下图就是Pod日志页面,红框内显示工作呈现了异样,(此时正在执行单元测试用例)

  • 如下图红框所示,执行工作的Pod显示为离线状态:

  • 此时登录到kubernetes环境,查看Pod状态,如下图红框所示,执行工作的Pod状态为OOMKilled,看来是内存不足导致Podl被销毁了

第一次调节

因为Pod内存过小导致工作失败,能够在Jenkins的设置页面调节Pod内存,如下图所示,这次设置到6G,留神不要超出宿主机的硬件配置:

  • 反复执行一次上述工作,这一次内存短缺因此构建胜利。

察看

因为本次工作次要是执行maven编译构建,因而有必要理解一下maven过程的内存应用状况:

  • 在工作执行的过程中,找到Pod对应的docker容器,ID是c6d9e1b64581
  • 执行docker exec c6d9e1b64581 jps失去maven过程ID为96(名称为Launcher的那个)
  • 执行docker exec c6d9e1b64581 jmap -heap 96能够看到maven过程的JVM内存状况,如下图,可见maven理论应用内存只有3G左右:

  • 此时Pod有6G内存,能够通过参数设置给maven过程更多内存;

第二次调节

接下来尝试设置maven过程的内存参数,这里将大部分内存划分给老年代试试:

  • 如下图,进入设置页面:

  • 如下图,找到Pod Templates,新增环境变量,键是MAVEN_OPTS,值是-Xms5632m -Xmx5632m -Xmn512m -Xss256k,因为Pod总内存是6G,通过此设置后,整个Pod的零碎内存只剩512m,其余5632m内存全副划分给maven过程,并且maven过程的年老代只有512m,将所有内存都留给了老年代内存设置如下:

  • 保留设置后再次执行工作,先找到工作Pod对应的docker容器,再用jmap -heap命令查看maven过程的内存状况,如下图,5632m内存全副划分给了maven过程,并且年老代也管制在512m:

  • 下图是执行jstat命令查看maven过程的GC状况,红框中是YGC次数,蓝框中是FGC次数,因为年老代内存过小导致频繁YGC,不过FGC次数不多:


通过Jenkins设置页面,对工作的Pod以及对应的maven过程的自定义设置曾经实现,心愿本文能给您一些参考,帮忙您依据我的项目的特点做针对性的调节和优化。

欢送关注公众号:程序员欣宸

微信搜寻「程序员欣宸」,我是欣宸,期待与您一起畅游Java世界...
https://github.com/zq2599/blog_demos