【问题标题】:Limit cpu limit of process in a loop限制循环中进程的cpu限制
【发布时间】:2018-07-17 06:20:17
【问题描述】:

我正在尝试在多个文件的循环中执行ffmpeg。我只希望一次运行一个实例,并且只使用 50% 的 cpu。我一直在尝试cpulimit,但循环播放效果不佳。

for i in {1..9}; do cpulimit -l 50 -- ffmpeg <all the options>; done

这会同时产生所有九个工作,它们都归init 所有,所以我必须打开htop 才能杀死它们。

for i in {1..9}; do ffmpeg <all the options> & cpulimit -p $! -l 50; done

这挂了,ctrl+c 继续下一个循环迭代。这些实例只能被SIGKILL杀死。

【问题讨论】:

  • 我遇到了同样的问题,我使用以下方法修复了它,只需将 ffmpeg 命令写入txt 文件,并且每次我在 CPU 不忙时读取并执行命令时,也会从 @ 中删除已执行的命令987654330@文件,如果CPU忙于其他进程则跳过命令执行,一段时间后再次读取txt文件,
  • 你尝试过一种不错的/renice 的方法吗?
  • @Allan 不,我的问题是热量积聚,而不是资源争用。
  • @harishsharma 听起来您已经实现了 UltrasoundJelly 建议的任务调度程序。
  • 是的,但是我从基本方法创建了调度程序,没有使用任何库/存储库,

标签: bash loops ubuntu ffmpeg cpu-usage


【解决方案1】:

使用队列是要走的路。我使用的一个简单解决方案是Task Spooler。您也可以使用 -threads 限制 ffmpeg 使用的核心数量。这是给你的一些代码:

ts sh -c "ffmpeg -i INPUT.mp4 -threads 4 OUTPUT.mp4"
  • 您可以使用以下命令将最大同时任务数设置为 1:ts -S 1
  • 要查看当前队列,只需运行ts

【讨论】:

  • 排队,太棒了!一般来说,它也恰好有助于其他一些事情。对于(主要是我自己的)未来参考,一些更高级的调度程序(即 Slurm)允许细粒度的资源分配。
  • 看来我的 ffmpeg 可能不太关心-threadscpulimitts 也不好相处。
  • 有趣。您使用的是什么架构和编解码器?
  • 它和 AMD Bulldozer (x64) 和 h264 -> mjpeg
  • 我可以通过taskset -c 0,2,4 ffmpeg ... 实现类似的效果。奇怪的是,ffmpeg 仍在生成 10 个线程,其中 4 个处于活动状态,平均每个线程的运行率为 70%。
【解决方案2】:

如果您希望 -threads 选项对编码器产生影响,则应将其放在 -i 参数之后,输出文件名之前 - 您当前的选项仅告诉解码部分使用单个线程。因此,要使用单个线程保持所有内容,您需要 -threads 1 在 -i 选项之前和之后。所以你可以这样做:

ffmpeg -threads 1 -i INPUT.mp4 -threads 1 OUTPUT.mp4

【讨论】:

    【解决方案3】:

    您应该在前台运行它。这样循环将按预期工作。

    $ cpulimit --help
    ...
    -f  --foreground   launch target process in foreground and wait for it to exit
    

    这对我有用。

    for file in *.mp4; do
        cpulimit -f -l 100 -- ffmpeg -i "$file" <your options>
    done
    

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 1970-01-01
      • 2022-12-10
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 2018-03-17
      • 1970-01-01
      相关资源
      最近更新 更多