前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >K8S环境的Jenkin性能问题处理续篇(任务Pod设置)

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

作者头像
程序员欣宸
发布2020-05-26 14:22:01
8000
发布2020-05-26 14:22:01
举报
文章被收录于专栏:实战docker实战docker

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

在K8S环境部署和使用Jenkins的细节请参考《Helm部署和体验jenkins》

任务节点的性能问题

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

  1. 在配置Jenkins的kubernetes插件时,给任务pod分配的内存是1G,如下图:
在这里插入图片描述
在这里插入图片描述
  1. 接下来从GitHub下载Flink的源码(1.8.3-rc3版本),然后编译构建,本次任务对应的pipeline源码如下:
代码语言:javascript
复制
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'
      }
    }
  }
}
  1. 在执行编译构建任务过程中,点击下图红框中的灰色圆球,即可跳转到执行任务的Pod的日志页面:
在这里插入图片描述
在这里插入图片描述
  1. 下图就是Pod日志页面,红框内显示任务出现了异常,(此时正在执行单元测试用例)
在这里插入图片描述
在这里插入图片描述
  1. 如下图红框所示,执行任务的Pod显示为离线状态:
在这里插入图片描述
在这里插入图片描述
  1. 此时登录到kubernetes环境,查看Pod状态,如下图红框所示,执行任务的Pod状态为OOMKilled,看来是内存不足导致Podl被销毁了:
在这里插入图片描述
在这里插入图片描述

第一次调节(K8S参数)

  1. 由于Pod内存过小导致任务失败,可以在Jenkins的设置页面调节Pod内存,如下图所示,这次设置到6G,注意不要超出宿主机的硬件配置:
在这里插入图片描述
在这里插入图片描述
  1. 重复执行一次上述任务,这一次内存充足因而构建成功;

观察

由于本次任务主要是执行maven编译构建,因此有必要了解一下maven进程的内存使用情况:

  1. 在任务执行的过程中,找到Pod对应的docker容器(kubectl describe pod xxx命令),ID是22484d8b1e56
  2. 执行docker exec 22484d8b1e56 jps得到maven进程ID为87(名称为Launcher的那个),如下图:
在这里插入图片描述
在这里插入图片描述
  1. 执行docker exec 22484d8b1e56 jmap -heap 87可以看到maven进程的JVM内存情况,如下图,可见maven实际使用内存只有3G左右:
在这里插入图片描述
在这里插入图片描述
  1. 此时Pod有6G内存,可以通过参数设置给maven进程更多内存;

第二次调节(JVM参数)

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

  1. 如下图,进入设置页面:
在这里插入图片描述
在这里插入图片描述
  1. 如下图,找到Pod Templates,新增环境变量,键是MAVEN_OPTS,值是-Xms5632m -Xmx5632m -Xmn512m -Xss256k,由于Pod总内存是6G,因此经过此设置后,整个Pod的系统内存只剩512m,其余5632m内存全部划分给maven进程,并且maven进程的年轻代只有512m,将所有内存都留给了老年代:
在这里插入图片描述
在这里插入图片描述
  1. 保存设置后再次执行任务,先找到任务Pod对应的docker容器,再用jmap -heap命令查看maven进程的内存情况,如下图,5632m内存全部划分给了maven进程,并且年轻代也控制在512m:
在这里插入图片描述
在这里插入图片描述
  1. 下图是执行jstat命令查看maven进程的GC情况,红框中是YGC次数,蓝框中是FGC次数,由于年轻代内存过小导致频繁YGC,不过FGC次数不多:
在这里插入图片描述
在这里插入图片描述
  1. 在构建过程中还发生过StackOverflow异常,如下图所示,解决办法依旧是调节参数MAVEN_OPTS,值是-Xms5632m -Xmx5632m -Xmn512m -Xss512k,也就是将线程栈内存放大一倍:
在这里插入图片描述
在这里插入图片描述
  1. 上述设置并非最优,而是验证MAVEN内存参数的调节可以生效;
  2. 通过Jenkins设置页面对任务的Pod以及对应的maven进程的自定义设置已完成,希望本文能给您一些参考,帮助您根据项目的特点做针对性的调节和优化;
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • K8S环境的Jenkin性能问题处理
  • 环境信息
  • 任务节点的性能问题
  • 第一次调节(K8S参数)
  • 观察
  • 第二次调节(JVM参数)
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档