繁体   English   中英

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

[英]How do I limit resources for ffmpeg, called from a python-script, running in a docker container?

我部署了一项服务,该服务会定期在服务器上进行视频编码; 每次这样做,所有其他服务都会大大减慢速度。 编码隐藏在多层抽象之下。 限制任何这些层都可以。 (例如,限制docker-container和限制ffmpeg-sub进程一样有效。)

我的堆栈:

  1. VPS(ubuntu:zesty)
  2. 码头工人组成
  3. docker-container(ubuntu:zesty)
  4. 蟒蛇
  5. ffmpeg(通过python中的subprocess.check_call())

我想限制的是:

  • CPU:单核
  • RAM:最大2 GB
  • 硬盘:最大4 GB

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

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

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

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

只需使用limits关键字并设置您的CPU使用率即可!

最好的选择是在cgroup周围编写少量脚本; 在独立Linux上或与Docker容器一起使用。

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

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

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

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

docker run \
  --cpus 1 \
  image

或受Dockers CPU共享限制,默认为1024。这仅在您减慢的大多数任务也位于Docker容器中时才有帮助,因此也要为其分配Dockers共享。

docker run \
  --cpu-shares 512 \
  image

限制内存有点挑剔,因为如果达到极限,您的进程就会崩溃。

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

块或设备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 

如果还想限制总磁盘使用量,则需要具有正确的存储设置 devicemapperbtrfszfs存储驱动程序以及在与pquota选项一起安装的xfs文件系统上使用时, overlay2驱动程序都支持配额。

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

撰写/服务

Docker compose v3似乎已经将其中一些概念抽象为可以应用于服务/群的内容,因此您不会获得相同的细粒度控制。

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

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

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

如果您可以返回v2.2 Compose文件 ,则可以在服务的基础级别上对容器使用全部约束 ,类似于docker run选项:

cpu_countcpu_percentcpu_sharescpu_quotacpuscpusetmem_limitmemswap_limitmem_swappinessmem_reservationoom_score_adjshm_size

我想限制的是:

CPU:单核

RAM:最大2 GB

硬盘:最大4 GB

其他解决方案从docker的角度解决了这个问题,这实际上可能是您在这种情况下的最佳方法,但是这里为您提供了关于ffmpeg的更多见解:

一般

没有用于限制CPU,RAM和HDD的ffmpeg选项,您必须非常了解有关转码以达到要求的指标的要求,特别是在您所请求的情况下,并且在输入文件和输出文件上没有任何信息无法为您提供具体建议。 编码和解码会根据资源的来源和去向获取不同的资源。

中央处理器

您在此处拥有的最接近的东西是-threads选项,该选项将限制使用的线程总数(不是CPU内核),或者您可以提供0以允许最大线程数。 同样,不同的编码器/解码器/编解码器对此有不同的限制。

内存

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

硬碟

我以前没有做过,但是请看一下这篇文章 如果这不起作用,则需要研究整体输出比特率,并将其与输入视频时长进行比较。 -t选项可用于根据持续时间来限制输出(或限制从输入中读取)

最后

...所有其他服务的速度大大降低

这是预料之中的,ffmpeg尝试占用转码所允许的尽可能多的机器资源,最好的选择是将转码移动到单独的服务器上,尤其是考虑到它已经在docker容器中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM