使用sys.dm_sys_info 这个视图的时候经常对hyperthread_ratio这个列感觉迷惑。这个列的含义到底是什么?
翻译的外国大神的一篇文章, http://sqlblog.com/blogs/kalen_delaney/archive/2007/12/08/hyperthreaded-or-not.aspx
在我的课堂上或者每次我做性能顾问的时候,我经常会遇到一个问题“我怎么确定我们的SQL SERVER是否是超线程的”?
当我发现DMV--sys.dm_sys_info有一个列叫做hyperthread_ratio(超线程比)的时候,我感觉很高兴极了。不久后,我读到我最爱的一个SQL SERVER
博主Buck Woody 的一篇博文。他指出下面的查询告诉了我们CPU核心的数量,而并不是告诉你是否开启了超线程。
SELECT cpu_count/hyperthread_ratio AS sockets
FROM sys.dm_os_sys_info
虽然Buck 说这条语句告诉了我们核的数量,但这并不正确。因为一个插槽可以包含一个多核的CPU。一个拥有单插槽双核CPU 并且未做超线程的cpu_count 是2,hyperthread_ratio 是2 ;同时单插槽单核心并且超线程的计算机 hyperthread_ratio 同样也是2。在2种情况下,cpu_count/hyperthread_ratio 都是1--插槽的数量。如果我们有一台一个插槽,双核CPU,并且超线程的计算机,CPU_COUNT会变成4.hyperthread_ratio 同样是4,使用这个比率同样是1,总结如下:
Number of Sockets |
Number of Cores |
Hyperthreaded? |
sys.dm_os_info. cpu_count |
sys.dm_os_info. hyperthread_ratio |
cpu_count / hyperthread_ratio |
1 |
2 |
NO |
2 |
2 |
1 |
1 |
1 |
YES |
2 |
2 |
1 |
1 |
2 |
YES |
4 |
4 |
1 |
所以即使Buck说这个公式能够告诉我们核心的数量,但是这个查询本身告诉我们,结果是“插槽数”。cpu_count/hyperthread_ratio会得到插槽数,而不是核心数。并且没有办法区分双核和超线程.