我如何限制从docker容器中运行的python-script调用的ffmpeg的资源?
我部署了一个服务,定期在我的服务器上进行视频编码; 而且每次做的时候,所有其他的服务都会显着减慢。 编码隐藏在多层抽象下。 限制任何这些图层都可以。 (例如,限制docker-container的作用就像限制ffmpeg-sub进程一样。)
我的堆栈:
- VPS(ubuntu:zesty)
- 泊坞窗,撰写
- docker-container(ubuntu:zesty)
- 蟒蛇
- 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
如果您还想限制总磁盘使用率,则需要具有正确的存储设置 。 在devicemapper
, btrfs
和zfs
存储驱动程序上支持配额,在使用pquota
选项挂载的xfs
文件系统上使用overlay2
驱动程序时也支持配额。
docker run \ --storage-opt size=120G image
撰写/服务
Docker compose v3似乎已经将这些概念中的一些概念抽象为可以应用于服务/群集的概念,因此您不会得到相同的细粒度控制。
对于v3文件,使用resources
对象为cpu和内存配置limits
和reservations
:
services: blah: image: blah deploy: resources: limits: cpu: 1 memory: 2048M reservations: memory: 2000M
基于磁盘的限制可能需要支持设置限制的卷驱动程序。
如果您可以回到v2.2撰写文件 ,则可以在服务的基本级别上使用与docker run
选项类似的容器上的全部约束条件 :
cpu_count
, cpu_percent
, cpu_shares
, cpu_quota
, cpus
, cpuset
, mem_limit
, memswap_limit
, mem_swappiness
, mem_reservation
, oom_score_adj
, shm_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容器中了。