Sql-Server-2008-R2

為什麼活動監視器與資源監視器中的處理器百分比不同?

  • June 29, 2018

我正在跟踪 SQL Server 活動監視器中報告的處理器百分比與資源監視器中使用的總處理器百分比之間的顯著差異。我看到兩者之間大約有 50% 的差異,而活動監視器總是更高。

系統規格:

  • SQL Server EE 2008 R2
  • 視窗 2008 R2
  • 只有金屬
  • 96 個核心,無處理器關聯集(4 個物理插槽,每個 12 個核心啟用超執行緒)
  • 768 GB 記憶體
  • 主動/被動集群
  • SSD的直接連接儲存

什麼會導致這樣的差異?

我應該看哪一個?

CPU比較

更新:

我看到資源監視器已將其劃分為不同的類別,但是“CPU - Total”圖表不會顯示機器上的所有 CPU 使用情況嗎?

任務管理器性能選項卡顯示它與活動監視器之間的相同差異。

活動監視器與任務管理器性能

  • 活動監視器處於 1 秒刷新狀態。

Activity Monitor 是否存在問題,沒有看到每個核心都是超執行緒的?不確定 SQL Server 如何看到所有 96 個核心。

SQL Server 屬性

2018 年 6 月 28 日更新

即使在遷移到 AWS 並將作業系統更新到 Server 2012 R2 之後,SQL Server 2008 r2 活動監視器仍然與任務管理器顯示的有很大的不同。下面的螢幕截圖來自剛剛執行的負載測試。這兩個指標之間存在明顯的 20% 差異。即使任務管理器報告的整體 CPU 剛剛超過 55%,SQL 活動監視器也固定在 100%。AWS Cloud watch 中的指標顯示與任務管理器相同的結果,因此我有兩個數據指標與第三個數據指標相關,甚至不在球場上。

AWS 伺服器

更新的系統規格: 系統規格:

  • SQL Server EE 2008 R2
  • Windows 2012 數據中心 R2
  • i3.16xl - 專用主機
  • 64 核,無處理器關聯集(2 個插槽,每個 32 核)
  • 488 GB 記憶體
  • 同步鏡像
  • 啟用 ENA 並啟用 EBS 優化

在此處輸入圖像描述

資源監視器在兩個不同的圖表上顯示來自程序和服務的 CPU。(在您的範例中,32% + 37%,這意味著總共 69% 的 CPU)。

至於 SQL Activity Monitor,它顯示了安裝 SQL 的機器的 CPU 使用率。(在你的例子中,64%,離資源監視器不遠。)

我使用查詢來獲取伺服器上的 CPU 使用率。我在我的伺服器上執行一個作業,如果我在過去 10 分鐘內平均超過 90%,就會發出警報。

這是我的查詢:

DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks)FROM sys.dm_os_sys_info); 

-- Top 10 : for the last 10 minutes
SELECT TOP(10)  100 - SystemIdle as TotalCPU,
          DATEADD(ms, -1 * (@ts_now - [timestamp]), GETDATE()) AS [Event Time] 
FROM ( 
 SELECT record.value('(./Record/@id)[1]', 'int') AS record_id, 
       record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') 
       AS [SystemIdle], 
       record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 
       'int') 
       AS [SQLProcessUtilization], [timestamp] 
 FROM ( 
       SELECT [timestamp], CONVERT(xml, record) AS [record] 
       FROM sys.dm_os_ring_buffers 
       WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' 
       AND record LIKE '%<SystemHealth>%') AS x 
 ) AS y 
ORDER BY record_id DESC;

在 Danielle 的查詢中添加了更多細節

DECLARE @processorGHz float = (SELECT 1.0*cpu_ticks/ms_ticks/(1000000) FROM sys.dm_os_sys_info); -- divided by 1 million as that is 1 billion (GHz) divided by 1000 (ms/s)
DECLARE @ts_now bigint = (SELECT ms_ticks from sys.dm_os_sys_info); --cpu_ticks/(cpu_ticks/ms_ticks) reduces to just ms_ticks. 1/(1/x)=x
DECLARE @processors int = (SELECT cpu_count from sys.dm_os_sys_info);
DECLARE @qs datetime = GETDATE();
-- Top 60 : for the last hour
SELECT TOP(60)
   DATEADD(ms, -1 * (@ts_now - [timestamp]), @qs) AS [Snapshot Time],
   100 - SystemIdle as [Total CPU Burden (%)],
   COALESCE(CAST(
       NULLIF(CONVERT(decimal(18, 4), 100.0 * UMT / (@processorGHz * 1000000 * 60 * @processors)),0.0)
   as varchar(10)),'') as [SQL Server Userspace CPU Usage (%)],
   COALESCE(CAST(
       NULLIF(CONVERT(decimal(18, 4), 100.0 * KMT / (@processorGHz * 1000000 * 60 * @processors)),0.0)
   as varchar(10)),'') as [SQL Server Kernel CPU Usage (%)],
   COALESCE(CAST(
       NULLIF(
           CONVERT(decimal(18, 4), 
               100.0 * UMT / (@processorGHz * 1000000 * 60 * @processors) +
               100.0 * KMT / (@processorGHz * 1000000 * 60 * @processors)),0.0)
   as varchar(10)),'') as [Total CPU Usage by SQL Server (%)],
   SPU as [SQL Processor Usage (% trunc)],
   Mem as [Total System Physical Memory Used (%)]
FROM ( 
   SELECT
       record.value('(./Record/@id)[1]', 'int') AS record_id, 
       record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS [SystemIdle], 
       record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]','int') AS [SPU],
       record.value('(./Record/SchedulerMonitorEvent/SystemHealth/UserModeTime)[1]','int') AS UMT,
       record.value('(./Record/SchedulerMonitorEvent/SystemHealth/KernelModeTime)[1]','int') AS KMT,
       record.value('(./Record/SchedulerMonitorEvent/SystemHealth/MemoryUtilization)[1]','int') AS Mem,
       [timestamp]
   FROM ( 
       SELECT
           [timestamp],
           CONVERT(xml, record) AS [record] 
       FROM sys.dm_os_ring_buffers 
       WHERE 
           ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' AND
           (record LIKE '%<SystemHealth>%')
   ) AS x 
) AS y 
ORDER BY record_id DESC;

SQL Server Userspace CPU Usage %如果-type 列準確,我將不勝感激。我使用很少的 CPU 資源足夠長的時間來擷取我伺服器上的數據集。不幸的是,MSDN 上完全缺少 sys.dm_os_ring_buffers 的 UserModeTime 和 KernelModeTime 的文件,所以我不確定它是在測量時鐘時間、處理器時間、處理器週期還是什麼。這些數字似乎並沒有衡量電腦上的所有程序,因為我經常會得到 0,但處理器肯定正在被使用,所以我推測它們反映了 SQL 伺服器的 CPU 使用情況。

引用自:https://dba.stackexchange.com/questions/148725