設定正確的執行緒數量
《高效能伺服器架構 》中提到了SEDA,我搜了一下,發現這篇文章《SEDA效能優化的分析和模擬 》,對於執行緒數量的建議。假如一個Web請求,程式碼執行的時間為ST(Service Time),讀檔案、網路呼叫之類IO等待時間為為WT(Wait Time),CPU的個數是N、核數是M則執行緒數量TC(Thread Count)為:
TC= N*M*(1+WT/ST)
假如只有1個單核的CPU,如果IO為40毫秒,程式執行要20毫秒,那麼可以得出如下的執行序列。
Request1 執行20毫秒,等待40毫秒,此時CPU空閒。
Request2 接著執行20毫秒,等待40毫秒,此時Request1還需要等待20毫秒。
Request3 接著執行20毫秒,等待40毫秒,此時Request2還需要等待20毫秒,Request1執行完畢。
Request4 就可以重用Request1的執行緒了。
按照這個公式,假如1個單核的CPU,存在下面三種應用場景:
S1:ST=10 WT=0 TC=1
S2:ST=10 WT=50 TC=6
S3:ST=10 WT=100 TC=11
S1是純粹的計算,沒有IO,只消耗CPU;S2是本地檔案的訪問,有磁碟IO;S3是呼叫資料庫,有網路IO。
假如S1佔總請求數量的10%,S2佔20%,S3佔70%,此時的TC應該是多少?假如百分比為PER
TC = N*M*(1 + ( WT1*PER1 + WT2*PER2 ... WTn*PERn)/( ST1*PER1 + ST2*PER2 ... STn*PERn) )
也就是 說總的等待時間/總的執行時間
上面的場景,按照公式為
TC = 1 * 1 * ( 1 + 80/10 ) = 9
對於SEDA細節,以後再研究吧。
==========================================================================
效能相關的系列文章: