淺談那些年讓運維掉了大把頭髮的併發統計
隨筆:今天筆者給大家分享一下自己收集的關於併發量統計比較好的文章,注意是收集來的,不是筆者自寫,在這裡向原著致敬!
普通的Web系統,關於併發量與使用者數的關係計算如下:
1.單臺伺服器最高併發數2000,這是業內的大牛通過各種架構/優化/技術實現的. 我們水平沒那麼高, 但200併發 絕對是沒問題的.
2.單個請求的處理時間, 理論上的極值為70ms(這是內網Web伺服器訪問資料庫伺服器的網路時間), 我們水平沒那麼高, 但也絕對可以在500ms內完成一次請求(不包括使用者到Web伺服器的網路時間)
3.根據以上, 單臺伺服器 每秒可響應 400個請求.
4.每小時響應 144W 請求.
5.每天的響應不能簡單 乘以24, 因為正常系統,晚上沒人用, 電子商務通常在早10,下午14點,晚上19點附近會有高峰期. 根據經驗,高峰期 一小時的請求量是每天請求量的十分之一.
即每天響應 1440W請求.
6.每個頁面平均有2個請求(Ajax會導致額外的請求), 靜態資源請求不計入,這個只跟網路有關,即,每天響應720W個頁面
7.根據經驗,在網站發生實質性業務的使用者 ,平均開啟100個頁面(這個是往高了說的). 即 單臺伺服器 每天可支援 7.2W個實質交易.
8.根據經驗 每天 登入使用者數是交易使用者數的十倍,但頁面開啟數極少,通常是1-10, 這個忽略. 即, 單臺伺服器每天 有 72W個登入使用者.
9.根據經驗,註冊使用者是每天登入使用者的10倍(如果沒有刷殭屍使用者的話), 單臺伺服器可以為 720W個註冊使用者服務.
10.使用負載均衡後,通常負載均衡伺服器 會是 2/4/8/16 這個規模 , 通常不會超過16. 即 16個負載均衡伺服器 可 服務 1.15億使用者(這個至少也是京東的級別了)
最後: 如果使用者數超過以上計算,或者業務複雜度導致無法實現200併發(如:複雜業務,幾十個流程),那麼 我們會根據實際專案情況 採取 其他技術手段來提高 伺服器叢集的響應能力
如: 快取memcache, 更高速的資料庫mongo/redis,動靜分離CDN,資料庫分庫/分表
再比如: 部分關鍵節點採用Java進行處理, 這裡並不是說Java就比PHP好, 但在極限速度響應上,Java的確比PHP快, Java程式駐留記憶體啊~~~
網站併發量的計算方法
PV是什麼:
PV是page view的簡寫。PV是指頁面的訪問次數,每開啟或重新整理一次頁面,就算做一個pv。
計算模型:
每臺伺服器每秒處理請求的數量=((80%*總PV量)/(24小時*60分*60秒*40%)) / 伺服器數量 。
其中關鍵的引數是80%、40%。表示一天中有80%的請求發生在一天的40%的時間內。24小時的40%是9.6小時,有80%的請求發生一天的9.6個小時當中(很適合網際網路的應用,白天請求多,晚上請求少)。
簡單計算的結果:
((80%*500萬)/(24小時*60分*60秒*40%))/1 = 115.7個請求/秒
((80%*100萬)/(24小時*60分*60秒*40%))/1 = 23.1個請求/秒
初步結論:
現在我們在做壓力測試時,就有了標準,如果你的伺服器一秒能處理115.7個請求,就可以承受500萬PV/每天。如果你的伺服器一秒能處理23.1個請求,就可以承受100萬PV/每天。
留足餘量:
以上請求數量是均勻的分佈在白天的9.6個小時中,但實際情況並不會這麼均勻的分佈,會有高峰有低谷。為了應對高峰時段,應該留一些餘地,最少也要x2倍,x3倍也不為過。
115.7個請求/秒 *2倍=231.4個請求/秒
115.7個請求/秒 *3倍=347.1個請求/秒
23.1個請求/秒 *2倍=46.2個請求/秒
23.1個請求/秒 *3倍=69.3個請求/秒
最終結論:
如果你的伺服器一秒能處理231.4--347.1個請求/秒,就可以應對平均500萬PV/每天。
如果你的伺服器一秒能處理46.2--69.3個請求,就可以應對平均100萬PV/每天。
說明:
這裡說明每秒N個請求,就是QPS。因為我關心的是應用程式處理業務的能力。
實際經驗:
1、根據實際經驗,採用兩臺常規配置的機架式伺服器,配置是很常見的配置,例如一個4核CPU+4G記憶體+伺服器SAS硬碟。
2、個人武斷的認為在伺服器CPU領域Intel的CPU要優於AMD的CPU,有反對的就反對吧,我都說我武斷了(請看CPU效能比較),不要太相信AMD的廣告,比較CPU效能簡單辦法就是比價格,不要比頻率與核心數,價格相差不多的效能也相差不多。
3、硬碟的效能很重要,由其是資料庫伺服器。一般的伺服器都配1.5萬轉的SAS硬碟,高階一點的可以配SSD固態硬碟,效能會更好。最最最最重要的指標是“隨機讀寫效能”而不是“順序讀寫效能”。(本例還是配置最常見的1.5萬轉的SAS硬碟吧)
4、一臺伺服器跑Tomcat執行j2ee程式,一臺伺服器跑MySql資料庫,程式寫的中等水平(這個真的不好量化),是論壇型別的應用(總有回帖,不太容易做快取,也無法靜態化)。
5、以上軟硬體情況下,是可以承受100萬PV/每天的。(已留有餘量應對突然的訪問高峰)
注意機房的網路頻寬:
有人說以上條件我都滿足了,但實際效能還是達不到目標。這時請注意你對外的網路的頻寬,在國內伺服器便宜但頻寬很貴,很可能你在機房是與大家共享一條100M的光纖,實際每個人可分到2M左右頻寬。再好一點5M,再好一點雙線機房10M獨享,這已經很貴了(北京價格)。
一天總流量:每個頁面20k位元組*100萬個頁面/1024=19531M位元組=19G位元組,
19531M/9.6小時=2034M/小時=578K位元組/s 如果請求是均勻分佈的,需要5M(640K位元組)頻寬(5Mb=640KB 注意大小寫,b是位,B是位元組,差了8倍),但所有請求不可能是均勻分佈的,當有高峰時5M頻寬一定不夠,X2倍就是10M頻寬。10M頻寬基本可以滿足要求。
以上是假設每個頁面20k位元組,基本不包含圖片,要是包含圖片就更大了,10M頻寬也不能滿足要求了。你自已計算吧。
附:效能測試基本概念
---------------------------------------------------------------------------------------
基本概念:
Throughput(吞吐量):按照常規理解網路吞吐量表示在單位時間內通過網路卡資料量之和,其中即包括本機網路卡傳送出去的資料量也包括本機網路卡接收到的資料量。 一個100Mb(位)的雙工網路卡,最大傳送資料的速度是12.5M位元組/s , 最大接收資料的速度是12.5M位元組/s, 可以 同時 收發 資料。
併發使用者數:是同時執行操作的使用者(執行緒數)。
響應時間:從請求發出到收到響應花費的時間 。
QPS - Queries Per Second 每秒處理的查詢數(如果是資料庫,就相當於讀取)
TPS - Transactions Per Second 每秒處理的事務數(如果是資料庫,就相當於寫入、修改)
IOPS,每秒磁碟進行的I/O操作次數
例如對某個資料庫測試,分開兩次測QPS與TPS。
QPS(讀取)值總是高於TPS(寫、改),並且有倍率關係,因為:
1、資料庫對查詢可能有快取。
2、機械硬碟或SSD硬碟的讀就是比寫快。
系統的平均併發使用者數和併發數峰值如何估算
一、經典公式1:
一般來說,利用以下經驗公式進行估算系統的平均併發使用者數和峰值資料
1)平均併發使用者數為 C = nL/T
2)併發使用者數峰值 C‘ = C + 3*根號C
C是平均併發使用者數,n是login session的數量,L是login session的平均長度,T是值考察的時間長度
C’是併發使用者數峰值
舉例1,假設系統A,該系統有3000個使用者,平均每天大概有400個使用者要訪問該系統(可以從系統日誌從獲得),對於一個典型使用者來說,一天之內使用者從登陸到退出的平均時間為4小時,而在一天之內,使用者只有在8小時之內會使用該系統。
那麼,
平均併發使用者數為:C = 400*4/8 = 200
併發使用者數峰值為:C‘ = 200 + 3*根號200 = 243
舉例2, 某公司為其170000名員工設計了一個薪酬系統,員工可進入該系統查詢自己的薪酬資訊,但並不是每個人都會用這個系統,假設只有50%的人會定期用該系統,這些人裡面有70%是在每個月的最後一週使用一次該系統,且平均使用系統時間為5分鐘。
則一個月最後一週的平均併發使用者數為(朝九晚五):
n = 170000*0.5*0.7/5 = 11900
C= 11900*5/60/8 = 124
吞吐量計算為:F = Vu * R / T 單位為個/s
F為事務吞吐量,Vu為虛擬使用者數個數,R為每個虛擬使用者發出的請求數,T為處理這些請求所花費的時間
二、通用公式2:
對絕大多數場景,我們用(使用者總量/統計時間)*影響因子(一般為3)來進行估算併發量。
比如,以乘坐地鐵為例子,每天乘坐人數為5萬人次,每天早高峰是7到9點,晚高峰是6到7點,根據8/2原則,80%的乘客會在高峰期間乘坐地鐵,則每秒到達地鐵檢票口的人數為50000*80%/(3*60*60)=3.7,約4人/S,考慮到安檢,入口關閉等因素,實際堆積在檢票口的人數肯定比這個要大,假定每個人需要3秒才能進站,那實際併發應為4人/s*3s=12,當然影響因子可以根據實際情況增大!
三、根據PV計算公式:
比如一個網站,每天的PV大概1000w,根據2/8原則,我們可以認為這1000w pv的80%是在一天的9個小時內完成的(人的精力有限),那麼TPS為:
1000w*80%/(9*3600)=246.92個/s,取經驗因子3,則併發量應為:
246.92*3=740
四、根據TPS估計:
公式為 C = (Think time + 1)*TPS
五、根據系統使用者數計算:
併發使用者數 = 系統最大線上使用者數的8%到12%
相關文章
- 淺談IT運維運維
- 淺談Java併發Java
- 淺談Blazor開發的那些事Blazor
- 「IT運維迷宮」那些讓人頭疼的常見問題與破局之道運維
- 淺談併發加鎖
- 淺談java中的併發控制Java
- 淺談前端線上部署與運維前端運維
- 淺談高併發-前端優化前端優化
- 從“悲劇”的幾個運維場景談談運維開發的痛點運維
- 那些年讓我們頭疼的CSS3動畫CSSS3動畫
- 淺談高併發和設計的一些原則(JAVA)Java
- 運維角度淺談MySQL資料庫優化運維MySql資料庫優化
- 運維角度淺談 MySQL 資料庫優化運維MySql資料庫優化
- Istio 運維實戰系列(2):讓人頭大的『無頭服務』-上運維
- Istio 運維實戰系列(3):讓人頭大的『無頭服務』-下運維
- 淺談任務分發中的機制與併發
- 談談高可用系統的運維設施建設運維
- IT運維淺見運維
- 那些年你追過的女神:開發人員應該懂多少運維運維
- 從運維角度淺談 MySQL 資料庫優化運維MySql資料庫優化
- 讓程式設計師少掉幾根頭髮的Facebook智慧bug修復神器程式設計師
- 雲端計算運維與傳統運維的探討運維
- 還在寫那些讓人頭皮發麻的程式碼嗎?
- IT運維產品發展戲談薦運維
- 運維審計系統運維
- 從運維角度淺談MySQL資料庫最佳化運維MySql資料庫
- [譯]Go併發程式設計中的那些事Go程式設計
- Python | 淺談併發鎖與死鎖問題Python
- 【多執行緒與高併發】- 淺談volatile執行緒
- Java多執行緒/併發09、淺談volatileJava執行緒
- 如何實現高效運維?來談談效能優化那些事(含直播回顧 Q&A)運維優化
- 別讓程式碼愁白頭髮!15 個 Python 函式拯救你的開發生活Python函式
- 談談高併發系統的一些解決方案
- 多伺服器運維管理運維管理不再頭疼伺服器運維
- 運維小哥談規則運維
- 工具篇 | 淺談測試那些恩怨情仇
- 掉了兩根頭髮後,我悟了!vue3的scoped原來是這樣避免樣式汙染(上)Vue
- 掉了兩根頭髮後,我悟了!vue3的scoped原來是這樣避免樣式汙染(下)Vue