最近在公司的專案上遇到一個問題,當QA或者APP工程師瞬間併發請求,測試環境居然就開始HTTP500錯誤。
而這個錯誤是Redis Timeout,很納悶為什麼redis打一下就掛了,不過以噴錯的錯誤訊息來看,感覺閒置的資源還很多,怎麼就這樣掛了呢?
System.TimeoutException: Timeout performing GET MyKey, inst: 2, mgr: Inactive,
queue: 6, qu: 0, qs: 6, qc: 0, wr: 0, wq: 0, in: 0, ar: 0,
IOCP: (Busy=0,Free=1000,Min=4,Max=1000),
WORKER: (Busy=57,Free=997,Min=4,Max=1000)
參考到這篇文章,原來是有一段是說當執行緒到達最小執行緒池數量時,已經都忙碌時會去取可用線程並等待500ms,如果取不到線程就創立新的線程,當量一多時就會塞車了,所以這邊要考慮一般網站瞬間及目標乘載量來去設定這邊的數值,因為設定太高網站效能會降低,設的太低就會發生time out的問題。
設定的語法為
ThreadPool.SetMinThreads(50, 50)
這邊要注意是以單一核心來設定,如果你有四核心,實際上就是50*40最小為200個。
回家思考後,在找尋更完整的資源,發現以下文章有更完整的介紹
可以去看看喔