扩展管道

Pipeline的主要瓶颈之一是它将暂态数据写入磁盘经常以便运行中的管道能够处理意外的Jenkins重启或系统崩溃。必威国际有限公司这种持久性对许多用户都很有用,但它的性能成本可能是个问题。

Pipeline现在包含了一些特性,可以让用户通过减少写入磁盘的数据量和写入的频率来提高性能——在持久性方面付出的代价很小。在某些特殊情况下,如果Jenkins突然关闭而没有机会写数据,用户可能无法恢复或可视化运行pipeline。必威国际有限公司

因为这些设置包括速度和持久性的权衡,所以它们最初是可选择的。要启用性能优化模式,用户需要显式设置速度/耐久性设置管道。如果没有明确的选择,管道当前默认为“最大持久性”设置,并像过去一样写入磁盘。在相同的插件版本中,有一些针对这种模式的I/O优化,但好处要小得多。

如何设置速度/耐久性设置?

有3种方法来配置耐久性设置:

  1. 在全球范围内,您可以在“管理Jenkins”>“配置系统”下选择全局默认持久性设置,标签为“管道速度/持久性设置”。必威国际有限公司您可以使用下面更具体的设置来覆盖这些设置。

  2. 每个管道的工作:在作业配置的顶部,标记为“自定义管道速度/持久性级别”——这将覆盖全局设置。或者,使用“properties”步骤-该设置将应用于该步骤执行后的NEXT运行(相同的结果)。

  3. 对于多分支项目,每个分支:配置一个自定义分支属性策略(在SCM下),并为自定义管道速度/持久性级别添加一个属性。这将覆盖全局设置。您还可以使用“properties”步骤来覆盖该设置,但请记住,您可能必须再次运行该步骤才能撤销该设置。

持久性设置将在下一次适用的管道运行时生效,而不是立即生效。设置将显示在日志中。

高性能耐久性设置对我有帮助吗?

  • 是的,如果您的Jenkin必威国际有限公司s实例使用NFS、磁存储、同时运行许多pipeline或显示高iowait。

  • 是的,如果您运行的管道有很多步骤(超过几百个)。

  • 是的,如果您的Pipeline将大文件或复杂数据存储到脚本中的变量中,将该变量保留在将来使用的范围内,然后运行步骤。这听起来很特别,但发生的次数比你想象的要多。

    • 例如:readFile步骤,或者使用解析此类文件的配置信息实用程序步骤之一

    • 另一种常见模式是包含来自多个分支(日志、结果或统计数据)的数据的“摘要”对象。这通常是可见的,因为您将经常通过添加/追加或添加到它Map.put ()操作。

    • 数据的大数组或地图S的配置信息是这种情况的另一个常见的例子。

  • 如果你的pipeline花费了几乎所有的时间来等待一些shell/批处理脚本完成,那就不需要了。这并不是一个神奇的“快速”按钮!

  • 如果pipeline正在将大量数据写入日志(日志记录未改变),则不能。

  • 如果您不使用pipeline,或者您的系统因其他因素而负载过重,则不能。

  • 如果不为管道启用更高性能的模式,则不能。

我放弃这个持久性设置“权衡”的是什么?

不管设置如何,Jenkin必威国际有限公司s本身的稳定性都不会改变-它只适用于管道。对于pipeline来说,最糟糕的情况是回归到像Freestyle构建那样的情况——运行的管道不能持久保存瞬时数据,可能无法恢复或显示在Blue Ocean/Stage View/等中,但会显示日志。这会影响到只有运行管道,只有当詹金斯突然关闭,而不是优雅地完成之前。必威国际有限公司

一个“优雅”关闭Jenkins将经必威国际有限公司历一个完整的关闭过程,例如访问http://[Jenkins -server]/exit,或者使用正常的服务关闭脚本(如果Jenkins是健康的)。向Jenkins发送SIGTERM/SIGINT将触发优必威国际有限公司雅的关闭。注意,正在运行的管道不需要完成(您不需要使用/safeExit来关闭)。

一个“脏”关闭就是詹金斯无法进必威国际有限公司行正常的关闭过程。如果过程被强制终止,就会发生这种情况。最常见的原因是使用SIGKILL终止Jenkins进程或终止运行Jenkins的容器/VM。必威国际有限公司只要Jenkins进程能够恢复,简单地停止或暂停容器/VM就不会导致这种情况。必威国际有限公司灾难性的操作系统故障也可能导致脏关闭,包括Linux OOMKiller攻击Jenkins java进程以释放内存。必威国际有限公司

原子写道:所有设置除了“最大持久性”目前避免原子写入——这意味着,如果运行Jenkins的操作系统出现故障,用于写入磁盘的缓冲数据将不会被刷新,而是会丢失。必威国际有限公司这种情况非常罕见,但可能是容器或虚拟化操作导致操作系统停止或断开存储连接的结果。通常,这些数据很快被刷新到磁盘,因此数据丢失的时间很短。在Linux上,可以通过运行“sync”强制执行“刷新到磁盘”操作。在一些罕见的情况下,这也可能导致无法加载构建。

使用耐久性设置的要求

  • 必威国际有限公司Jenkins LTS 2.73+或更高(或每周2.62+)

  • 所有以下管道插件,至少必须安装指定的最小版本

    • 管道:API(工作流- API) v2.25

    • 管道:Groovy(工作流-cps) v2.43

    • 管道:作业(工作流-作业)v2.17

    • 管道:支持api(工作流-支持)v2.17

    • Pipeline: Multibranch(工作流- Multibranch) v2.17 -可选,只需要为多分支管道启用此设置。

  • 重新启动控制器以使用更新的插件-注意:您需要所有插件来利用优势。

什么是耐久性设置?

  • 性能优化模式("PERFORMANCE_OPTIMIZED") -极大地可以减少磁盘I / O。如果pipeline没有完成并且Jenkins没有被优雅地关闭必威国际有限公司,它们可能会丢失数据并像Freestyle项目一样运行-参见上面的详细信息。

  • 最大持久性("MAX_SURVIVABILITY") -行为就像流水线之前做的,最慢的选项。使用它来运行最关键的管道。

  • 较不持久,但稍快一点("SURVIVABLE_NONATOMIC")——每一步都写数据,但避免原子写。这比最大持久性模式快,特别是在网络文件系统上。它有一个小小的额外风险(详见“我要放弃什么:原子写作”)。

耐久性设置的建议最佳实践和提示

  • 对于大多数管道,特别是基本的构建测试管道或任何在需要时可以简单地再次运行的管道,使用“性能优化”模式。

  • 当您需要管道执行的有保证的记录(审计)时,对管道使用“最大持久性”或“较低持久性”模式。这两种模式记录每一步运行。例如,在以下两种情况下使用其中一种模式:

    • 您有一个修改关键基础设施状态的管道

    • 您进行生产部署

  • 为持久性设置设置一个全局默认的“性能优化”(见上面),然后在需要的地方为特定的管道作业或多分支管道分支(“主”或发布分支)设置“最大持久性”。

  • 您可以通过暂停Pipeline来强制它持久保存数据。

其他比例的建议

  • 对于更复杂的工作,请使用@ noncps注释函数。这意味着涉及更多的处理、逻辑和转换。这使您可以利用额外的Groovy和函数特性来获得更强大、更简洁和性能更好的代码。

    • 这仍然在控制器上运行,所以要注意工作的复杂性,但比原生Pipeline代码快得多,因为它不提供持久性,并使用更快的执行模型。不过,还是要注意CPU成本,当成本过高时,就将其转移给执行程序。

    • @NonCPS函数可以使用Groovy语言中更广泛的子集,比如迭代器和函数特性,这使得它们编写起来更简洁、更快。

    • @NonCPS功能不应该使用但是,您可以将Pipeline步骤的结果存储到变量中,并将其作为@NonCPS函数的输入。

      • 问题:不能保证使用某个步骤就会产生错误(有一个开放的RFE来实现它),但您不应该依赖该行为。您可能会看到异常处理不当。

    • 虽然普通的Pipeline被限制为可序列化的局部变量,但@NonCPS函数可以在内部使用更复杂的、不可序列化的类型(例如正则表达式匹配器等)。然而,参数和返回类型仍然应该是可序列化的。

      • 问题:不恰当的使用不保证会引起正常管道的错误(优化可能会掩盖这个问题),但依赖这种行为是不安全的。

    • 一般的问题:当使用正在运行的@NonCPS函数时,实际的错误有时会被管道吞噬,产生令人困惑的错误消息。可以使用try / catch块,并可能使用回声控件中的错误消息以纯文本打印

  • 只要有可能,运行Jenkins使用快速ssd支必威国际有限公司持的存储,而不是硬盘驱动器。这可以使巨大的的区别。

  • 一般说来,要使工具适合工作。当使用构建代理运行复杂流程时,可以考虑编写简短的Shell/Batch/Groovy/Python脚本。好的例子包括处理数据、与REST api交互通信以及解析/模板更大的XML或JSON文件。的上海而且蝙蝠步骤对调用它们很有帮助,特别是与returnStdout:真返回此脚本的输出并将其保存为一个变量(Scripted Pipeline)。

    • 流水线DSL不是为任意的网络和计算任务设计的——它是为CI/CD脚本设计的。

  • 如果适用的话,使用最新版本的Pipeline插件和脚本安全性。其中包括定期的性能改进。

  • 尝试通过减少运行的步骤数量和为Scripted Pipeline使用更简单的Groovy代码来简化管道代码。

  • 如果可以,整合相同类型的顺序步骤,例如使用一个Shell步骤调用一个助手脚本,而不是运行多个步骤。

  • 尽量限制pipeline写入日志的数据量。如果您正在写入数MB的日志数据,例如从构建工具写入日志数据,请考虑将其写入外部文件,压缩它,并将其作为构建工件存档。

  • 当Jenkins使用超必威国际有限公司过6 GB的堆时,请使用建议的垃圾收集调优选项减少垃圾收集暂停时间和开销。



这个页面有帮助吗?

请通过此提交您对此页的反馈快速形成

或者,如果您不想填写快速表单,您可以简单地说明您是否认为此页面有帮助?


看到现有的反馈在这里

Baidu