SQLServer 2019 标准版在虚拟机上无法充分利用CPU的问题诊断
最近发现一台SQLServer服务器CPU使用率中,有4个CPU心很繁忙,6个CPU核心却很空闲,由于是SQLServer 2019标准版,猜测到可能是跟虚拟机的CPU授权数有关。
这台机器是笔者从Infrastructure部门接到的干净的虚拟机,然后自己安装的数据库,数据库本身没有对CPU有任何限制,当时并没有注意这个细节,从任务管理器中可以看到虚拟机的CPU是10个逻辑核心(processer)对应10个socket(针脚),也就是在创建虚拟机的时候,以多个每个socket 1 个核心的方式分配的CPU资源

CPU资源分配方式大概类似如下:从ESXi控制台中看,分配CPU的时候,有两个因素,总的CPU核心数,以及每个Socket的核心数。个人猜测当时创建虚拟机的Infrastructure部门同事认为这样效率更高,虚拟机的CPU,从多个物理CPU每个CPU贡献1个核心的方式,这种方式跟分配1个Socket的10个核心,同样都是10个CPU核心的虚拟机,对于SQLServer来说,可以是天差地别的。

参考微软官方的文档中的说明,对于标准版的SQLServer,最多可以使用4个Socket或者32个核心,以两者中的下线为准,也就是说,10个Socket10核心的CPU,即便10个CPU没有超出32,但是Socket的上限4,这种情况下也只能使用4个CPU

然后检查SQLServer启动日志,果不其然,中间有一条提醒:
SQLServer detected 10 sockets with 1 cores per scokect and 1 logical processers per socket, 10 total logical processers; using4 logical processers based on SQL Server licensing.
这就说明了一开始的现象:有4个CPU心很繁忙,6个CPU核心却很空闲,实际上SQLServer服务仅使用了4个CPU,其他6个CPU资源因为licensing的原因并没有使用到。

SQLServer标准版对于CPU的使用,受限于“Limited to lesser of 4 sockets or 32 cores”,因此在创建虚拟机分配CPU资源的时候,一定要了解到这个规则,不要超过4个Sockets,否则Socket超出4的CPU无法利用。
浙公网安备 33010602011771号