并行Jenkins流水线阶段比顺序执行慢

cbwuti44  于 2023-05-16  发布在  Jenkins
关注(0)|答案(1)|浏览(231)

我正在开发一个利用并行化的Jenkins管道。然而,我面临着一个问题,即并行阶段似乎彼此减慢,而不是实现真正的并行性。下面是我使用的代码:

pipeline {
  agent any
  stages {
    stage('Dependencies') {
      when {
        anyOf {
          branch 'develop';
          branch 'demo';
          branch 'test';
        }
      }
      parallel{
        stage('Cloud Libraries') {
          steps {
            sh "umask 0000;" 
            sh "pip3.8 install --no-cache-dir -r requirements/cloud.txt -t ${WORKSPACE}/layers/cloud_libraries/python/"
          }
        }
        stage('Cellect Data Processing') {
          steps {
            sh "umask 0000;" 
            sh "pip3.8 install --no-cache-dir -r requirements/cellect/data_processing.txt -t ${WORKSPACE}/layers/cellect_data_processing/python/"
          }
        }
        stage('Cellect Warranty Processing') {
          steps {
            sh "umask 0000;" 
            sh "pip3.8 install --no-cache-dir -r requirements/cellect/warranty_processing.txt -t ${WORKSPACE}/layers/cellect_warranty_processing/python/"
          }
        }
        stage('Cellect Data Consumer') {
          steps {
            sh "umask 0000;" 
            sh "pip3.8 install --no-cache-dir -r requirements/cellect/data_consumer.txt -t ${WORKSPACE}/layers/cellect_data_consumer/python/"
          }
        }
        stage('Cellect BESS Control') {
          steps {
            sh "umask 0000;" 
            sh "pip3.8 install --no-cache-dir -r requirements/cellect/bess_control.txt -t ${WORKSPACE}/layers/cellect_bess_control/python/"
          }
        }

      }
    }
  }
}

以前,当顺序执行阶段时,各个时间如下:15秒20秒20秒7秒5秒然而,在将它们并行化之后,时间变成了:17秒24秒49秒50秒44秒
虽然并行执行的总时间比顺序执行的时间长,但我认为不应该是这样。我是否遗漏了什么,或者对并行化的工作原理有错误的理解?

mjqavswn

mjqavswn1#

如果没有关于代理配置的详细信息,很难猜测此问题的原因。
但是,我的猜测是检查代理运行的虚拟机管理程序是否过度使用。考虑以下示例:
1.你有一个24核,128 GB内存,SSD硬盘驱动器的虚拟机管理程序,可以做100 Gbps的读/写速度。
1.您有5个虚拟机-每个虚拟机分配4个核心,16 GB内存,并允许6 Gbps的读/写。
在上面的示例中,如果您在其中一个VM中执行过多的工作,其他VM的性能将不会受到影响,因为每个VM都有非常特定的约束,这些约束与虚拟机管理程序可以处理的内容一致。而且虚拟机管理程序本身有额外的可用资源。
现在考虑以下情况:
1.具有24个核心、64 GB RAM和SSD硬盘的虚拟机管理程序,可实现10 Gbps的读/写速度。

  1. 5个虚拟机-每个虚拟机分配4个内核、12 GB内存,并具有无限制的读/写速度。
    虚拟机管理程序本身只有很少的资源。而且每个虚拟机都可以分配整个IO带宽。如果只在一个虚拟机上执行繁重的任务,那么所有虚拟机的性能可能会降低。
    如果您在VM 1到5上使用此设置启动IO密集型任务,则每个VM将尝试尽可能多地分配IO带宽,从而导致整体性能非常差。如果虚拟机管理程序使用HDD而不是SSD,则此问题将变得更加明显和外推。
    同样的理论也适用于运行Docker容器的情况。
    由于您似乎是在不使用缓存(pip3.8 install --no-cache-dir)的情况下安装pip包,这可能会产生密集的IO操作,因为python可能会获取包并进行编译。因此,你可以进入我上面描述的。
    或者,您的代理允许在同一代理上运行多个作业--同样会导致耗尽代理的资源。

相关问题