multithreading - 100% 使用某些内核是否会影响在 Linux 中不同内核上运行的进程(C++,多线程)的性能?

标签 multithreading boost multicore

在一个 32 核系统中,进程 (A) 完全消耗 4 个核(顶部 400% cpu 使用率)。其余核心可用。它会影响另一个进程(B)的性能吗?如果进程 (A) 没有运行,进程 (B) 会运行得更好吗?为什么?

Process(B) 正在使用 boost 和多个线程(比如 24)。

我原以为进程 B 的性能不会受到进程 A 的影响,因为它有 32 个内核。

最佳答案

一般来说,是的,即使并非所有内核都处于事件状态,运行一个进程也会减慢其他进程的速度。实际上,影响很大程度上取决于正在执行的代码。

这可能是因为一些硬件资源是共享的。最常见的是存储设备、网络、RAM、LLC 缓存(通常是 L3)。例如,很少的内核通常足以使 RAM 带宽饱和,因此如果两个进程受内存限制,使用 8 个以上的内核通常不会明显更快。 HDD 存储设备往往不会并行地更快,因此当 2 个进程试图同时大量使用它时,它们通常会慢得多。实际上,它们的速度可能会慢 2 倍以上,因为 HDD 的提取时间很长,而且进行多次随机访问的进程会大大减慢读取/写入大型连续文件的进程。

在 NUMA 系统上,事情可能有点复杂,因为在同一 NUMA 节点上运行的 2 个进程可能比在不同 NUMA 节点上运行的 2 个进程慢,这是由于目标节点的 RAM 饱和和 NUMA 分配策略。在极少数情况下,在不同 NUMA 节点上运行的 2 个进程可能比在同一 NUMA 节点上运行慢。如果进程相互通信(由于属于不同 NUMA 节点的核心之间的延迟较高)或者如果进程与绑定(bind)到特定 NUMA 节点的硬件资源通信,而不是进程正在运行的节点(例如,一个具有高性能互连的 GPU、高性能 Infiniband 设备等)

请注意,一些软件资源也可以共享。操作系统可以锁定它们以简化其代码某些部分的维护,或者仅仅因为资源不能从根本上以可扩展的方式并行使用。历史上,一些操作系统使用 giant lock阻止几乎所有的系统调用规模化。由于多核处理器的民主化,这种锁已逐渐被更细粒度的锁或根本没有锁(例如原子锁)所取代。请注意,即使是原子数据结构在大多数处理器上也无法很好地扩展,因此在同一数据结构上运行的系统调用往往会影响多核系统上其他正在运行的进程。不过,最大的问题通常是共享硬件资源的饱和。

关于multithreading - 100% 使用某些内核是否会影响在 Linux 中不同内核上运行的进程(C++,多线程)的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74517360/

相关文章:

c++ - 是大括号可构造的类型特征

c++ - 使用 boost::spirit::karma 生成时如何避免 boost::phoenix

Java 可见性和同步 - Thinking in Java 示例

java - 关于按顺序连接线程

java - interned 字符串上的嵌套同步块(synchronized block)

c++ - 在大数据上使用 boostfiltering_streambuf

java - 工作线程阻塞 GUI 重绘

linux - 需要考虑在 Linux 上使用 C 语言分析多线程

docker run --cpuset 没有任何效果

multithreading - 用于向内核分配线程的API