高并發常用術語:
- QPS:每秒鐘請求或者查詢的數量,在網際網路領域,指每秒響應請求數(指HTTP請求)
- 吞吐量:機關時間内處理的請求數量(通常由QPS與并發數決定)
- 響應時間:從請求發出到收到響應花費的時間,例如系統處理一個HTTP請求需要100ms,這個100ms就是系統的響應時間
- PV:綜合浏覽量(Page View),即頁面浏覽量或者點選量,一個訪客在24小時内通路的頁面數量,同一個人浏覽你的網站同一頁面,隻記作一次PV
- UV:獨立通路(UniQue Visitor),即一定時間範圍内相同訪客多次通路網站,隻計算為1個獨立訪客
-
帶寬:計算帶寬大小需關注兩個名額,峰值流量和頁面的平均大小
日網站帶寬=PV/統計時間(換算到秒)平均頁面大小(機關KB)8
峰值一般是平均值的倍數,根據實際情況來定
QPS不等于并發連接配接數
QPS是每秒HTTP請求數量,并發連接配接數是系統同時處理的請求數量
(總PV數80%)/(6小時秒數20%)=峰值每秒請求數(QPS)
80%的通路量集中在20%的時間!!!
-
PS達到50
可以稱之為小型網站,一般的伺服器就可以應付
-
QPS達到100
假設關系型資料庫的每次請求在0.01秒完成
假設單頁面隻有一個SQL查詢,那麼100QPS意味着1秒鐘完成100次請求,但是此時我們并不能保證資料庫查詢能完成100次
方案:資料庫緩存層、資料庫的負載均衡
- QPS達到800
假設我們使用百兆帶寬,意味着網站出口的實際帶寬是8M左右
假設每個頁面隻有10k,在這個并發條件下,百兆帶寬已經吃完
方案:CDN加速、負載均衡
- QPS達到1000
假設使用Memcache緩存資料庫查詢資料,每個頁面對Memcache的請求遠大于直接對DB的請求
Memcache的悲觀并發數在2W左右,但有可能在之前内網帶寬已經吃光,表現出不穩定
方案:靜态HTML緩存
- QPS達到2000
這個級别下,檔案系統通路鎖都成為災難
方案:做業務分離,分布式存儲
優化方案:
前端優化:(壓縮工具,uglifyjs,webpack)
檔案合并,減少HTTP請求
(圖檔地圖,CSS 精靈,多個腳本合并,多個樣式表合并,圖檔使用base64編碼)
啟用浏覽器緩存和檔案壓縮
本地緩存:
pragma | 當該字段值為“no-cache”的時候,會知會用戶端不要對該資源讀緩存,即每次都得向伺服器發一次請求才行 |
expire | 啟用緩存和定義緩存時間,響應封包中Expires所定義的緩存時間是相對伺服器上的時間而言的。如果用戶端上的時間跟伺服器上的時間不一緻(特别是使用者修改了自己電腦的系統時間),那緩存時間可能就沒啥意義了 |
cache-control.nostore | 所有内容部儲存到緩存或Internet臨時檔案中 |
cache-control.nocache | 不使用緩存,向伺服器發起請求 |
cache-control.max-age | 告知用戶端該資源在delta-seconds秒内是新鮮的,無需向伺服器發送請求 |
協商緩存:
Last-modified | 資源最後一次修改時間 |
if-Match | 比較Etag 資源比對資訊 |
if-None-Match | 比較Etag 資源比對資訊 |
If-Modified-Since | 比較資源最後更新時間是否一緻 |
if-Unmodified-Since | 比較資源最後更新時間是否一緻 |
nginx相關配置:
etag:on|off
gzip壓縮:
gzip: on|off
gzip_comp_level[1-9] 壓縮級别越高壓縮越小,越浪費CPU
CDN加速
異步請求(實時資料要求比較高)
建立獨立的圖檔伺服器
後端優化:
防盜鍊
1)referer 2)簽名
頁面靜态化
并發處理
隊列處理
資料庫緩存
分庫分表(分區)
讀寫分離
負載均衡