我部署了一项服务,定期在我的服务器上进行视频编码;每次这样做,所有其他服务都会显着减慢。编码隐藏在多个抽象层下。限制任何这些层都没问题。 (例如,限制docker-container的工作方式与限制ffmpeg-sub进程一样。)
我的筹码:
我想限制的内容:
如果需要,可以重新编译ffmpeg。
答案 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 setup。 devicemapper
,btrfs
和zfs
存储驱动程序支持配额,并且在overlay2
文件系统上使用xfs
驱动程序时支持配额pquota
选项。
docker run \
--storage-opt size=120G
image
Docker撰写v3似乎已将这些概念中的一些概念抽象为可应用于服务/群的内容,因此您无法获得相同的细粒度控制。
对于v3文件,使用resources
对象为cpu和内存配置limits
和reservations
:
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_count
,cpu_percent
,cpu_shares
,cpu_quota
,cpus
,cpuset
,mem_limit
,memswap_limit
,mem_swappiness
,mem_reservation
,oom_score_adj
,shm_size
答案 3 :(得分:1)
我想限制的内容:
CPU:单核
RAM:最大2 GB
HDD:最大4 GB
其他答案已经从docker的角度解决了这个问题,这实际上可能是你在这种情况下最好的方法,但是这里有更多关于ffmpeg的见解:
常规强>
没有专门用于限制CPU,RAM和HDD的ffmpeg选项,你必须非常了解转码,以便按照您要求的方式点击指标,并且不需要输入文件的任何信息和输出文件是不可能给你具体的建议。编码和解码根据它们来自和去往的位置来获取不同的资源。
<强> CPU 强>
这里最接近的是-threads
选项,它将限制所使用的线程(而不是CPU核心)的总数,或者您可以提供0
以允许最大线程。同样,不同的编码器/解码器/编解码器对此有不同的限制。
<强> RAM 强>
根据您的媒体和编解码器选择,再次没有运气。
<强> HDD 强>
我以前没有这样做,但看看这个article。如果这不起作用,您需要对整体输出比特率进行研究,并将其与输入视频持续时间进行比较。 -t
选项可用于根据持续时间限制输出(或限制从输入读取)
<强>最后强>
......所有其他服务都显着放缓
这是预期的,ffmpeg会尝试占用您的机器资源,因为转码将允许,最好的办法是将转码移动到单独的服务器,特别是考虑到它已经在docker容器中。 / p>