性能附錄:如何計算并發用戶數(摘自高樓老師《性能30講》)

高樓老師《性能30講》:?性能測試實戰30講-極客時間?感興趣的同學可以去讀一下,個人感覺寫的非常好

目錄

什么是并發?

在線用戶數、并發用戶數怎么計算

總結

什么是并發?

????????我們假設上圖中的這些小人是嚴格按照這個邏輯到達系統的,那顯然,系統的絕對并發用戶數是 4。如果描述 1 秒內的并發用戶數,那就是 16。

但是,在實際的系統中,用戶通常是這樣分配的:

積分服務的并發,那是 2;庫存服務的并發,那是 5;訂單服務,它自己是 5 個請求正在處理,但同時它又 hold 住了 5 個到庫存服務的鏈接,因為要等著它返回之后,再返回給前端。再細分下去之后,你會發現頭都大了,不知道要怎么描述并發了。

那么如何來描述上面的并發用戶數呢?在這里我建議用 TPS 來承載“并發”這個概念。

并發數是 16TPS,就是 1 秒內整個系統處理了 16 個事務。

在線用戶數、并發用戶數怎么計算

那么新問題又來了,在線用戶數和并發用戶數應該如何算呢?下面我們接著來看示意圖:

????????如上圖所示,總共有 32 個用戶進入了系統,但是綠色的用戶并沒有任何動作,那么顯然,在線用戶數是 32 個,并發用戶數是 16 個,這時的并發度就是 50%。

?但在一個系統中,通常都是下面這個樣子的。

????????為了能 hold 住更多的用戶,我們通常都會把一些數據放到 Redis 這樣的緩存服務器中。所以在線用戶數怎么算呢,如果僅從上面這種簡單的圖來看的話,其實就是緩存服務器能有多大,能 hold 住多少用戶需要的數據。

最多再加上在超時路上的用戶數。如下所示:

????????所以我們要是想知道在線的最大的用戶數是多少,對于一個設計邏輯清晰的系統來說,不用測試就可以知道,直接拿緩存的內存來算就可以了。

????????假設一個用戶進入系統之后,需要用 10k 內存來維護一個用戶的信息,那么 10G 的內存就能 hold 住 1,048,576 個用戶的數據,這就是最大在線用戶數了。在實際的項目中,我們還會將超時放在一起來考慮。

????????但并發用戶數不同,他們需要在系統中執行某個動作。我們要測試的重中之重,就是統計這些正在執行動作的并發用戶數。

????????當我們統計生產環境中的在線用戶數時,并發用戶數也是要同時統計的。這里會涉及到一個概念:并發度。

????????要想計算并發用戶和在線用戶數之間的關系,都需要有并發度。

????????做性能的人都知道,我們有時會接到一個需求,那就是一定要測試出來系統最大在線用戶數是多少。這個需求怎么做呢?

????????很多人都是通過加思考時間(有的壓力工具中叫等待時間,Sleep 時間)來保持用戶與系統之間的 session 不斷,但實際上的并發度非常非常低。

????????這里有一個比較嚴重的理解誤區,那就是壓力工具中的線程或用戶數到底是不是用來描述性能表現的?我們通過一個示意圖來說明:

通過這個圖,我們可以看到一個簡單的計算邏輯:

1.?如果有 10000 個在線用戶數,同時并發度是 1%,那顯然并發用戶數就是 100。

2.?如果每個線程的 20TPS,顯然只需要 5 個線程就夠了(請注意,這里說的線程指的是壓力機的線程數)。

3.?這時對 Server 來說,它處理的就是 100TPS,平均響應時間是 50ms。50ms 就是根據 1000ms/20TPS 得來的(請注意,這里說的平均響應時間會在一個區間內浮動,但只要 TPS 不變,這個平均響應時間就不會變)。

4.?如果我們有兩個 Server 線程來處理,那么一個線程就是 50TPS,這個很直接吧。

5.?請大家注意,這里我有一個轉換的細節,那就是并發用戶數到壓力機的并發線程數。這一步,我們通常怎么做呢?就是基準測試的第一步。關于這一點,我們在后續的場景中交待。

????????而我們通常說的“并發”這個詞,依賴 TPS 來承載的時候,指的都是 Server 端的處理能力,并不是壓力工具上的并發線程數。在上面的例子中,我們說的并發就是指服務器上 100TPS 的處理能力,而不是指 5 個壓力機的并發線程數。所以,不要在意你用的是什么壓力工具,只要在意你服務端的處理能力就可以了。

現在來看一個實例。這個例子很簡單,就是:

????????我們可以看到,JMeter 的平均響應時間基本都在 5ms,因為只有一個壓力機線程,所以它的 TPS 應該接近 1000ms/5ms=200TPS。從測試結果上來看,也確實是接近的。有人說為什么會少一點?因為這里算的是平均數,并且這個數據是 30s 刷新一次,用 30 秒的時間內完成的事務數除以 30s 得到的,但是如果事務還沒有完成,就不會計算在內了;同時,如果在這段時間內有一兩個時間長的事務,也會拉低 TPS。

那么對于服務端呢,我們來看看服務端線程的工作情況。

可以看到在服務端,我開了 5 個線程,但是服務端并沒有一直干活,只有一個在干活的,其他的都處于空閑狀態。

這是一種很合理的狀態。但是你需要注意的是,這種合理的狀態并不一定是對的性能狀態。

1.?并發用戶數(TPS)是 193.6TPS。如果并發度為 5%,在線用戶數就是 193.6/5%=3872。

2.?響應時間是 5ms。

3.?壓力機并發線程數是 1。這一條,我們通常也不對非專業人士描述,只要性能測試工程師自己知道就可以了。

下面我們換一下場景,在壓力機上啟動 10 個線程。結果如下

平均響應時間在 25ms,我們來計算一處,(1000ms/25ms)*10=400TPS,而最新刷出來的一條是 396.2,是不是非常合理?

下面我們換一下場景,在壓力機上啟動 10 個線程。結果如下:

再回來看看服務端的線程:

同樣是 5 個線程,現在就忙了很多。

并發用戶數(TPS)是 396.2TPS。如果并發度為 5%,在線用戶數就是 396.2/5%=7924。響應時間是 25ms。壓力機并發線程數是 10。

如果要有公式的話,這個計算公式將非常簡單:

TPS=響應時間(單位ms)1000ms??壓力機線程數

????????你也許會說,這個我理解了,服務端有多少個線程,就可以支持多少個壓力機上的并發線程。但是這取決于 TPS 有多少,如果服務端處理的快,那壓力機的并發線程就可以更多一些。

????????這個邏輯看似很合理,但是通常服務端都是有業務邏輯的,既然有業務邏輯,顯然不會比壓力機快。應該說,服務端需要更多的線程來處理壓力機線程發過來的請求。所以我們用幾臺壓力機就可以壓幾十臺服務端的性能了。

????????如果在一個微服務的系統中,因為每個服務都只做一件事情,拆分得很細,我們要注意整個系統的容量水位,而不是看某一個服務的能力,這就是拉平整個系統的容量。

總結

????????通過示意圖和示例,描述了在線用戶數、并發用戶數、TPS(這里我們假設了一個用戶只對應一個事務)、響應時間之間的關系。有幾點需要強調:

????????1.?通常所說的并發都是指服務端的并發,而不是指壓力機上的并發線程數,因為服務端的并發才是服務器的處理能力。

????????2.?性能中常說的并發,是用 TPS 這樣的概念來承載具體數值的。

????????3.?壓力工具中的線程數、響應時間和 TPS 之間是有對應關系的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70887.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70887.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70887.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于yolov8的糖尿病視網膜病變嚴重程度檢測系統python源碼+pytorch模型+評估指標曲線+精美GUI界面

【算法介紹】 基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統 基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統是一款利用深度學習技術,專為糖尿病視網膜病變早期診斷設計的智能輔助工具。該系統采用YOLOv8目標檢測模型,結合經過標注和處理的醫學影像數…

學習路程八 langchin核心組件 Models補充 I/O和 Redis Cache

前序 之前了解了Models,Prompt,但有些資料又把這塊與輸出合稱為模型輸入輸出(Model I/O)?:這是與各種大語言模型進行交互的基本組件。它允許開發者管理提示(prompt),通過通用接口調…

DeepSeek 開源狂歡周(五)正式收官|3FS并行文件系統榨干SSD

千呼萬喚始出來!在 DeepSeek 開源周 的第五天,今日正式收官!在大模型訓練中,每個epoch都在與存儲系統進行光速競賽——數據加載延遲會扭曲計算時空,KVCache訪問瓶頸將引發推理坍縮。DeepSeek開源的 3FS文件系統&#x…

特征工程中的三大向量化工具詳解

特征工程中的三大向量化工具詳解 在文本處理和特征工程中,TfidfVectorizer、CountVectorizer 和 DictVectorizer 是常用的工具,用于將原始數據轉換為機器學習模型可用的數值特征。以下是它們的核心區別、用法及示例: 1. CountVectorizer&…

C++ Qt常見面試題(4):Qt事件過濾器

在 Qt 中,事件過濾器(Event Filter)提供了一種機制,可以攔截并處理對象的事件(如鼠標事件、鍵盤事件等),在事件到達目標對象之前對其進行預處理。事件過濾器通常用于以下場景: 捕獲和處理特定的事件(如鼠標點擊、按鍵等);對事件進行篩選或修改;實現全局的事件監聽功…

TCP基本入門-簡單認識一下什么是TCP

部分內容來源:小林Coding TCP的特點 1.面向連接 一定是“一對一”才能連接,不能像 UDP 協議可以一個主機同時向多個主機發送消息,也就是一對多是無法做到的 2.可靠的 無論的網絡鏈路中出現了怎樣的鏈路變化,TCP 都可以保證一個…

PING命令TTL解析

在 ping 命令中,TTL(Time to Live,生存時間) 是 IP 數據包的核心字段之一,用于控制數據包在網絡中的生命周期。以下是針對 TTL 的簡明解析: 1. TTL 的核心作用 防循環機制:TTL 是一個計數器&a…

PySide(PyQT)重新定義contextMenuEvent()實現鼠標右鍵彈出菜單

在 PySide中,contextMenuEvent() 是 QWidget 類(以及繼承自它的所有子類)的一個事件處理方法,主要用于處理上下文菜單事件,也就是當用戶在控件上右鍵點擊時觸發的事件。 ? 通過重新定義contextMenuEvent()來實現自定…

GitHub SSH連接問題解決指南

🔍 GitHub SSH連接問題解決指南 問題描述 遇到錯誤:ssh: connect to host github.com port 22: Connection refused 說明您的網絡環境無法訪問GitHub的SSH端口22,常見原因: 防火墻/網絡運營商限制(國內常見&#xf…

Go紅隊開發—并發編程

文章目錄 并發編程go協程chan通道無緩沖通道有緩沖通道創建?緩沖和緩沖通道 等協程sync.WaitGroup同步Runtime包Gosched()Goexit() 區別 同步變量sync.Mutex互斥鎖atomic原子變量 SelectTicker定時器控制并發數量核心機制 并發編程階段練習重要的細節端口掃描股票監控 并發編程…

RabbitMQ 的介紹與使用

一. 簡介 1> 什么是MQ 消息隊列(Message Queue,簡稱MQ),從字面意思上看,本質是個隊列,FIFO先入先出,只不過隊列中存放的內容是message而已。 其主要用途:不同進程Process/線程T…

常用的AI文本大語言模型匯總

AI文本【大語言模型】 1、文心一言https://yiyan.baidu.com/ 2、海螺問問https://hailuoai.com/ 3、通義千問https://tongyi.aliyun.com/qianwen/ 4、KimiChat https://kimi.moonshot.cn/ 5、ChatGPThttps://chatgpt.com/ 6、魔塔GPT https://www.modelscope.cn/studios/iic…

在自己的數據上復現一下LlamaGen

git倉庫:https://github.com/FoundationVision/LlamaGen 數據集準備 如果用ImageFolder讀取,則最好和ImageNet一致。 data_path/class_1/image_001.jpgimage_002.jpg...class_2/image_003.jpgimage_004.jpg......class_n/image_005.jpgimage_006.jpg.…

Go入門之接口

type Usber interface {start()stop() } type Phone struct {Name string }func (p Phone) start() {fmt.Println(p.Name, "啟動") } func (p Phone) stop() {fmt.Println(p.Name, "關機") } func main() {p : Phone{Name: "華為手機",}var p1 U…

【數據結構進階】哈希表

🌟🌟作者主頁:ephemerals__ 🌟🌟所屬專欄:數據結構 目錄 前言 一、哈希表的概念 二、哈希函數的實現方法 1. 直接定址法 2. 除留余數法 三、哈希沖突 1. 開放定址法(閉散列&#xff0…

《深度學習實戰》第4集:Transformer 架構與自然語言處理(NLP)

《深度學習實戰》第4集:Transformer 架構與自然語言處理(NLP) 在自然語言處理(NLP)領域,Transformer 架構的出現徹底改變了傳統的序列建模方法。它不僅成為現代 NLP 的核心,還推動了諸如 BERT、…

高效管理 React 狀態和交互:我的自定義 Hooks 實踐

高效管理 React 狀態和交互:自定義 Hooks 實踐 在 React 中,Hooks 是一種使我們能夠在函數組件中使用狀態和副作用的強大工具。隨著項目的增大,重復的邏輯可能會出現在多個組件中,這時使用自定義 Hooks 就非常合適。它們幫助我們…

Exoplayer(MediaX)實現音頻變調和變速播放

在K歌或錄音類應用中變調是個常見需求,比如需要播出蘿莉音/大叔音等。變速播放在影視播放類應用中普遍存在,在傳統播放器Mediaplayer中這兩個功能都比較難以實現,特別在低版本SDK中,而Exoplayer作為google官方推出的Mediaplayer替…

Meta最新研究:從單張照片到3D數字人的革命性突破

隨著人工智能技術的發展,3D建模和虛擬人物生成逐漸變得更加普及和高效。Meta(前身為Facebook)的最新研究成果展示了如何僅通過一張普通手機拍攝的照片就能生成高質量、全方位的3D數字人。這項技術不僅適用于虛擬試衣、游戲角色建模,還能廣泛應用于AR/VR內容生成等領域。本文…

軟件供應鏈安全工具鏈研究系列——RASP自適應威脅免疫平臺(上篇)

1.1 基本能力 RASP是一種安全防護技術,運行在程序執行期間,使程序能夠自我監控和識別有害的輸入和行為。也就是說一個程序如果注入或者引入了RASP技術,那么RASP就和這個程序融為一體,使應用程序具備了自我防護的能力,…