影響系統(tǒng)吞吐量的因素有哪些呢?下面層QPS三要素 線程、響應(yīng)時間、瓶頸資源做分析
1.線程
設(shè)置多少線程合適?
- 設(shè)置過多
- 設(shè)置過少
對象的生命周期,內(nèi)存的占用總量,內(nèi)核態(tài)與用戶態(tài)的切換
場景一
- cpu計算時間18ms(running)
- 查詢數(shù)據(jù)庫,網(wǎng)絡(luò)io時間80ms(waiting)
- 解析結(jié)果2ms
- 如果服務(wù)器2CPU,大家看看這里多少線程合適?
在充分利用CPU資源的情況下:
線程數(shù)量 = (18+80+2)/(18+2) * 2 = 10
結(jié)論1:以CPU計算為性能瓶頸
線程數(shù)量=((CPU時間+CPU等待時間) / CPU時間) * CPU數(shù)量
場景二
- 線程同步鎖(數(shù)據(jù)庫事務(wù)鎖)50ms
- cpu時間18ms
- 查詢數(shù)據(jù)庫,網(wǎng)絡(luò)io時間80ms
- 解析結(jié)果2ms
以CPU計算為瓶頸,計算線程數(shù)量
線程數(shù)=(18 + 2 + 50 + 80) / 20 * 2 = 15
以線程同步鎖為瓶頸,計算線程數(shù)
線程數(shù)=(50 + 18 + 2 + 80) / 50 * 1/1 = 3
結(jié)論2:已線程阻塞資源為瓶頸
瓶頸資源的線程并行數(shù)=瓶頸資源的總份數(shù)/單次請求占用瓶頸資源的份數(shù)
線程數(shù)量 =(線程總時間/瓶頸資源時間) * 瓶頸資源的線程并行數(shù)
2.響應(yīng)時間
響應(yīng)時間決定QPS?
QPS = 1000/響應(yīng)時間 * 線程數(shù)量
實例
線程數(shù)量=線程總時間/瓶頸資源時間 * 瓶頸資源并行數(shù)
線程數(shù)量=(30+10+30+10+20)/ (10 + 10 + 20) * 4 = 10
QPS = 線程數(shù)量 * 1000/響應(yīng)總時間
QPS = 10 * 1000/(30+10+30+10+20)
= 100
改進,將查詢操作并行
優(yōu)化后
線程數(shù)量=線程總時間/瓶頸資源時間 * 瓶頸資源并行數(shù)
線程數(shù)量=(30+10+10+20)/ (10 + 10 + 20) * 4 = 9
QPS = 線程數(shù)量 * 1000/響應(yīng)總時間
QPS = 9 * 1000/(30+10+10+20)
= 100
結(jié)論3:QPS = 1000/瓶頸資源時間 * 瓶頸資源并行數(shù)
線程數(shù)量=線程總時間/瓶頸資源時間 * 瓶頸資源幵行數(shù)
QPS = 線程數(shù)量 * 1000/線程總時間
===>
QPS = 1000/瓶頸資源時間 * 瓶頸資源并行數(shù)
3.瓶頸資源
要分析系統(tǒng)的瓶頸資源,需求對系統(tǒng)特性做個區(qū)分,分析出系統(tǒng)是哪種類型的系統(tǒng)
-
IO密集型系統(tǒng)
定義:IO密集型,即該任務(wù)需要大量的IO,即大量的阻塞。
在單線程上運行IO密集型任務(wù)會導(dǎo)致浪費大量的CPU運算能力浪費在等待。
所以IO密集型任務(wù)中使用多線程可以大大的加速程序運行,即使在單核CPU上,這種加速主要利用了被浪費掉的阻塞時間。第一種配置方式: 由于IO密集型任務(wù)線程并不是一直在執(zhí)行任務(wù),則應(yīng)配置盡可能多的線程。 配置公式:CPU核數(shù) * 2 第二種配置方式: IO密集型時,大部分線程都阻塞,故需要多配置線程數(shù)。 配置公式:CPU核數(shù) / (1 – 阻塞系數(shù))(0.8~0.9之間) 比如:8核 / (1 – 0.9) = 80個線程數(shù)
CPU密集型系統(tǒng)
定義:CPU密集型的意思就是該任務(wù)需要大量運算,而沒有阻塞,CPU一直全速運行
CPU密集型任務(wù)只有在真正的多核CPU上才可能得到加速(通過多線程)
CPU密集型任務(wù)配置盡可能少的線程數(shù)
CPU密集型線程數(shù)配置公式:(CPU核數(shù)+1)個線程的線程池