分配更多 CPU 和 RAM 後 SQL Server 性能變慢
我們在虛擬 Windows 2008 R2 伺服器上執行 SQL Server 2008 R2 (10.50.1600)。在將 CPU 從 1 核升級到 4 核並將 RAM 從 4 GB 升級到 10 GB 後,我們注意到性能更差了。
我看到的一些觀察結果:
- 執行時間小於 5 秒的查詢現在需要 >200 秒。
- CPU 與 sqlservr.exe 的罪魁禍首掛鉤為 100。
- 對具有 460 萬行的表執行選擇計數 (*) 需要 90 多秒。
- 伺服器上執行的程序沒有改變。唯一的改變是增加cpu和ram。
- 其他 sql 伺服器有一個靜態分頁文件,該伺服器設置為自行管理。
有沒有人遇到過這個問題?
根據 sp_BlitzErik,我跑了
EXEC dbo.sp_BlitzFirst @SinceStartup = 1;
給我這些結果。
這裡發生了很多事情,其中大部分內容非常廣泛和模糊。
- 2008R2 RTM 於 2010 年 4 月 21 日問世。完全不受支持。您需要優先使用大約 3 年前發布的最新 Service Pack。這樣,如果您遇到奇怪的錯誤或其他問題,您將被覆蓋。前往這裡找出您需要下載的內容。
- 由於您添加了 vCPU(從 1 到 4)並且沒有更改任何設置,因此您的查詢現在可以並行進行。我知道這聽起來他們都會更快,但堅持下去!
- 您可能已經添加了 RAM,但您可能沒有更改 Max Server Memory,因此您的伺服器可以利用它。
- 弄清楚您的伺服器正在等待什麼。我從事的一個開源項目提供了免費腳本來幫助您測量 SQL Server。如果您想嘗試一下,請前往這裡。
你會想抓住 sp_BlitzFirst 來檢查你的伺服器的等待統計資訊。您可以通過幾種方式執行它。
這將顯示您的伺服器自啟動以來一直在等待什麼。
EXEC dbo.sp_BlitzFirst @SinceStartup = 1;
這將在 30 秒的視窗內向您顯示正在等待的查詢。
EXEC dbo.sp_BlitzFirst @Seconds = 30, @ExpertMode = 1;
一旦你弄清楚正在等待什麼查詢(那裡有大量關於等待統計的東西),你就可以開始進行更改以控制事情。
如果您看到它們正在等待
CXPACKET
,這意味著您的查詢是並行的,並且可能會互相踐踏。如果你遇到了這個問題,你可能會考慮將並行的成本門檻值提高到 50,並且可能將 MAXDOP 降低到 2。在此步驟之後,您想使用sp_WhoIsActive或 sp_BlitzWho(後者位於之前的 GitHub 儲存庫中)之類的東西開始擷取查詢計劃。除了等待統計數據之外,它們是您可以查看以找出問題所在的最重要的事情之一。
您可能還想查看 Jonathan Kehayias 撰寫的這篇關於VMWare Counters的文章,以查看與 SQL Server 相關的內容。
更新
查看等待統計數據和男孩,他們很奇怪。CPU肯定有問題。您的伺服器大部分時間都無聊地坐著,但是當事情變熱時,事情就會變得糟糕。我會嘗試輕鬆解決這個問題。
- 你遇到了一個叫
THREADPOOL
. 你沒有很多,但這是有道理的,因為你的伺服器不是非常活躍。我會在一分鐘內解釋為什麼。- 你有很長的平均等待時間
SOS_SCHEDULER_YIELD
和CXPACKET
。你在一個虛擬機上,所以你要確保 SQL Server 有保留,或者這個盒子沒有被可怕的超額訂閱。一個吵鬧的鄰居真的會毀了你在這裡的一天。您還需要確保伺服器/VM 來賓/VM 主機未在平衡電源模式下執行。這會使您的 CPU 減速到不必要的低速,並且它們不會立即恢復到全速。- 他們是如何联系在一起的?使用 4 個 CPU,您有 512 個工作執行緒。請記住,單個 CPU 的數量相同,但現在您的查詢可以並行,它們可以消耗更多的工作執行緒。在您的情況下,並行查詢的每個並行分支有 4 個執行緒。
什麼是平行的?最有可能的一切。Parallelism 的預設成本門檻值是 5。在 90 年代後期的某個時候,在看起來像這樣的桌面上工作時,這個數字被設為預設值。
誠然,您的硬體比大多數筆記型電腦都要小,但您仍然領先於這件事。
當大量並行查詢開始執行時,您將用完這些工作執行緒。發生這種情況時,查詢只是等待執行緒開始執行。這也是
SOS_SCHEDULER_YIELD
進來的地方。查詢正在退出 CPU 並且很長一段時間都沒有重新啟動。我沒有看到任何阻塞等待,因此您很可能只是忙於查詢內並行等待。你能做什麼?
- 確保沒有任何東西處於平衡功率模式
- 將 MAXDOP 更改為 2
- 將並行度的成本門檻值更改為 50
- 按照上面的 Jon K. 文章驗證 VM 執行狀況
- 使用呼叫的腳本
sp_BlitzIndex
查找任何失去的索引請求。如需更徹底的故障排除,請查看我為 Google 撰寫的關於雲中硬體大小的白皮書。
希望這可以幫助!