gpt4 book ai didi

docker - Vivado Synthesis 卡在 Jenkins 生成的 Docker 容器中

转载 作者:行者123 更新时间:2023-12-02 17:42:21 27 4
gpt4 key购买 nike

我正在尝试将我们的大型 FPGA 构建移动到 Jenkins CI 环境中,但是当在 Jenkins 生成的 Docker 容器中运行时,构建会在综合结束时挂起。

我试图复制 Jenkins 正在创建的环境,但是当我自己生成一个 Docker 容器时,构建没有问题。

我试过了:

  • 减少 Vivado 使用的作业(又名线程)的数量,思考
    也许在写作时发生了一些线程冲突
    输出日志文件
  • 在同一张纸条上,使用了 -nolog -nojournal vivado 上的选项
    删除任何日志文件冲突的命令
  • 控制克隆/ checkout 的项目并运行命令
    作为 Docker 容器中的本地用户

  • 我还有一个非常小的构建,它可以毫无问题地通过 Jenkins 的整个构建过程,所以我认为我的 Docker 容器没有根本缺陷。
    agent {
    docker {
    image "vivado:2017.4"
    args """
    -v <MOUNT XILINX LICENSE FILE>
    --dns <DNS_ADDRESS>
    --mac-address <MAC_ADDRESS>
    """
    }
    }
    steps {

    sh "chmod -R 777 ."

    dir(path: "${params.root_dir}") {
    timeout(time: 15, unit: 'MINUTES') {
    // Create HLS IP for use in Vivado project
    sh './run_hls.sh'
    }
    timeout(time: 20, unit: 'MINUTES') {
    // Create vivado project, add sources, constraints, HLS IP, generated IP
    sh 'source source_vivado.sh && vivado -mode batch -source tcl/setup_proj.tcl'
    }
    timeout(time: 20, unit: 'MINUTES') {
    // Create block designs from TCL scripts
    sh 'source source_vivado.sh && vivado -mode batch -source tcl/run_bd.tcl'
    }
    timeout(time: 1, unit: 'HOURS') {
    // Synthesize complete project
    sh 'source source_vivado.sh && vivado -mode batch -source tcl/run_synth.tcl'
    }
    }
    }

    下面的代码块正在运行 1 个作业,超时时间为 12 小时。您可以看到 Synthesis 已完成,然后在 8 小时后发生超时。
    [2019-04-17T00:30:06.131Z] Finished Writing Synthesis Report : Time (s): cpu = 00:01:53 ; elapsed = 00:03:03 . Memory (MB): peak = 3288.852 ; gain = 1750.379 ; free physical = 332 ; free virtual = 28594
    [2019-04-17T00:30:06.131Z] ---------------------------------------------------------------------------------
    [2019-04-17T00:30:06.131Z] Synthesis finished with 0 errors, 0 critical warnings and 671 warnings.
    [2019-04-17T08:38:37.742Z] Sending interrupt signal to process
    [2019-04-17T08:38:43.013Z] Terminated
    [2019-04-17T08:38:43.013Z]
    [2019-04-17T08:38:43.013Z] Session terminated, killing shell... ...killed.
    [2019-04-17T08:38:43.013Z] script returned exit code 143

    在本地生成的 Docker 容器中运行相同的命令没有任何问题。不幸的是, timeout Jenkins 步骤似乎没有刷新打开的缓冲区,因为我的 post:unsuccesful打印出所有日志文件的步骤未找到 synth_1 ,尽管我不希望与 Jenkins 的捕获有任何不同。

    Jenkins/Vivado 集成是否存在任何已知问题?有没有办法进入 Jenkins 生成的容器,这样我就可以尝试复制我所期待的和我正在经历的?

    编辑:我已经在实际的 tcl 脚本中添加了一个超时以移过 wait_on_runs run_synth.tcl 中使用的命令,但现在我在实现过程中遇到了同样的挂起行为。

    最佳答案

    问题在于 vivado 处理(或不处理...)其 fork 进程的方式。具体来说,我认为这适用于并行合成。这也许就是为什么您只在某些项目中看到它的原因。在您上面描述的状态下(在“合成完成”之后卡住)我注意到几个废弃的 vivado 僵尸进程。据我了解,这些是结束的子进程,但 parent 在结束自己之前没有收集状态。使用 strace 进行跟踪甚至显示 vivado 试图杀死这些进程:

    restart_syscall(<... resuming interrupted nanosleep ...>) = 0
    kill(319, SIG_0) = 0
    kill(370, SIG_0) = 0
    kill(422, SIG_0) = 0
    kill(474, SIG_0) = 0
    nanosleep({tv_sec=5, tv_nsec=0}, 0x7f86edcf4dd0) = 0
    kill(319, SIG_0) = 0
    kill(370, SIG_0) = 0
    kill(422, SIG_0) = 0
    kill(474, SIG_0) = 0
    nanosleep({tv_sec=5, tv_nsec=0}, <detached ...>

    但是(众所周知)你不能杀死僵尸,他们已经死了......

    通常这些进程将被 init 进程采用并在那里处理。但是对于 Docker 中的 Jenkins Pipeline,默认情况下没有 init。管道生成容器并运行 cat没有输入来保持它的活力。这边 cat变为 pid 1 并带走 vivado 的弃子。 cat 当然不知道如何处理它们并忽略它们(真的是悲剧)。
    cat,1
    |-(sh,16)
    |-sh,30 -c ...
    | |-sh,31 -c ...
    | | `-sleep,5913 3
    | `-sh,32 -xe /home/user/.jenkins/workspace...
    | `-sh,35 -xe /home/user/.jenkins/workspace...
    | `-vivado,36 /opt/Xilinx/Vivado/2019.2/bin/vivado -mode tcl ...
    | `-loader,60 /opt/Xilinx/Vivado/2019.2/bin/loader -exec vivado -mode tcl ...
    | `-vivado,82 -mode tcl ...
    | |-{vivado},84
    | |-{vivado},85
    | |-{vivado},111
    | |-{vivado},118
    | `-{vivado},564
    |-(vivado,319)
    |-(vivado,370)
    |-(vivado,422)
    `-(vivado,474)

    幸运的是,有一种方法可以在 docker 容器中拥有一个 init 进程。通过 --init docker run 的参数为我解决了这个问题。
    agent {
    docker {
    image 'vivado:2019.2'
    args '--init'
    }
    }

    这创建了 vivado 似乎依赖的 init 进程,并且构建运行没有问题。

    希望这对你有帮助!

    干杯!

    关于docker - Vivado Synthesis 卡在 Jenkins 生成的 Docker 容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55733058/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com