如何限制在docker容器中运行的python脚本调用的ffmpeg的资源?

时间:2017-07-24 07:12:51

标签: python docker ffmpeg resources docker-compose

我部署了一项服务,定期在我的服务器上进行视频编码;每次这样做,所有其他服务都会显着减慢。编码隐藏在多个抽象层下。限制任何这些层都没问题。 (例如,限制docker-container的工作方式与限制ffmpeg-sub进程一样。)

我的筹码:

  1. VPS(ubuntu:zesty)
  2. 搬运工-撰写
  3. docker-container(ubuntu:zesty)
  4. ffmpeg(通过python中的subprocess.check_call())
  5. 我想限制的内容:

    • CPU:单核
    • RAM:最大2 GB
    • HDD:最大4 GB

    如果需要,可以重新编译ffmpeg。

    在这个堆栈中放置限制的地方是什么?

4 个答案:

答案 0 :(得分:2)

您可以使用docker compose文件轻松完成:)

https://docs.docker.com/compose/compose-file/#resources

只需使用limits关键字并设置您的cpu使用情况!

答案 1 :(得分:1)

最好的办法是围绕cgroup编写一小组脚本; eithr在独立的Linux上或与docker容器一起使用。

对于前者,它基本上是通过创建一个新的cgroup完成的;为其指定资源并将主进程pid移动到创建的cgroup。详细说明位于https://www.cloudsigma.com/manage-docker-resources-with-cgroups/

对于后者,请参阅https://www.cloudsigma.com/manage-docker-resources-with-cgroups/

答案 2 :(得分:1)

在普通的docker中,您可以使用命令行选项实现每个限制:

容器可以限制为单个CPU核心(或当前英特尔硬件上的超线程):

docker run \
  --cpus 1 \
  image

或受Dockers CPU shares的限制,默认为1024.这只有在大多数速度减慢的任务也在Docker容器中时才有用,因此它们也被分配了Dockers共享。

docker run \
  --cpu-shares 512 \
  image

Limiting memory有点挑剔,因为如果达到限制,您的流程就会崩溃。

docker run \
  --memory-reservation 2000 \
  --memory 2048 \
  --memory-swap 2048 \
  image

Block or Device IO比总体空间更重要。这可以限制在每个设备上,因此如果您将数据保存在特定设备上以进行转换:

docker run \
  --volume /something/on/sda:/conversion \
  --device-read-bps /dev/sda:2mb \
  --device-read-iops /dev/sda:1024 \
  --device-write-bps /dev/sda:2mb \
  --device-write-iops /dev/sda:1024 \
  image 

如果您还想限制总磁盘使用量,则需要correct storage setupdevicemapperbtrfszfs存储驱动程序支持配额,并且在overlay2文件系统上使用xfs驱动程序时支持配额pquota选项。

docker run \
   --storage-opt size=120G
   image

撰写/服务

Docker撰写v3似乎已将这些概念中的一些概念抽象为可应用于服务/群的内容,因此您无法获得相同的细粒度控制。

对于v3文件,使用resources对象为cpu和内存配置limitsreservations

services:
  blah:
    image: blah
    deploy:
      resources:
        limits:
          cpu: 1
          memory: 2048M
        reservations:
          memory: 2000M

基于磁盘的限制可能需要支持设置限制的卷驱动程序。

如果您可以返回v2.2 Compose file,则可以在服务基础级别的容器上使用full range of constraints,类似于docker run选项:

cpu_countcpu_percentcpu_sharescpu_quotacpuscpusetmem_limitmemswap_limitmem_swappinessmem_reservationoom_score_adjshm_size

答案 3 :(得分:1)

  

我想限制的内容:

     

CPU:单核

     

RAM:最大2 GB

     

HDD:最大4 GB

其他答案已经从docker的角度解决了这个问题,这实际上可能是你在这种情况下最好的方法,但是这里有更多关于ffmpeg的见解:

常规

没有专门用于限制CPU,RAM和HDD的ffmpeg选项,你必须非常了解转码,以便按照您要求的方式点击指标,并且不需要输入文件的任何信息和输出文件是不可能给你具体的建议。编码和解码根据它们来自和去往的位置来获取不同的资源。

<强> CPU

这里最接近的是-threads选项,它将限制所使用的线程(而不是CPU核心)的总数,或者您可以提供0以允许最大线程。同样,不同的编码器/解码器/编解码器对此有不同的限制。

<强> RAM

根据您的媒体和编解码器选择,再次没有运气。

<强> HD​​D

我以前没有这样做,但看看这个article。如果这不起作用,您需要对整体输出比特率进行研究,并将其与输入视频持续时间进行比较。 -t选项可用于根据持续时间限制输出(或限制从输入读取)

<强>最后

  

......所有其他服务都显着放缓

这是预期的,ffmpeg会尝试占用您的机器资源,因为转码将允许,最好的办法是将转码移动到单独的服务器,特别是考虑到它已经在docker容器中。 / p>