本篇和你們聊聊我理解的併發中咱們須要學習的東西,咱們以前的博文已經寫了html
- 併發編程(異步的方式提升程序的總體性能)
- 分佈式消息中間件(部分)
後續個人想法是聊:java
- 分佈式存儲(優化IO部分)
- 分佈式架構(服務治理等->架構層面的優化)
- 性能優化(Jvm、Tomcat、MySQL、算法)
有時候發現學習一些技術,並不知道他有什用處,因此本篇,我想對併發這裏這的一些點作一個梳理,看看何時可使用什麼技術。這裏使用一個1000w用戶的併發問題來闡述使在併發中用什麼技術可以達到問題落地。linux
當咱們收到這樣一個需求的時候,咱們關心的確定是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):池化技術(一次性建立多個鏈接)、長連接、同網段通訊(內網通訊)、減小網絡通訊的場景
- 數據結構算法
架構層面:分佈式架構(分攤壓力,提高性能,單點增長服務等優點使其成爲承載併發的一個利器)