最近SQL经常提示“查询处理器未能为执行并行查询启动必要的线程资源”反应速度变慢。
SQL环境为两台服务器做故障转移群集,一主一备,主为48核心,64G内存,备为24核心,64G内存。
经检查发现服务已转移到备用节点(转移原因后续排查),因之前未出现过此问题,故障锁定在了计算机硬件,SQL配置问题上:我们的服务器CPU是4核(48个逻辑CPU),操作系统会将这些逻辑CPU进行分组。每个分组有分多少个逻辑CPU这个由操作系统决定。(每次重启电脑分组的数量可能会变的)假设,12个逻辑cpu一组,如果你的“最大并行度”是12那么这个sql只需要在这一组逻辑cpu里执行就可以了,这12个逻辑cpu共享同一块内存空间。也就是说,如果设置的“最大并行度”超出12,例如设置为13,那么就会出现“跨NUMA问题”。
当第二个组运算好之后,当一个组运算好之后,如果第二个组的另外两个逻辑cpu还没有运算好,那么就需要等待B、又或者第二个组已经运算好,出结果了,但是由于线程切换,或者服务器忙不过来
先检查服务器的CPU设置
属性--处理器--展开
CPU每次重启都会分组,而且每次分组的数量可能不同,查看备用机上SQL设置CPU分为了4组,每组6个核心,因此我们设置最大并发数的时候尽量不要超过6,否则就会出现查询跨NUMA问题
解决方法:
最大并行度改为5,单击运行值(点击后,最大并行度会显示灰色,不用管),点确定,不需要重启,等待十几秒生效。
备注: 并发跟并行是不一样,不是同一样东西。一个sql语句 /查询 的某个运算符如果需要多线程执行,sqlserver就会开启多线程来处理这个运算符。这个由sqlserver判断如果你没有设置并行度,假设你的cpu是四线程的那么sqlserver会用4个线程去执行如果你设置了并行度为2那么sqlserver只会用2个线程去执行你的查询而另外2个资源就给其他软件/操作系统使用并行度只是一个开关,决定是由sqlserver来决定的–查看哪些sql线程属于哪个处理器编组select [thread_address],[started_by_sqlservr],[creation_time],[processor_group],[scheduler_address] FROM sys.dm_os_threads