我正在开发一个利用并行化的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秒
虽然并行执行的总时间比顺序执行的时间长,但我认为不应该是这样。我是否遗漏了什么,或者对并行化的工作原理有错误的理解?
1条答案
按热度按时间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的读/写速度。
虚拟机管理程序本身只有很少的资源。而且每个虚拟机都可以分配整个IO带宽。如果只在一个虚拟机上执行繁重的任务,那么所有虚拟机的性能可能会降低。
如果您在VM 1到5上使用此设置启动IO密集型任务,则每个VM将尝试尽可能多地分配IO带宽,从而导致整体性能非常差。如果虚拟机管理程序使用HDD而不是SSD,则此问题将变得更加明显和外推。
同样的理论也适用于运行Docker容器的情况。
由于您似乎是在不使用缓存(
pip3.8 install --no-cache-dir
)的情况下安装pip
包,这可能会产生密集的IO操作,因为python可能会获取包并进行编译。因此,你可以进入我上面描述的。或者,您的代理允许在同一代理上运行多个作业--同样会导致耗尽代理的资源。