![如何在具有虚拟核心的系统中加载一个物理 CPU?](https://linux22.com/image/757324/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%85%B7%E6%9C%89%E8%99%9A%E6%8B%9F%E6%A0%B8%E5%BF%83%E7%9A%84%E7%B3%BB%E7%BB%9F%E4%B8%AD%E5%8A%A0%E8%BD%BD%E4%B8%80%E4%B8%AA%E7%89%A9%E7%90%86%20CPU%EF%BC%9F.png)
我有一台 AMD 处理器,有 4 个物理核心,并且启用了 SMT。由于启用了后者,我在 Linux 机器上看到了 8 个虚拟核心。
例如,stress
命令可以生成许多在 sqrt() 上旋转的 worker。如果我stress
使用-c 1
选项运行,使用mpstat
我会看到一个虚拟核心使用率为 100%。因此,根据我的理解,一个虚拟核心已完全加载,这基本上意味着一个物理核心已完全加载。我理解得对吗?
有没有办法确定一个物理 CPU 的负载?我想看看 Linux 在指标中如何显示它。
PS. 我想了解如何监控具有虚拟核心的系统上的 CPU 负载,并且我不确定我的方法是否正确,但目前我还没有其他想法。
答案1
很少有单线程可以充分将所有资源加载到 CPU 上。这就是 SMT 存在的原因,通过超额订阅物理核心上的逻辑处理器来提高利用率。但是,SMT 线程比核心弱。
保守的做法是根据核心而不是线程来规划容量。这样,任务可以最大限度地减少对处理器资源的争用。
观察应用程序的性能指标,即以用户体验为中心的指标,如用户响应时间或作业吞吐量。当这些指标开始下降时,查看平均负载或 CPU 繁忙等性能计数器。以及所有其他子系统,如内存、存储和文件系统、网络等。寻找瓶颈和症状。Brendan Gregg 的 Linux 性能页面是分析性能的综合方法的良好参考。
Linux 是 SMP(和 NUMA)感知的,调度程序将尽可能避免昂贵的核心和插槽转换。并首先为每个核心加载一个任务。使用 验证系统是否具有超过 1 个“每个核心的线程” lscpu
。启动几个 CPU 密集型作业。每个 CPU 监控工具(如) mpstat -P ALL 5
将显示一些 CPU 已加载,而另一些未加载的模式。