假設(shè)一個(gè)內(nèi)部系統(tǒng)要求響應(yīng)時(shí)間在 3s 以內(nèi),支持最大用戶數(shù)為4萬。根據(jù)二八原則,80%用戶在20%時(shí)間使用系統(tǒng),(4w80%)/(24h20%)≈1.9點(diǎn)擊/秒。并發(fā)數(shù)=TPS(運(yùn)行時(shí)間+思考時(shí)間)=1.9(3+0.5+0.3+3+0.5+0.3+0.5+3)=21。
注意:二八原則計(jì)算的結(jié)果并非是并發(fā)數(shù),而是系統(tǒng)要達(dá)到的處理能力(吞吐量),初學(xué)者容易被誤導(dǎo),拿著這個(gè)數(shù)據(jù)就去設(shè)置并發(fā)數(shù),這是錯(cuò)誤的哦。 如果你的系統(tǒng)性能要求更高,也可以選擇一九原則或更嚴(yán)格的算法,二八原則比較通用,一般系統(tǒng)性能比較接近這個(gè)算法而已,大家應(yīng)該活用。
基于以上,如果我們通過測試得到的最大吞吐量大于計(jì)算出來的吞吐量(TPS≈1.9),且各項(xiàng)性能指標(biāo)均達(dá)標(biāo),那么系統(tǒng)就是安全的。如果用戶發(fā)帖遵循正態(tài)分布,那么并發(fā)請求數(shù)峰值還肯定會大于上述估算的吞吐量(并發(fā)數(shù)大于吞吐量???)。
一、場景設(shè)計(jì)
場景編號:001 - 基準(zhǔn)測試
目的:驗(yàn)證測試環(huán)境、驗(yàn)證腳本,得到系統(tǒng)的性能基準(zhǔn),為后續(xù)測試提供參考。
| 涉及業(yè)務(wù) | 業(yè)務(wù)占比 | 運(yùn)行時(shí)間 | 并發(fā)數(shù) |
|---|---|---|---|
| 瀏覽任務(wù) | 20% | 5分鐘 | 1 |
| 登錄 | 20% | 1 | |
| 新建任務(wù) | 20% | 1 | |
| 配置任務(wù) | 20% | 1 | |
| 刪除任務(wù) | 20% | 1 |
場景編號:002 - 配置測試
目的:優(yōu)化配置,測試當(dāng)前軟、硬件配置是否能夠滿足性能指標(biāo)。
| 涉及業(yè)務(wù) | 業(yè)務(wù)占比 | 運(yùn)行時(shí)間 | 并發(fā)數(shù) |
|---|---|---|---|
| 瀏覽任務(wù) | 38% | NA | 8 |
| 登錄 | 28% | 6 | |
| 新建任務(wù) | 19% | 4 | |
| 配置任務(wù) | 10% | 2 | |
| 刪除任務(wù) | 5% | 1 |
場景編號:003 - 負(fù)載測試
目的:分析性能變化趨勢,找出性能瓶頸與風(fēng)險(xiǎn),對系統(tǒng)進(jìn)行定容定量。
| 涉及業(yè)務(wù) | 業(yè)務(wù)占比 | 運(yùn)行時(shí)間 | 并發(fā)數(shù) |
|---|---|---|---|
| 瀏覽任務(wù) | 38% | NA | 8/16/24 |
| 登錄 | 28% | 6/12/18 | |
| 新建任務(wù) | 19% | 4/8/12 | |
| 配置任務(wù) | 10% | 2/4/6 | |
| 刪除任務(wù) | 5% | 1/2/3 |
場景編號:004 - 穩(wěn)定性測試
目的:長時(shí)間(>8小時(shí))運(yùn)行大量負(fù)載,確定系統(tǒng)軟硬件環(huán)境是否運(yùn)行穩(wěn)定。
| 涉及業(yè)務(wù) | 業(yè)務(wù)占比 | 運(yùn)行時(shí)間 | 并發(fā)數(shù) |
|---|---|---|---|
| 瀏覽任務(wù) | 38% | >12小時(shí) | 42 |
| 登錄 | 28% | ||
| 新建任務(wù) | 19% | ||
| 配置任務(wù) | 10% | ||
| 刪除任務(wù) | 5% |
二、場景實(shí)現(xiàn)
單線程組實(shí)現(xiàn)測試場景
假設(shè)業(yè)務(wù)比例為 “查看詳情(8):登錄(6):新建任務(wù)(4):(配置任務(wù))2:(刪除任務(wù))1”。差不多每3個(gè)登錄會有4個(gè)查看任務(wù),新建2個(gè)任務(wù),配置1個(gè)任務(wù);每6個(gè)登錄,刪除1個(gè)任務(wù)。我們使用 If邏輯控制器 + ${__counter(arg1, arg2)}函數(shù)來實(shí)現(xiàn)。
- 新建任務(wù)的If控制器條件:登錄(3)/新建(2)
${__counter(true,i)}%2==1||${__counter(true,i)}%3==0 - 配置任務(wù)的If控制器條件:登錄(3)/配置(1)
${__counter(true,i)}%3==0 - 刪除任務(wù)的If控制器條件:登錄(6)/刪除(1)
${__counter(true,i)}%6==0 - 查看任務(wù):因?yàn)榕渲煤蛣h除操作包含查看的業(yè)務(wù),所以單獨(dú)的登錄/查看比為6:(8-2-1),即6:5。
${__counter(true,i)}%5!=0||${__counter(true,i)}%6==0
多線程組實(shí)現(xiàn)測試場景
多線程組的場景設(shè)計(jì)需要注意的是業(yè)務(wù)關(guān)聯(lián)關(guān)系。比如查看任務(wù)可以不需要登錄的;新建、配置、刪除任務(wù)都需要登錄且并發(fā)數(shù)的和大于登錄,說明有些場景是登錄后執(zhí)行了多業(yè)務(wù)的;查看詳情的并發(fā)數(shù)小于登錄,所以有部分用戶可能是登陸后只查看了詳情。按照 “查看詳情(8):登錄(6):新建任務(wù)(4):(配置任務(wù))2:(刪除任務(wù))1” 的比例,以及用戶實(shí)際使用場景來算,得到如下場景:
- 登錄(2)-新建任務(wù)(2)
- 登錄(2)-新建任務(wù)(2)-配置任務(wù)(2)-查看詳情(2)
- 登錄(1)-查看詳情(1)-刪除任務(wù)(1)
- 登錄(1)-查看詳情(1)
- 查看詳情(4)
兩種腳本實(shí)現(xiàn)方式的對比
| 對比 | 單線程組 | 多線程組 |
|---|---|---|
| 優(yōu)勢 | 參數(shù)化容易,保證運(yùn)行的線程間的參數(shù)的唯一性。 | 線程組間互不干擾,簡單明了,易于維護(hù)。 |
| 劣勢 | 腳本順序執(zhí)行,相互之間有影響;腳本復(fù)雜度高。 | 多個(gè)線程組相當(dāng)于多個(gè)不同的腳本,需要分開參數(shù)化,保證每個(gè)線程取到參數(shù)的唯一性。 |
三、測試執(zhí)行
場景編號:001 - 基準(zhǔn)測試
基準(zhǔn)測試采用單用戶、單業(yè)務(wù)場景的執(zhí)行方式。測試時(shí)間盡可能長,盡量執(zhí)行多次(通常建議3次以上),取相對穩(wěn)定的結(jié)果,目的是統(tǒng)計(jì)響應(yīng)時(shí)間的取樣更多,測試結(jié)果越準(zhǔn)確。對于發(fā)現(xiàn)的異常,如果不熟悉就請開發(fā)團(tuán)隊(duì)告訴你有哪些作業(yè)任務(wù),這些作業(yè)任務(wù)的頻度是否適中。



結(jié)論:滿足性能需求3s以內(nèi),事務(wù)正確率100%,且CPU、內(nèi)存、磁盤表現(xiàn)正常(局域網(wǎng)不考慮網(wǎng)絡(luò)影響)。測試環(huán)境檢查通過,腳本檢查通過,可以考慮對系統(tǒng)進(jìn)一步的測試。
場景編號:002 - 配置測試
先確定配置測試的目標(biāo):
(1)JVM配置
(2)Tomcat線程池配置
(3)數(shù)據(jù)庫連接池配置
(4)數(shù)據(jù)庫的一些配置
配置測試場景一般為混合場景(多個(gè)業(yè)務(wù)同時(shí)執(zhí)行)。
(1)JVM Heap大小及不同代的大小指定???Heap回收算法的選擇???(P316)
(2)Tomcat線程數(shù)配置???
(3)數(shù)據(jù)庫緩存、臨時(shí)表空間,大表水平切分,主從結(jié)構(gòu)、讀寫分離、主從備份、主主備份等???。



結(jié)論:隨著并發(fā)數(shù)的增加,響應(yīng)時(shí)間也逐漸增加,但仍然滿足3s以內(nèi)的性能指標(biāo);事務(wù)正確率100%;查看詳情、登錄、新建任務(wù)、配置任務(wù)、刪除任務(wù)各業(yè)務(wù)之比接近6:8:4:2:1;TPS未出現(xiàn)明顯拐點(diǎn);CPU、內(nèi)存、磁盤均正常。性能表現(xiàn)能夠滿足需求,系統(tǒng)性能瓶頸風(fēng)險(xiǎn)在CPU。
場景編號:003 - 負(fù)載測試
負(fù)載測試在滿足系統(tǒng)性能指標(biāo)的基礎(chǔ)上進(jìn)行測試,尋找性能的拐點(diǎn)。負(fù)載測試分為單場景與混合場景。單場景有利于分析性能問題,因?yàn)榕懦似渌麡I(yè)務(wù)干擾;混合場景更貼近用戶實(shí)際使用習(xí)慣,是一個(gè)綜合的性能評估。建議先做單場景測試,再做混合場景測試。
我們一般采用二分法,如總的線程數(shù)遞增為21/42/84,當(dāng)發(fā)現(xiàn)線程增大后性能降低,再對該區(qū)間進(jìn)行二分嘗試,最后對拐點(diǎn)附近精細(xì)嘗試得到最大吞吐量。




結(jié)論:執(zhí)行過程中,CPU首先出現(xiàn)性能瓶頸,利用率接近100%。響應(yīng)時(shí)間開始大于3s,TPS降低,出現(xiàn)失敗的事務(wù)。此時(shí)的內(nèi)存、磁盤、網(wǎng)絡(luò)均表現(xiàn)正常。此時(shí)應(yīng)優(yōu)先解決CPU的瓶頸問題,再反復(fù)進(jìn)行負(fù)載測試,直到在沒有硬件瓶頸的條件下找到系統(tǒng)的性能拐點(diǎn)。
場景編號:004 - 穩(wěn)定性測試
穩(wěn)定性測試在正常性能閥值下盡量加大負(fù)載。什么是閥值呢?比如響應(yīng)時(shí)間要求3s以內(nèi),3秒就是閥值;比如CPU利用率70%以下,70%就是閥值。假設(shè)滿足性能要求的負(fù)載是B,那么穩(wěn)定性測試時(shí)負(fù)載一般是1.5B~2B。
在此案例中我們滿足性能需求的并發(fā)量是21,那么在做穩(wěn)定性測試時(shí),并發(fā)量應(yīng)該是1.521~221即32~42之間。運(yùn)行時(shí)間原則上越長越好,慣例要求不低于8小時(shí)。有些隱藏較深的諸如內(nèi)存溢出的問題是需要長時(shí)間運(yùn)行才能反映出來的。如果各項(xiàng)性能指標(biāo)都在閥值內(nèi),且性能表現(xiàn)平穩(wěn),則可以認(rèn)為通過穩(wěn)定性測試。
除了分析響應(yīng)時(shí)間、TPS和服務(wù)器硬件性能外,我們也要關(guān)注JVM內(nèi)存回收情況,MySQL有無慢查詢等。