具有超线程的服务器上计算密集型任务的最佳线程数

具有超线程的服务器上计算密集型任务的最佳线程数

在具有超线程技术的 Intel i7 四核处理器的服务器上运行计算密集型任务时,运行八个线程(用于八个虚拟核心)还是只运行四个线程(用于四个物理核心)比较理想?每个线程都可实现虚拟核心的 100% 一致利用率。

答案1

8 个线程是理想的,前提是结果合并或类似操作不会产生大量额外开销。如果只有 4 个线程,则每个虚拟核心的单个线程无法饱和的任何执行单元都将被浪费。如果是 8 个线程,则可以使用它们。

请注意,这仅适用于每个线程可以饱和一个核心的不切实际的假设。此外,如果处理器缓存资源的划分对性能产生负面影响,则它可能不适用。某些任务的性能在某个缓存大小时会“急剧下降”。如果您的临界点介于物理核心的完整缓存大小和该缓存大小的一半之间,那么四个线程可能会更好。

答案2

我在编译时学到的原则是核心数为 1.5 倍。这考虑到了线程/进程等待 I/O 的任何时间。

如果您的任务没有机会阻塞较慢的操作(如 I/O),那么可能没有必要超过核心数,但如果可以的话,您将需要比核心更多的进程。

换个角度看:如果您有四个内核和三个进程,那么您永远无法实现 100% 的 CPU 利用率。如果四个进程中有一个进程在 I/O 上阻塞,情况也是如此。如果您有六个进程且没有阻塞,那么效率可能会略低一些,因为内核会占用一些 CPU 时间在四个内核之间切换进程,但没有一个内核会处于空闲状态。

不幸的是,我不知道你的问题的物理/虚拟方面。

答案3

我的猜测是,每个核心使用一个任务并禁用超线程是最佳的。

如果我启动的 CPU 密集型线程数量与逻辑核心数量相同,那么 CPU 密集型任务的上下文切换速度会很快,但后台任务的上下文切换会很昂贵,因为超线程完全被 CPU 密集型任务消耗掉了。另一方面,如果我启动的 CPU 密集型线程数量与物理核心数量相同,那么这些任务的上下文切换不会发生,后台任务的上下文切换速度会很快。这似乎不错,但后台任务会找到空闲的逻辑处理器,几乎立即运行。它们就像是实时性能(不错的 -20)。

我不知道同一核上两个任务之间的上下文切换有多快。另外,我担心同一核上两个线程之间共享缓存会降低缓存命中频率(除非它们运行的​​是小于 1mb 的相同程序)。我怀疑这是否没有惩罚。我的直觉是,一个复杂的 CPU 密集型任务在每个核上运行一个任务比在每个虚拟处理器上运行一个任务要快。但是如果你这样做,你将留下两个虚拟处理器空闲,后台任务将获得不应有的优先级。

在第一种情况下,超线程是无用的,后台任务将使用昂贵的上下文切换,因为我在正常处理中将超线程用到了极致。第二种情况是不可接受的,因为我高达 50% 的 CPU 能力被优先用于后台任务。

我通常会在英特尔台式机和服务器上禁用超线程。我展示了如何https://serverfault.com/a/720471/309821

但这只是猜测。我觉得这样更好,但事实可能并非如此。

相关内容