VMware / SQL - 物理内核 vs 逻辑内核 - 在启用超线程(HT)时分配多少个vCPU

我们有一个ESX主机:

它有2个CPU,每个CPU有8个核心,并且启用了超线程。所以,总共有16个物理核心或32个逻辑核心。 它上面只有一个专用的SQL虚拟机(没有其他虚拟机在此主机上运行),并且分配了16个虚拟CPU。

SQL NUMA配置如下:

这是否意味着这16个vCPU映射到1个CPU中的16个逻辑核心,而另一个包含16个逻辑核心的CPU处于空闲状态?将其增加到32个vCPU会有所不同吗?

我找到了这篇文章,它说不要分配多于实际物理核心数量的vCPU,无论逻辑核心如何。为什么不能这样做?


1那篇文章没有说明原因,但它提供了另一篇解释原因的文章链接。你看过吗? - Michael Hampton
刚刚读了这篇文章,链接在这里。是的,它解释了为什么最好分配一个物理核心而不是一个超线程核心,所以16个虚拟CPU会被安排在CPU1上的8个和CPU2上的8个,而不是全部16个都在CPU1上。 - d-_-b
@MichaelHampton,但是等一下..那只有在它们全部需要100%的CPU时才会这样,但如果它们不需要,那么拥有32个虚拟CPU将会利用闲置的CPU周期,对吧? - d-_-b
1我非常确定这是ESXi特有的。可能也适用于旧版本的ESXi。其他虚拟化软件可能没有这种限制。例如,KVM完全能够向客户机呈现超线程虚拟CPU或几乎任意的虚拟CPU拓扑,并且在主机具有超线程CPU时没有这样的限制或性能问题。 - Michael Hampton
你正在运行SQL Server的标准版还是企业版?还是简单的开发版?使用哪个版本的SQL Server?2012、2014、2016?https://www.vmguru.com/wordpress/wp-content/uploads/2015/03/SQL_Server_2014_key_capacity_limits.png - John K. N.
企业,2012年..我们与微软有着SA以及付费获得了大量的核心,所以许可费用不是一个问题。 - d-_-b
据说vNUMA每个插槽默认只有1个核心,是因为将虚拟节点跨越物理节点会受到惩罚。这个示例基准测试做了一些愚蠢的事情,比如每个插槽使用了12个vCPU,而物理节点只有6个核心。详细信息请参考:https://blogs.vmware.com/vsphere/2013/10/does-corespersocket-affect-performance.html - John Mahowald
我喜欢认为HT可以给虚拟机监视器一些额外的处理器资源来运行自身的线程,占用少量的百分比。不过,没有数据支持这个观点。 - John Mahowald
服务器有多少内存? - Overmind
3个回答

通常情况下,将分配的虚拟CPU数量控制在物理核心数以内(忽略超线程)是比较保险的做法。你有两个物理CPU,每个CPU有8个核心(尽管我记得E5-2667只有6个核心)- 这意味着总共有16个真实核心。没有必要分配更多。 需要注意的是,在像你这样的情况下,更容易出现内存不足而不是CPU性能不足的情况。

他们不建议这样做的原因是因为在VMware中,超线程的工作方式并不是计算能力翻倍,而是根据一些测试结果只增加了大约10%的额外性能。因此,您不应该定义比物理核心更多的虚拟CPU。如果那个庞大的虚拟机不是在主机上独自运行的,您还需要记住,当该虚拟机的时钟周期运行时,其他虚拟机几乎无法执行任何操作,因为该单个虚拟机占用了所有可用的核心,并且如果没有全部16个核心可用,它将无法运行。

MSSQL是一个处理器占用过多资源的软件,但这也是有充分理由的。它会降低超线程(HT)的效果,因为HT只是将处理器负载分担,而不能使计算能力翻倍。如果你要运行高性能的SQL服务器,可以考虑在vSphere中分配核心亲和规则,并防止其他虚拟机在这些核心上运行。我知道这违背了虚拟化的初衷,但仍然有一些优势。