我如何限制从docker容器中运行的python-script调用的ffmpeg的资源?

我部署了一个服务,定期在我的服务器上进行视频编码; 而且每次做的时候,所有其他的服务都会显着减慢。 编码隐藏在多层抽象下。 限制任何这些图层都可以。 (例如,限制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。

什么地方可以限制这个堆栈?

在普通的泊坞窗,你可以实现每个命令行选项的限制:

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

docker run \ --cpus 1 \ image 

或者受到Docker 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撰写文件 ,则可以在服务的基本级别上使用与docker run选项类似的容器上的全部约束条件 :

cpu_countcpu_percentcpu_sharescpu_quotacpuscpusetmem_limitmemswap_limitmem_swappinessmem_reservationoom_score_adjshm_size

你可以用你的docker撰写文件轻松完成:)

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

只需使用limits关键字并设置你的CPU使用率!

你最好的选择是围绕cgroup写一小段脚本。 在独立的linux上或与码头集装箱一起使用。

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

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

我想限制的是:

CPU:单核心

RAM:最大2 GB

硬盘:最大4 GB

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

一般

没有ffmpeg选项来专门限制CPU,RAM和HDD,你必须知道很多关于代码转换的命中,就像你要求的一样,没有关于输入文件和输出文件的任何信息,它不可能给你具体的建议。 编码和解码根据来自和去往的位置来获取不同的资源。

中央处理器

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

随机存取存储器

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

硬盘

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

最后

…所有其他服务显着减慢

这是可以预料的,ffmpeg试图占用转码所允许的尽可能多的机器资源,最好的办法是将转码转移到一个单独的服务器上,尤其是考虑到它已经在docker容器中了。