1

K8S环境的Jenkin性能问题处理续篇(任务Pod设置)f

 1 year ago
source link: https://blog.51cto.com/zq2599/5882501
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

欢迎访问我的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.0_141
  4. maven:3.6.3

任务节点的性能问题

  • Java程序员常用Jenkins编译构建Maven项目,如果构建参数用的是默认配置,很容易出现性能问题,接下来就用开源项目来重现此问题:
  • 在配置Jenkins的kubernetes插件时,给任务pod分配的内存是1G,如下图:
    K8S环境的Jenkin性能问题处理续篇(任务Pod设置)f_maven
  • 接下来从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的日志页面:
    K8S环境的Jenkin性能问题处理续篇(任务Pod设置)f_jenkins_02
  • 下图就是Pod日志页面,红框内显示任务出现了异常,(此时正在执行单元测试用例)
    K8S环境的Jenkin性能问题处理续篇(任务Pod设置)f_kubernetes_03
  • 如下图红框所示,执行任务的Pod显示为离线状态:
    K8S环境的Jenkin性能问题处理续篇(任务Pod设置)f_kubernetes_04
  • 此时登录到kubernetes环境,查看Pod状态,如下图红框所示,执行任务的Pod状态为OOMKilled,看来是内存不足导致Podl被销毁了:
    K8S环境的Jenkin性能问题处理续篇(任务Pod设置)f_kubernetes_05

第一次调节(K8S参数)

  • 由于Pod内存过小导致任务失败,可以在Jenkins的设置页面调节Pod内存,如下图所示,这次设置到6G,注意不要超出宿主机的硬件配置:
    K8S环境的Jenkin性能问题处理续篇(任务Pod设置)f_kubernetes_06
  • 重复执行一次上述任务,这一次内存充足因而构建成功;
  • 由于本次任务主要是执行maven编译构建,因此有必要了解一下maven进程的内存使用情况:
  • 在任务执行的过程中,找到Pod对应的docker容器( kubectl describe pod xxx 命令),ID是 22484d8b1e56
  • 执行 docker exec 22484d8b1e56 jps 得到maven进程ID为 87 (名称为Launcher的那个),如下图:
    K8S环境的Jenkin性能问题处理续篇(任务Pod设置)f_maven_07
  • 执行 docker exec 22484d8b1e56 jmap -heap 87 可以看到maven进程的JVM内存情况,如下图,可见maven实际使用内存只有3G左右:
    K8S环境的Jenkin性能问题处理续篇(任务Pod设置)f_kubernetes_08
  • 此时Pod有6G内存,可以通过参数设置给maven进程更多内存;

第二次调节(JVM参数)

  • 接下来尝试设置maven进程的内存参数, 这里将大部分内存划分给老年代试试
  • 如下图,进入设置页面:
    K8S环境的Jenkin性能问题处理续篇(任务Pod设置)f_jenkins_09
  • 如下图,找到 Pod Templates ,新增环境变量,键是 MAVEN_OPTS ,值是 -Xms5632m -Xmx5632m -Xmn512m -Xss256k ,由于Pod总内存是6G,因此经过此设置后,整个Pod的系统内存只剩 512m ,其余5632m内存全部划分给maven进程,并且maven进程的年轻代只有512m,将所有内存都留给了老年代:
    K8S环境的Jenkin性能问题处理续篇(任务Pod设置)f_maven_10
  • 保存设置后再次执行任务,先找到任务Pod对应的docker容器,再用 jmap -heap 命令查看maven进程的内存情况,如下图,5632m内存全部划分给了maven进程,并且年轻代也控制在512m:
    K8S环境的Jenkin性能问题处理续篇(任务Pod设置)f_jenkins_11
  • 下图是执行jstat命令查看maven进程的GC情况,红框中是YGC次数,蓝框中是FGC次数,由于年轻代内存过小导致频繁YGC,不过FGC次数不多:
    K8S环境的Jenkin性能问题处理续篇(任务Pod设置)f_jenkins_12
  • 在构建过程中还发生过 StackOverflow 异常,如下图所示,解决办法依旧是调节参数 MAVEN_OPTS ,值是 -Xms5632m -Xmx5632m -Xmn512m -Xss512k ,也就是将线程栈内存放大一倍:
    K8S环境的Jenkin性能问题处理续篇(任务Pod设置)f_jenkins_13
  • 上述设置并非最优,而是验证MAVEN内存参数的调节可以生效;
  • 通过Jenkins设置页面对任务的Pod以及对应的maven进程的自定义设置已完成,希望本文能给您一些参考,帮助您根据项目的特点做针对性的调节和优化;

欢迎关注51CTO博客:程序员欣宸

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK