关于云计算:K8S环境的Jenkin性能问题处理续篇任务Pod设置

1次阅读

共计 1932 个字符,预计需要花费 5 分钟才能阅读完成。

欢送拜访我的 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

正文完
 0