[SQL][Performance]魔鬼藏在細節裡 - 被忽略的電源計畫

[SQL][Performance]魔鬼藏在細節裡 - 被忽略的電源計畫

這一陣子遇到一個很特別的問題,在一個朋友的環境中,由於原本的主機已經服役很長一段時間了,因此最近一次更換主機,升級成 Windows 2008 R2 Standard x64 作業系統和 SQL Server 2008 R2 Standard 資料庫,為了讓效能能夠有明顯的提升,還特別選用雙 CPU,各 8 核心的大廠主機,心想這下應該把錢砸下去之後,應該是萬無一失了吧。

 

但是在測試過程中卻讓我們非常的訝異,原本的一個資料處理作業在舊的電腦上需要執行約 8 秒鐘,但是在新的電腦上居然要花到 14 秒鐘;而無獨有偶的,也有一個客戶抱怨原本要花一小時的資料計算,忽然最近換到具有相同規格的不同主機上,居然執行時間變成要花上將近一個半小時。接到這樣的狀況還真實在是有點詭異….

 

於是就如同另外一篇「[SQL][Performance]利用效能監視器了解 SQL Server 運作狀況」的方式,利用效能監視器去察看主機、網路、硬碟等相關資料,都沒有找出任何端倪,似乎沒有甚麼東西有特別花較長的時間,就是要處理的指令多,但因為跟正常效能的機器上比較起來,有些指令就差不多相差個 0.1 ~ 0.2 秒左右,但因為要處理的指令較多,因此累積起來就有這些時間差距了。

 

就在相關設定和數據中找來找去的時候,忽然 NB 的亮度降了下來,原來是不小心把電源給踢掉了,因此 NB 的電源計畫重原本的「高效能」給換成了「省電」模式。再把變壓器重新插回去的時候忽然想到,既然 NB 可以這樣設定,不會主機上也設定到甚麼,造成電腦降頻去處理導致處理的時間增加吧,於是連線看了一下客戶的主機環境,原來這兩個客戶都在電源的設定都採用預設值「平衡」。以 Intel XEON 5620 的 CPU 為例,它的時脈正常來說應該是 2.4G MHZ,但是當你設定電源管理是採用「平衡」的時候,此時 CPU 會根據負載來動態調整時脈,因此可能對於部分處理一開始會比較慢,等負載較重的時候才會加速來處理。

 

以下我利用個人電腦 i3 CPU 和 CPU-Z 的工具軟體來做個示範,如果我調整為「高效能」的時候,則測試出來的狀況會是這樣:

CPU01

 

但如果「平衡」的時候,如果在沒有特別處理程式的時候則會類似以下的數據:

CPU02

 

此時可能我們開始執行一些 SQL 指令來增加電腦的負荷,看看相關數據的變化:

CPU03

CPU04

 

 

 

會發現到 Core Speed 變成不會是個固定值,有可能會動態改變來提升速度,當沒有特別需要處理的時候,則又降回到 1330 MHZ 的狀況;而同樣的拿去用主機測試的話,則有可能當你在執行的時候,有可能不會用到多 CPU,造成主機會經常讓 CPU 在較低的執行速度下進行,導致一些作業花費的時間比原本的還要長。原本想說既然這樣就好辦了,只要把電源固定設定為「高效能」,那問題不就小菜一碟般的好解決了!

 

但當客戶連絡的時候,客戶不能接受這樣的答案,認為這樣會讓電腦太過於耗電,希望可以聰明的動態調整,也就是上班時間將主機設定為「高效能」,晚上到隔天上班的時間設定為「平衡」,周末再設定為「省電」。想一想這樣也是蠻合理的啦,於是就順手查了一下相關的指令,讓他們利用 Windows 工作排成來處理囉。此部分我利用 powercfg 的指令來設定:

ECHO "設定為高效能"
powercfg -S 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
 
 
ECHO "設定為平衡"
powercfg -S 381b4222-f694-41f0-9685-ff5bb260df2e
 
 
ECHO "設定為省電"
powercfg -S a1841308-3541-4fab-bc81-f71556f20b4a

 

這些設定蠻簡單的,但常常我們安裝好主機都比較容易會忽略到這個部分的設定,但如果能稍加注意一下,有機會讓您的系統在執行的時候,會有不小的效能提升喔。


備註1 : 這樣設定會有個比較大的缺點,就是主機的耗電量會增加,一些主機可能會因此將風扇開始狂吹,造成噪音會變得很大聲,因此建議可以考慮利用排程的方式來動態調整。或者是在這類的主機上面,可以多增加一些記憶體,然後在上面透過虛擬化的技術,將其他主機所需要的工作整併到同一台上,讓主機的效能可以更充分發揮。