Monday, April 30, 2012

[TroubleShooting] The query processor could not start the necessary thread resources for parallel query execution

日前網站在忙碌時發生了下面這個錯誤
The query processor could not start the necessary thread resources for parallel query execution.
會出現這問題,是因為MSSQL server 的 worker threads 不夠用了,一般來說worker threads預設為0,讓SQL依作業系統與核心去設定worker threads,其算法如下。
32位元系統 : max_workers_count = 256 + ((cpu_count – 4) * 8)
64位元系統 : max_workers_count = 512 + ((cpu_count – 4) * 16)
如果cpu數小於4,那max worker threads分別會依系統位元數設於256/516,若是SQL 2000,max worker threads則會固定設在255。

你可以用下面的指令去看目前設定的相關資訊
select COUNT(1) from sys.dm_os_threads
select max_workers_count,cpu_count From sys.dm_os_sys_info

要解決這問題,有兩個方式,一個是去調高max worker threads,一個是去縮減SQL連線。


先說第一個方式。

workersthreads
直接去改max_workers_count,你可以在SSMS裡面的介面改,在server上右鍵->內容->處理器內。

或是用sql command去修改
USE master;
GO
EXEC sp_configure 'show advanced option', '1';
RECONFIGURE;
EXEC sp_configure 'max worker threads', '1024'; --set what you want
EXEC sp_configure 'show advanced option', '0';
RECONFIGURE;

按照MSDN的說法,32位元的系統建議最高設到1024,64bit的MSDN沒說,不過我想應該是2048。


一開始是先用第一個作法,將max worker threads設成1024。
thread_count
但是不幸的,還是爆掉了,所以又想了別的方法,就是降低連線數。

方法很簡單,就是去開啟Multiple Active Result Sets(MARS),只要在connecting string內加入 MultipleActiveResultSets=True; 字串就好。

大概就長這樣
string connectionString = "Data Source=MSSQL1;Initial Catalog=AdventureWorks;Integrated Security=SSPI;MultipleActiveResultSets=True";


thread_count2

試了之後,成效果真不錯,尖峰時間連線數大減,可賀可喜。

題外話,如果MARS你已經設了,但是連線數還是太多的話,這就是要加server的時候了。


參考資料 :
max worker threads 選項
Enabling Multiple Active Result Sets (MARS)


No comments:

Post a Comment