![freeBSD 上的系统 CPU 使用率](https://linux22.com/image/693433/freeBSD%20%E4%B8%8A%E7%9A%84%E7%B3%BB%E7%BB%9F%20CPU%20%E4%BD%BF%E7%94%A8%E7%8E%87.png)
我需要运行大量小型作业。如果我在 6 核 Xeon Broadwell 上运行它们,它至少会使用 80-90% 的用户空间 CPU
如果我在具有 2X16 核 CPU Broadwell 的盒子上运行相同的任务,如果我扩展作业数量,我最终会得到 80% 的系统 CPU 使用率,并且吞吐量只有单个 6 核 CPU 的 3 倍,尽管拥有 5 倍的核心和更快的时钟速度。
有什么建议可以改进这一点吗?
编辑
如果作业低于某个大小,问题似乎会变得特别严重,如果它们在稍大的数据集上运行,系统 CPU 使用率就不会那么高 - 这让我怀疑 BSD 产生进程的速率存在某种限制。
如下建议
/usr/share/dtrace/toolkit/procsystime
为我们提供了 2x16 核心机器上的顶级条目
readlink 80898169570
select 128032327883
execve 215209078214
wait4 2127022159693
read 2545974471446
在 6 台核心机器上
_umtx_op 5997915963
select 8746697465
read 59777849114
wait4 61693132566
这似乎不足以解释这种非线性缩放的差异。
编辑
当系统处于这种负载下时,uname
每次循环运行需要半秒,而机器空闲时则需要几毫秒。这里似乎存在某种内核问题
答案1
分析将显示哪些内容占用了 CPU 时间。如果在系统中花费了大量时间,则关注系统调用可能会发现它。
Dtrace 对此很有帮助。 /usr/share/dtrace/toolkit/procsystime
它将通过系统调用显示 CPU 时间。如果您需要更多详细信息,作者有火焰图可视化工具。
答案2
在尝试追踪这个问题的根源并发现很多不一致之处后,我发现如果 CPU 负载超过 50%,系统时间就会开始快速增加。因此,我尝试在 BIOS 中禁用超线程,问题消失了,机器的吞吐量也大大提高了。
显然,BSD 和超线程不能很好地配合,至少对于这种类型的工作负载来说是这样。禁用超线程后,吞吐量增加了约 120%