![诊断 ffmpeg 高服务器负载](https://linux22.com/image/708140/%E8%AF%8A%E6%96%AD%20ffmpeg%20%E9%AB%98%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%B4%9F%E8%BD%BD.png)
有人能帮我解释一下为什么我的服务器负载这么高,但总 CPU 使用率却低于 50% 并且有大量可用 RAM 吗?
我在 Ryzen 1700X 上运行 60 个 ffmpeg 实例。
以下是一个示例:
top - 23:06:56 up 14 days, 9:18, 1 user, load average: 37.60, 29.48, 27.77
Tasks: 300 total, 4 running, 296 sleeping, 0 stopped, 0 zombie
%Cpu(s): 49.4 us, 2.9 sy, 24.2 ni, 22.3 id, 0.0 wa, 0.0 hi, 1.2 si, 0.0 st
KiB Mem : 65973428 total, 56648208 free, 6166708 used, 3158512 buff/cache
KiB Swap: 33521660 total, 33521660 free, 0 used. 58950204 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
26716 root 20 0 1785484 109948 15040 S 30.2 0.2 8:05.60 ffmpeg
26466 root 20 0 1785384 110252 15212 S 29.9 0.2 7:55.21 ffmpeg
23944 root 20 0 1784344 95248 14968 S 27.9 0.1 11:42.94 ffmpeg
26714 root 20 0 1786092 110624 15152 S 27.9 0.2 7:41.62 ffmpeg
22213 root 20 0 1784096 109416 15208 S 27.2 0.2 15:58.07 ffmpeg
24430 root 20 0 1785028 109392 15180 S 26.9 0.2 12:51.34 ffmpeg
23199 root 20 0 1783992 95164 15092 S 26.2 0.1 13:50.43 ffmpeg
26220 root 20 0 1785880 110148 15192 S 26.2 0.2 8:00.28 ffmpeg
以下是 mpstat -P ALL 的输出
root@Ubuntu-1604-xenial-64-minimal ~ # mpstat -P ALL
Linux 4.8.0-58-generic (Ubuntu-1604-xenial-64-minimal) 07/27/2017 _x86_64_ (16 CPU)
11:08:49 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:08:49 PM all 35.80 16.81 2.27 0.00 0.00 1.03 0.00 0.00 0.00 44.09
11:08:49 PM 0 34.66 12.75 3.47 0.00 0.00 10.27 0.00 0.00 0.00 38.85
11:08:49 PM 1 31.05 15.86 3.41 0.00 0.00 0.96 0.00 0.00 0.00 48.72
11:08:49 PM 2 38.62 16.16 2.55 0.00 0.00 0.60 0.00 0.00 0.00 42.07
11:08:49 PM 3 33.36 17.36 2.49 0.00 0.00 0.57 0.00 0.00 0.00 46.21
11:08:49 PM 4 39.13 16.26 2.47 0.00 0.00 0.49 0.00 0.00 0.00 41.65
11:08:49 PM 5 33.42 17.36 2.47 0.00 0.00 0.56 0.00 0.00 0.00 46.19
11:08:49 PM 6 39.25 16.22 2.43 0.00 0.00 0.47 0.00 0.00 0.00 41.63
11:08:49 PM 7 33.42 17.23 2.46 0.00 0.00 0.55 0.00 0.00 0.00 46.34
11:08:49 PM 8 38.73 17.16 1.89 0.00 0.00 0.28 0.00 0.00 0.00 41.94
11:08:49 PM 9 33.78 17.71 1.77 0.00 0.00 0.26 0.00 0.00 0.00 46.48
11:08:49 PM 10 38.76 17.25 1.88 0.00 0.00 0.27 0.00 0.00 0.00 41.84
11:08:49 PM 11 33.75 17.77 1.77 0.00 0.00 0.26 0.00 0.00 0.00 46.44
11:08:49 PM 12 38.68 17.15 1.88 0.00 0.00 0.27 0.00 0.00 0.00 42.02
11:08:49 PM 13 33.73 17.70 1.76 0.00 0.00 0.26 0.00 0.00 0.00 46.55
11:08:49 PM 14 38.67 17.18 1.88 0.00 0.00 0.27 0.00 0.00 0.00 41.99
11:08:49 PM 15 33.72 17.73 1.76 0.00 0.00 0.26 0.00 0.00 0.00 46.53
我有点担心负载会达到 35+,这是一个 8 核 16 线程 CPU,但徘徊在 35 左右似乎有点高。总带宽约为 30mbps(30 个视频流被编码为 2 个较小的比特率,因此有 60 个 ffmpeg 进程),带宽约为 100mbps,服务器有一个 1gbps 端口。
有谁知道为什么在拥有大量备用资源的高规格系统上负载如此之高?
答案1
Ryzen 1700X CPU 有 16 个线程,因此最多可以同时运行 16 个进程。60 个 ffmpeg 实例最多有 44 个等待轮到它们。由于进程也等待 I/O 完成,因此其他负载平均值为 37.60 似乎没问题。
如果你想使用 top 了解特定时刻 CPU 的繁忙程度,请将除id
空闲之外的百分比数字相加。你的输出:
%Cpu(s): 49.4 us, 2.9 sy, 24.2 ni, 22.3 id, 0.0 wa, 0.0 hi, 1.2 si, 0.0 st
对应的是 77.7%,而不是 50%。