上次我們說到,sql server 2012的企業版的任務調度流程,一直到給新連接分配了scheduler,都是與以前的版本算法是一致的,只有在進行任務分配的時候,算法才有了細微的調整。
新算法的目的是盡量減小在同一NUMA節點內隨機分配scheduler帶來的性能影響(原來的算法也不能稱為隨機,因為是按負載系數進行分配的,但是由于負載系數會不確定,所以暫時將原分配算法定性為:隨機~~)
我們知道,在sql server 2008版本以后,引入了Resource Governor(后文簡稱RG),在2012版本中,微軟就將Resource Governor這個特性應用到了任務調度算法中來,這里需要注意的是,如果沒有開啟RG功能,那么sqlos將會把default RG設置應用到算法中。
PS:如果不知道Resource Governor是什么的同學請參考MSDN:https://msdn.microsoft.com/en-us/library/bb933866(v=sql.100).aspx
如果對RG有了解,就會知道RG是一個對資源進行分配的設置選項,它可以對CPU或內存的最大、最小可用資源進行配置。
每個scheduler也都有自己的目標資源池,每個SCHEDULER的資源池大小基本等于RG最大配置/scheduler總數的平均值
scheduler cpu pool=max cpu/scheduler count
圖為default的RG設置
OK,下面我們開始說明一下新的算法流程:
當需要給task指派一個scheduler的時候,如果首選scheduler(PReferredscheduler)在添加這個task后,不會使得當前scheduler的平均任務資源利用率下降到當前NUMA節點內平均資源利用率的80%以下,則將任務指派給首選scheduler;反之,則將任務分配給同一NUMA節點中有最多可用資源的sheduler上。
如果寫成邏輯公式則是這種計算方式:
if (preferredscheduler pool target/runable task+1)>avg (sum(scheduler pool target/runable task))*0.8
preferredscheduler task+1
else
mostpool resourcescheduler task+1
也許這樣說起來并不直觀,我們用一些圖例和計算說明一下具體流程
依然模擬了這樣一個環境:2NUMA,四核,1433端口綁定到NUMA0,使用默認的RG設置(也就是MAX CPU=100%)
我們可以列出下表
全局的平均值則=(5.56+4.55)/2=5.05,那么80%數據值為5.05*0.8=4.04
1.
在sche1發起了一個任務分配的任務,計算公式則如下
scheduler1 avg = 50/(11+1)=4.17
我們發現4.17這個數值要高于全局平均使用率的80%(4.04),那么這個任務還是會分配給首選scheduler,也就是sche1
(這里注意:如果按以前版本負載系數的算法,則是(11+1)/9=1.33,在sche1添加這個任務,任務負載會超出sch0的20%以上,則此任務則會分配給sche0)
2.
上面的表格變為如下:
全局的平均值則=(5.56+4.17)/2=4.86,那么80%數據值為4.86*0.8=3.89
3.
接下來我們再繼續在sche1上添加新的任務,計算公式則如下
scheduler1 avg = 50/(12+1)=3.85<3.89
則新的任務會分配到非首選schduler上,也就是sche0上,表格變成
我們可以看出,通過新的算法,并沒有對不同的scheduler上的任務造成過大的數量差距,而且減小了在不同scheduler上切換任務的次數
以上就是sql server 2012任務調度算法的一些基本內容
補充
在服務器啟動時候,我們可以使用2個trace flag進行調度算法的指定,當然和一般的trace flag一樣,如果不是特別需要且經驗非常豐富的DBA,不要對這些看似高大上的參數進行調整
-T8008 - 使用2012企業版之前的調度算法,也就是我在第一篇中寫到的算法
-T8016 - 強制指派任務到首選scheduler上(基本上等于不進行什么算法判斷了)
新聞熱點
疑難解答