摘要
Microsoft SQL Server 2005 使用高解析度 CPU 計數器來提供微秒計時功能。 微秒是百萬分之一秒 (或千分之一毫秒) 。 不過,如果您使用會變更 CPU 頻率的技術,SQL Server 計時值可能會不正確。 例如,當您使用下列任何技術時,可能會發生這個問題:
- CPU 逐步執行
- AMD Cool'n'Quiet 技術
- 各種電源配置
本文包含可協助您解決此問題的方法和其他資訊。
症狀
當您使用 SET STATISTICS TIME 陳述式來顯示伺服器執行、剖析及編譯時間時,可能會取得不正確的值。 例如,您可能會注意到 SQL Server 執行時間的經過時間遠大於 CPU 時間。 此問題可能會影響效能調整的精確度。 當您使用伺服器上 [摘要] 區段中所列的其中一種技術時,就會發生這個問題。
原因
發生此問題的原因是,當您使用這些技術時,CPU 頻率會改變。 SQL Server 2005 使用高解析度 CPU 計數器來提供微秒計時功能。 如果更改 CPU 頻率以節省能源和減少熱量輸出,則計算的持續時間可能不正確。
解決方式
Service Pack 資訊
如果要解決這個問題,請取得最新的 SQL Server 2005 Service Pack。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:
913089 如何取得 SQL Server 2005 的最新版 Service Pack
注意 在 SQL Server 2005 Service Pack 3 和更高版本的 Service Pack 中,不會使用處理器時間戳記。 這些版本的 SQL Server 2005 使用更可靠的計時器,其最大精確度為 1 毫秒。
狀態
此問題最初已在 SQL Server 2005 Service Pack 3 中更正。
因應措施
SQL Server 2005 需要已知且穩定的資料點,才能執行精確的效能調整。 如果在電腦上啟用了動態 CPU 頻率調整,您可以停用它們,讓 CPU 在您開始監視和調整 SQL Server 效能之前保持穩定的頻率速率。 若要執行這項操作,請使用下列方法。
設定電腦上的電源配置,強制 CPU 保持在最大頻率
若要這麼做,請按照下列步驟進行:
依序點擊 [開始]、[執行],輸入 Powercfg.cpl,然後按一下 [確定]。
在 [電源選項屬性] 對話方塊中,按一下 [電源配置] 清單中的 [Always On]。
按一下 [確定]。
可能會發生漂移。 漂移是 CPU 頻率值之間的差異。 如需詳細資訊,請參閱「漂移」一節。 在這種情況下,您必須重新啟動 Microsoft Windows,以在變更電源配置後重新同步所有 CPU 的頻率。
如果無法重新啟動電腦,請啟用 SQL Server 處理器親和性,以防止 SQL Server 背景工作執行緒在 CPU 之間移動。 執行此動作時,即使 CPU 頻率值出現差異,也不需要重新啟動電腦。 若要為伺服器上的所有 CPU 啟用 SQL Server 處理器親和性,您必須根據伺服器上的邏輯處理器數目,使用不同的遮罩。
下表列出範例案例。
| CPU 數 | 啟用處理器親和性的陳述式 |
|---|---|
| 02 個 CPU | exec sp_configure 'affinity mask', 0x00000003 GO 重新設定 GO |
| 04 個 CPU | exec sp_configure 'affinity mask',0x0000000F GO 重新設定 GO |
| 08 個 CPU | exec sp_configure 'affinity mask',0x000000FF GO 重新設定 GO |
| 16 個 CPU | exec sp_configure 'affinity mask',0x0000FFFF GO 重新設定 GO |
| 32 個 CPU | exec sp_configure 'affinity mask', 0xFFFFFFFF GO 重新設定 GO |
注意:在 BIOS 層級停用 CPU 頻率變化功能可能還不夠。 各種協力廠商公用程式都可以變更 CPU 頻率。 即使 CPU 處於最大電源配置設定下,某些實作也會啟用頻率調整。 在此情況下,您必須在 SQL Server 2005 中執行效能微調時停用這些協力廠商公用程式。
使用協力廠商公用程式和驅動程式來同步處理 CPU 頻率和 CPU 時鐘計數器
在極少數情況下,系統可能需要製造商的更新來修正 CPU 頻率問題。 如果您懷疑系統可能有問題,最佳做法是檢查系統是否有最新的 BIOS、微碼和韌體更新。
更多資訊
Microsoft SQL Server 2000 和舊版的 SQL Server 會使用 Windows 計時機制。 計時機制使用毫秒精確度值。 一般而言,此精確度為 10 到 15 ms。 不過,精確度可能高達 55 ms。 SQL Server 查詢通常會在個位數毫秒或微秒的時間跨度內完成。 這種精度需要高解析度計時器。 因此,這些版本的 SQL Server 會將某些查詢的持續時間報告為 0 毫秒。 因此,在舊版的 SQL Server 中,很難監視效能及調整 SQL Server 效能。
SQL Server 2005 使用高解析度 CPU 計數器提供微秒計時功能,以改善精確度。 當您使用「摘要」部分中列出的技術時,報告的時序值可能不正確。
此問題可能會影響下列物件和功能:
追蹤事件:
注意事件
預存程序節點中的事件
TSQL 節點中的事件
[物件] 節點中的事件
[交易] 節點中的事件
動態管理檢視:
sys.dm_exec_query_stats
sys.dm_exec_requests
sys.dm_exec_sessions
sys.dm_io_pending_io_requests
sys.dm_os_ring_buffers
sys.dm_os_sys_info
sys.dm_io_virtual_file_stats
sys.dm_os_wait_stats
SET STATISTICS TIME 陳述式
sysprocesses 系統資料表
安裝 SQL Server 2005 Service Pack 2 (SP2) 之後,當 SQL Server 偵測到 CPU 之間的高解析度計時器不同步時,SQL Server會在錯誤記錄檔中記錄錯誤訊息。 錯誤訊息表示效能時序可能不準確,使用者應謹慎使用效能資料。
錯誤訊息的文字類似下列其中一項錯誤訊息:
錯誤訊息 1
注意
排程器 ID 2 上 CPU 的時間戳記計數器未與其他 CPU 同步。
錯誤訊息 2
注意
CPU 時間戳記頻率已從每毫秒 191469 變更為 1794177 刻。 將使用新的頻率
SQL Server 使用 RDTSC) 指令 (即時戳記計數器來取得 64 位元 CPU 滴答計數。 您可以將此值除以 CPU 頻率,將值轉換成毫秒數值。 當 CPU 頻率變更或發生漂移時,可能會發生時序變化。
CPU 逐步執行
CPU 逐步執行定義為刻意變更 CPU 頻率。 CPU 步進也稱為 Intel SpeedStep 技術或 AMD PowerNow! 技術。 當 CPU 步進發生時,CPU 速度可能會以小至 50 MHz 的增量增加或減少,以節省能源並減少熱量輸出。 位於 NUMA) 節點 (相同非統一記憶體存取內的 CPU 不會獨立調整頻率。
下表說明 CPU 逐步執行變更如何影響計時計算。
| 動作 | RDTSC 刻度 | 每毫秒刻度 (頻率) | 實際執行階段 |
|---|---|---|---|
| 開始批次 | 1 | 200 | 0 |
| 降頻 | 200 | 100 | 1ms |
| 結束批次 | 500 | 3ms | |
| 合計 | 500 | 4ms |
SQL Server 會在 RDTSC 刻度開始與結束處擷取 RDTSC 刻度。 然後,SQL Server 將刻度除以頻率值。
在此範例中,當您使用 200 或 100 的頻率值時,會發生下列計時計算:
頻率 200:500/200 = 2.5 毫秒
頻率 100:500/100 = 5 毫秒
兩個計時計算都不符合實際的 4 ms 掛鐘時間。
如果在 RPC:Completed 追蹤事件中使用此計算,則報告的持續時間和結束時間資料行會不正確。 RPC:Completed 事件會擷取起始時鐘時間和 CPU 滴答計數。 為了在 SQL Server 2005 中獲得比 Windows 更高的解析度時序,SQL Server 追蹤中的持續時間和結束時間資料行是使用經過的 CPU 滴答計數來計算的。 結束時間資料欄位的計算方法是將持續時間資料行新增至開始時間資料行。 在此範例中,結束時間資料行的計算方式是將 2.5 毫秒或 5 毫秒加到開始時間。
漂移
漂移是 CPU 時鐘值的差異。 具有多個 CPU 的系統會在相同的時間點產生不同的 CPU 時鐘值。 雖然這種情況並不常見,但隨著時間的推移,CPU 可能會出現時鐘分離的情況。
下列範例示範漂移變更如何影響 SQL Server 追蹤中持續時間資料行的結果。 此範例假設 CPU 頻率保持穩定在每毫秒 200 刻。 下表說明了這個案例中的事件。
| 動作 | Windows 排程的 CPU | CPU 1 RDTSC | CPU 2 RDTSC | 實際執行階段 |
|---|---|---|---|---|
| 開始批次 | 1 | 100 | 1100 | 0 |
| 結束批次 | 2 | 900 | 1900 | 4 ms |
| 合計 | 4 ms |
SQL Server 會在起點和結束點擷取 RDTSC 刻度。 然後,SQL Server 會將 RDTSC 刻度除以頻率值。 在此範例中,Windows 在兩個不同的 CPU 上排程了 SQL Server 背景工作執行緒。 為批次提供服務SQL Server背景工作執行緒首先在第一個 CPU (CPU 1) 上執行。
不過,批次執行在某個時間點中斷,且 SQL Server 將批次執行傳送至擱置佇列。 當 SQL Server 再次將提供此批次服務的 SQL Server 背景工作執行緒傳送至可執行佇列時,Windows 會分派執行緒在第二個 CPU (CPU 2) 上執行。 SQL Server 背景工作執行緒已在 CPU 2 上完成執行。 由於 CPU 漂移,從 CPU 2 捕獲的結束滴答值是 1900,而不是 900。 如果您啟用 SQL Server 處理器親和性,可以避免此行為。
本範例中使用下列計時計算:
- 不正確但回報的值: (1900 – 100 = 1800) / 200 = 9 毫秒
- 正確值: (900 – 100 = 800) / 200 = 4 毫秒
RPC:Completed 事件的持續時間資料行的值會回報為 9 毫秒,而不是 4 毫秒。 這個結果是正確值 4 ms 的兩倍多。
漂移警告訊息已新增到 SQL Server 2005,指出先前提及的效能輸出可能不可靠。 在某些未發現的情況下,SQL Server 2005 SP2 可能會報告有關下列內容的警告訊息:
- 錯誤的漂移警告訊息
- 漂移可能會變成數十毫秒,而不會造成明顯的系統影響
當您評估與效能相關的輸出,以及將與效能相關的輸出與時鐘計時進行比較時,您必須小心。 如果沒有其他效能問題的跡象,您通常可以忽略漂移警告訊息。 例如,在下列情況下,您通常可以忽略漂移警告訊息:
- 處理程序如預期般執行。
- SQL Server 查詢未以奇怪的持續模式執行。
- 您沒有看到其他瓶頸的跡象。
不過,在忽略漂移警告訊息之前,建議您先連絡製造商,以確保不存在已知的 RDTSC 問題。
您可以使用追蹤旗標 8033 (–T8033) ,以回到原始發行版本的 SQL Server 2005 和 SQL Server 2005 SP1 中的報告行為。 SQL Server 2005 和 SQL Server 2005 SP1 的原始發行版本不會回報漂移警告訊息。 如果您執行的 SQL Server 2005 或 SQL Server 2005 SP1 的原始發行版本沒有問題,通常可以忽略這些訊息。
為什麼 WAITFOR DELAY 陳述式可以正常運作? 定期系統程序呢?
逾時機制不受高解析度設計的影響。 SQL Server 不會針對計時器活動使用高解析度計時器。 某些逾時活動是以使用 GetTickCount 函數的降低解析度計時器為基礎。 這些逾時活動包括鎖定逾時、WAITFOR DELAY 陳述式及鎖死偵測。
如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:
938448 如果 Windows Server 2003 伺服器使用雙核心 AMD Opteron 處理器或多處理器 AMD Opteron 處理器,則該伺服器可能會發生時間戳記計數器漂移
895980 使用 QueryPerformanceCounter 函數的程式在 Windows Server 2003 和 Windows XP 中可能效能不佳
本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。