高併發(outline&factors)

高併發(outline&factors)

本篇和你們聊聊我理解的併發中咱們須要學習的東西,咱們以前的博文已經寫了html

  • 併發編程(異步的方式提升程序的總體性能)
  • 分佈式消息中間件(部分)

後續個人想法是聊:java

  • 分佈式存儲(優化IO部分)
  • 分佈式架構(服務治理等->架構層面的優化)
  • 性能優化(Jvm、Tomcat、MySQL、算法)

有時候發現學習一些技術,並不知道他有什用處,因此本篇,我想對併發這裏這的一些點作一個梳理,看看何時可使用什麼技術。這裏使用一個1000w用戶的併發問題來闡述使在併發中用什麼技術可以達到問題落地。linux

1000w用戶問題的分解

當咱們收到這樣一個需求的時候,咱們關心的確定是TPS(客戶端發送一個請求,服務端返回一個請求)、QPS(每秒查詢數量-1個TPS中可能有多個QPS)、併發數、RT(平均響應時長)、DAU(日活)等,咱們須要根據這些指標對整個架構進行設計。算法

經過數據進行判斷】,在以前的系統運行期間,確定有監控,能夠知道那個頁面的QPS等這些參數是多少數據庫

經過經驗判斷】:二八定律(這裏想清楚一個概念,1000w的用戶不必定是1000w的併發數,由於這些用戶不可能實時的訪問)按照這個定律來說,apache

  • 一天訪問的用戶量可能就佔用了20%(200w),假設每一個用戶點擊50次,那咱們的pv就是1個億
  • 再次按照這個法則,天天大部分活躍用戶的集中在一天中的20%的時間去訪問(這個就是峯值,淘寶的一天訪問量就下午的兩點,和晚上的九點)。
  • 那一天是24小時的20%那就是5個小時。那就意味着有(1億pv的80%)8000w的pv在一天內的5個小時中集中訪問。
  • 那就意味着每秒大概有4500個的請求(這個意味着是這5個小時的平均值,不包括峯值),
  • 按照經驗咱們把這個數字4500*4=18000個請求1s(峯值),最終就算出來了,咱們服務器要承載的是18000/s(qps)
  • 併發量=QPS*RT  好比說一個請求,平均處理速度是3s 那就是18000*3=54000(併發數) 那1000w的用戶,咱們的服務器要支撐54000/S的併發數

知道了併發數量,那咱們就開始設計架構,首先咱們要知道影響咱們併發的因素有哪些,以及如何優化:編程

Tomcat:緩存

(請求到首先到Tomcat,在NIO的模式下,默認的數量是1w,若是請求超過1w,那Tomcat就拒收請求,tomcat內部把請求變成一個個request轉發到咱們的controller中,因此首先優化鏈接數量  tomcat

系統層:性能優化

  • 優化鏈接數量一個請求就是一個鏈接數量。一個請求過來就會生成一個FD文件在linux中,默認狀況下一個進程可以打開的文件是1024個,全部用戶的進程打開文件上限改成65536      
  • 修改系統層面的鏈接數:一個tcp鏈接有兩個緩衝區一個是4096(緩衝區和&接受緩存區)會佔用8kb的內存(那對於一個8G的內存,最多咱們支持的是100w(服務器可以支撐的併發數量)   

應用層:

  • NIO: 他採用了多路複用機制,當一個請求過來他不阻塞,這樣就能夠處理N個鏈接
  • 線程池:max-therad(設置工做線程數量 默認是200)  max-connection(最大鏈接數量  在NIO模式下默認是1000)

查看tomcat官網http://tomcat.apache.org/tomcat-8.0-doc/config/http.html

JVM:Tomcat是用java寫的,那咱們確定要看對JVM進行優化,jvm其實就是一個虛擬機,咱們的VMware同樣,他也有本身的內存等。咱們針對兩點進行調優:

  • GC算法和內存空間:空間不足的狀況下就會致使頻繁GC,隨之就會暫停全部線程,那就會形成系統卡頓,那就會形成請求堆積。後面關於JVM調優這裏我會專門寫一篇博文。

服務器數量評估】:

  服務器能夠支撐的併發能夠經過壓測得出,好比一臺服務器能夠支撐500個qps, 那咱們的18000就須要36臺服務器,天哪,太多了,實際上咱們這樣幹公司要換人了。咱們確定是針對頻繁訪問的服務進行機器的堆積。那服務器的架構就是這樣的,好比我這個服務是須要5臺Tomcat集羣,而後咱們給tomcat前面架Nginx集羣進行分發,防止Nginx掛,咱們給他前面放LVS對他進行主備。

應用層面(RT值)】:業務邏輯處理的本質就是io

  • 查詢數據庫(磁盤IO):數據庫層面的優化、分庫分表、索引、讀寫分離、so on
  • 訪問磁盤(磁盤iIO):磁盤的頁緩存(異步刷盤、同步刷盤)、順序讀寫、零拷貝、mmp(內存映射、減小拷貝次數)、異步化
  • 內存運算(內存IO):內存緩存
  • 遠程通信(rpc)(網絡io):池化技術(一次性建立多個鏈接)、長連接、同網段通訊(內網通訊)、減小網絡通訊的場景
  • 數據結構算法

架構層面分佈式架構(分攤壓力,提高性能,單點增長服務等優點使其成爲承載併發的一個利器)

相關文章
相關標籤/搜索