ffmpeg 没有使用所有核心

ffmpeg 没有使用所有核心

我刚刚购买了一台带有两个英特尔 E5-2695 处理器的新服务器,但令人震惊的是,FFmpeg 或 Ubuntu 没有利用所有内核。

top以下是FFmpeg 运行时的输出:

top - 23:35:25 up  2:41,  2 users,  load average: 5.35, 4.37, 3.12
Tasks: 333 total,   2 running, 331 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  1.0 sy, 35.6 ni, 63.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.0 us,  0.7 sy, 35.5 ni, 63.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.0 us,  0.7 sy, 33.4 ni, 65.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  0.0 us,  0.0 sy, 32.7 ni, 67.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu4  :  0.0 us,  0.3 sy, 32.3 ni, 67.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu5  :  0.0 us,  0.3 sy, 33.0 ni, 66.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu6  :  0.0 us,  0.0 sy, 32.6 ni, 67.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu7  :  0.0 us,  0.3 sy, 32.7 ni, 67.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu8  :  0.0 us,  0.7 sy, 32.6 ni, 66.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu9  :  0.0 us,  0.3 sy, 33.9 ni, 65.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu10 :  0.0 us,  0.0 sy, 35.0 ni, 65.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu11 :  0.0 us,  0.7 sy, 30.0 ni, 69.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu12 : 21.1 us,  0.0 sy,  0.0 ni, 78.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu13 :  0.7 us,  0.0 sy,  4.3 ni, 95.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu14 :  0.3 us,  0.0 sy,  5.0 ni, 94.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu15 : 24.9 us,  0.0 sy,  0.0 ni, 75.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu16 :  0.3 us,  0.0 sy,  3.7 ni, 96.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu17 :  0.7 us,  0.3 sy,  4.9 ni, 94.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu18 :  1.0 us,  0.0 sy,  4.6 ni, 94.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu19 :  0.7 us,  0.0 sy,  4.7 ni, 94.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu20 : 11.1 us,  0.0 sy,  0.0 ni, 88.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu21 :  1.3 us,  0.0 sy,  4.6 ni, 94.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu22 :  2.0 us,  0.3 sy,  4.3 ni, 93.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu23 : 96.7 us,  1.0 sy,  0.0 ni,  2.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu24 :  0.0 us,  0.0 sy,  0.7 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu25 :  0.0 us,  0.0 sy,  3.0 ni, 97.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu26 :  0.0 us,  0.0 sy,  1.3 ni, 98.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu27 :  0.0 us,  0.0 sy,  4.0 ni, 96.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu28 :  0.0 us,  0.0 sy,  1.7 ni, 98.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu29 :  0.0 us,  0.0 sy,  1.7 ni, 98.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu30 :  0.0 us,  0.0 sy,  1.7 ni, 98.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu31 :  0.0 us,  0.0 sy,  1.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu32 :  0.0 us,  0.0 sy,  0.7 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu33 :  0.0 us,  0.0 sy,  1.7 ni, 98.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu34 :  0.0 us,  0.0 sy,  2.0 ni, 98.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu35 :  0.0 us,  0.0 sy,  1.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu36 :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

这是我尝试过的:

  • 使用 FFmpeg 发送-threads 0
  • 使用 FFmpeg 发送-threads 500
  • 使用以下代码编译 FFmpeg--enable-pthreads
  • 环境-sws_flags fast_bilinear
  • 运行nice -20

从该截图中你可以看到只有第一个线程被充分利用了,并且只有前几个线程在running state,其余的都在sleep state

在此处输入图片描述

这是我正在使用的命令:

ffmpeg -i hdvd.mkv -map 0:0 -map 0:1 -threads 0 
  -s 1836x1080 -map 0:0 -map 0:1 -vf -vcodec libx264 -acodec aac -strict experimental -movflags faststart hdvd_1080p.mp4 
  -s 1224x720 -map 0:0 -map 0:1 -vf -vcodec libx264 -acodec aac -strict experimental -movflags faststart hdvd_720p.mp4 
  -s 816x480 -map 0:0 -map 0:1 -vf -vcodec libx264 -acodec aac -strict experimental -movflags faststart hdvd_480p.mp4 
  -s 612x360 -map 0:0 -map 0:1 -vf -vcodec libx264 -acodec aac -strict experimental -movflags faststart hdvd_360p.mp4 
  -s 408x240 -map 0:0 -map 0:1 -vf -vcodec libx264 -acodec aac -strict experimental -movflags faststart hdvd_240p.mp4 
  -s 244x144 -map 0:0 -map 0:1 -vcodec libx264 -acodec aac -strict experimental -movflags faststart hdvd_144p.mp4

FFmpeg 信息:

ffmpeg version N-57989-g76a47d6 Copyright (c) 2000-2013 the FFmpeg developers
  built on Nov  9 2013 14:28:54 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
  configuration: --enable-gpl --enable-libass --enable-libfaac --enable-libfdk-aac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libspeex --enable-librtmp --enable-libtheora --enable-libvorbis --enable-libvpx --enable-x11grab --enable-libx264 --enable-nonfree --enable-version3 --enable-pthreads

答案1

x264 的线程非常多。如果您能够足够快地向其提供帧,它应该能够使用 100% 的 CPU。因此,瓶颈在于其他方面。就您而言,最有可能是缩放器。缩放实际上是一个非常困难的问题,并且在 ffmpeg 中是单线程的。要测试这个理论,您可以尝试使用快速缩放器,例如-sws_flags fast_bilinear。每个输出运行单独的命令也可能会有所帮助。

答案2

我不完全了解 ffmpeg 内部是如何工作的,但看到一半的内核处于空闲状态是很正常的。CPU 利用率与内核利用率不同。一个进程只能使用一个 CPU,所以这是主要问题。您可以进一步阅读这个答案了解多 CPU 编程背后的想法。

另外正如@szatmary 回复的那样,您应该确保 ffmpeg 每秒提供足够的帧数。

相关内容