為什麼數據庫伺服器有不同的 time_source 值
我有兩台 SQL Server 2008 R2 Enterprise SP1 伺服器,它們的
sys.dm_os_sys_info.time_source
.的
time_source
列sys.dm_os_sys_info
指示 SQL Server 用於檢索掛鐘時間的 API:0 = QUERY_PERFORMANCE_COUNTER 1 = MULTIMEDIA_TIMER
是什麼導致了差異,我可以更改 SQL Server 以使用更精確的
QUERY_PERFORMANCE_COUNTER
值嗎?+--------------------------+---------------------------+-------------------------+ | | 原創 | 新 | +--------------------------+---------------------------+-------------------------+ | 時間來源 | QUERY_PERFORMANCE_COUNTER | 多媒體_定時器 | | 作業系統安裝 | 乾淨 | 乾淨 | | 虛擬/物理 | 物理 | 虛擬 | | 管理程序 | 不適用 | 虛擬機,ESXi 5.5 | | VMware 硬體版本 | 不適用 | 7 | | bcd nx | 選擇加入 | 退出 | | 啟用 bcd 恢復 | 沒有 | 是的 | | bcd /usepmtimer | 沒有 | 沒有 | | sql 庫 | sql 標準 2008 r2 | sql 標準 2008 r2 | | 從 express 升級 sql | 沒有 | 沒有 | | sql 自動關閉任何數據庫 | 沒有 | 沒有 | | 電源計劃| 高性能 | 平衡| | dm_os_performance_counter| 是的 | 是的 | +--------------------------+---------------------------+-------------------------+
我的同事發送了這個非常有趣的連結:工作原理:SQL Server 2008 R2 中的計時器輸出
VMWare對時間源使用不同的 API,具體取決於 OS 版本和 VM 硬體版本。他們還有一份包含很多細節的白皮書。
根據MSDN,SQL Server 使用以下邏輯來決定使用哪個計時器:
Windows 沒有 API 來指示
QueryPerformanceCounter
此時正在使用什麼源,因此 SQL Server 2008 R2 啟動時間呼叫QueryPerformanceCounter
(10 次),當它表現出重複的小循環行為(< 600 個循環)時,QueryPerformanceCounter
將用於接受不變數TSC 計時而不是 GetTickCount/timeBeginPeriod 中斷計時行為。如果計時超過 600 個週期,multi-media timer
則使用 SQL Server 的行為。注意:Windows 在基於 Windows 2008 R2 的修復中公開了 QueryPerformanceCounter 的計時器源 API,因此 SQL Server 確定的計時源將在未來的建構中被 API 呼叫取代。目標版本是 Windows 2008 R2 和 SQL Server 2008 R2 的 SP1。
上面的解釋間接回答了你的問題:
- SQL Server 使用內部程序來確定要使用的計時器。
- 除了使用跟踪標誌 8049 和 8038 之外,您無法告訴 SQL Server 2008 R2 使用哪個計時器。在我的測試中,這些跟踪標誌都沒有對 .timer_source 列產生任何影響
sys.dm_os_sys_info
。我們在周末重新啟動了大部分伺服器。我比較了
MULTIMEDIA_TIMER
重啟前後使用的機器列表。我現在可以報告一些正在使用的伺服器MULTIMEDIA_TIMER
現在正在使用QUERY_PERFORMANCE_COUNTER
,反之亦然。由於我們的伺服器是虛擬化的,我假設在我們的虛擬化環境中同時啟動機器會導致一些機器花費超過 600 個 CPU 週期才能通過
QueryPerformanceCounter
API 返回值。這種效應似乎是隨機分佈在我們的環境中的。