在具有超线程的英特尔i7四核处理器的服务器上运行计算密集型任务时,运行八个线程(八个虚拟内核)还是四个(四个物理内核)是理想select? 每个线程实现虚拟核心的100%一致利用率。
8个线程将是理想的,假设结果组合或类似的东西没有额外的额外开销。 只有四个线程,每个虚拟内核单线程无法饱和的任何执行单元都将被浪费。 八个线程可以使用。
请注意,这只适用于不切实际的假设,即每个线程可以饱和一个核心。 另外,如果处理器高速caching资源的划分对性能产生负面影响,则可能不适用。 某些任务的性能在某个caching大小下“跌倒悬崖”。 如果你的悬崖在物理核心的全部caching大小和caching大小的一半之间,那么四个线程可能会更好。
我在编译时所教授的原则是核心数量的1.5倍。 当线程/进程等待I / O时,这个任何时候都会占用。
如果你的任务没有机会阻止像I / O这样的较慢的操作,那么可能不需要超出内核的数量,但是如果可以的话,你将需要比内核更多的进程。
这样看:如果你有四个核心和三个进程,你永远不能达到100%的CPU。 当其中一个阻塞I / O时,四个进程也是如此。 如果你有六个进程没有阻塞,你可能会稍微低效一些,因为内核使用一些CPU时间来交换四个内核的进程和closures进程,但是没有内核会空闲。
不幸的是,我不知道你的问题的物理/虚拟方面。
我的猜测是每个内核使用一个任务并禁用超线程是最佳select。
如果我启动的CPU密集线程数与我的逻辑内核数量相同,那么对于cpu密集型任务,我将拥有快速的上下文切换,但是对于后端任务,由于CPU密集型任务完全消耗了超线程,所以开销很大。 另一方面,如果我启动的CPU密集型线程数与物理内核数量相同,那么我将没有上下文切换到后台任务的上下文切换。 看起来不错,但后台任务将会find免费的逻辑处理器,并且几乎可以正常运行。 这就像他们是实时表演(好-20)。
我不知道同一个内核上两个任务之间的上下文切换有多快。 另外我担心,通过共享同一个内核上的两个线程之间的caching会降低caching命中频率(除非它们运行的是相同的小于1mb的程序)。 我怀疑这是没有处罚。 我的直觉是,一个复杂的CPU密集型任务在每个内核的一个任务上的运行速度比每个虚拟处理器的一个任务快。 但是,如果你这样做,你将离开两个虚拟处理器,后台任务将获得他们不应该拥有的优先权。
在第一种情况下,超线程是uselles,后台任务将使用昂贵的上下文切换,因为我用正常处理超出了超线程。 第二个是不可能的,因为我的cpu能力的50%被优先考虑到后台任务。
我通常禁用我的英特尔桌面和服务器上的超线程。 我在https://serverfault.com/a/720471/309821显示如何。
但这是基于猜测。 我有一个更好的印象,但可能不会。