本文是本身的總結文章,曾在CSDN官網公衆號上發表。web
"高併發"對後臺開發同窗來講,既熟悉又陌生。熟悉是由於面試和工做常常會說起它。陌生的起因是服務器因高併發致使出現各位問題的狀況少之又少。同時,想收穫這方面的經驗也是"摸着石頭過河", 須要大量學習理論知識,再去探索。面試
若是是客戶端開發的同窗,字典中是沒有「高併發」這個名詞。這驗證一句老話,"隔行如隔山"。客戶端開發,特別是手機應用開發,更多地是考慮如何優化應用的性能,下降 App 的卡頓率等。編程
本文是一篇科普文,分享本身近來學到的知識。緩存
因爲分佈式系統的問世,高併發(High Concurrency)一般是指經過設計保證系統可以同時並行處理不少請求。通俗來說,高併發是指在同一個時間點,有不少用戶同時的訪問同一 API 接口或者 Url 地址。它常常會發生在有大活躍用戶量,用戶高彙集的業務場景中。服務器
其實,高併發也離咱們的生活並不遙遠,例如大學學校的選課系統。一到選課的時候,一大批學生同時選課,致使系統出現「不良反應」;再如淘寶的 618 和 雙 11 的購物活動;遇到節假日,12306 上演的「搶票大戰」。另外,DDos 攻擊也能算高併發的場景。微信
在這個「雲」的時代,提升分佈式系統併發能力的方式,方法論上主要有兩種:垂直擴展(Scale Up)與水平擴展(Scale Out)。網絡
加強單機硬件性能,例如:增長 CPU 核數如 32 核,升級更好的網卡如萬兆,升級更好的硬盤如 SSD,擴充硬盤容量如 2T,擴充系統內存如 128G;數據結構
提高單機架構性能,例如:使用 Cache 來減小 I/O 次數,使用異步來增長單服務吞吐量,使用無鎖數據結構來減小響應時間;架構
單臺服務器最大併發併發
單臺服務器最大併發問題,通常是指一臺服務器可以支持多少TCP併發鏈接.
一種理論說法是受到端口號範圍限制。操做系統上端口號 1024 如下是系統保留的,從 1024-65535 是用戶使用的。因爲每一個TCP鏈接都要佔一個端口號,因此咱們最多能夠有 60000 多個併發鏈接。
但實際上單機併發鏈接數確定要受硬件資源(內存、網卡)、網絡資源(帶寬)的限制。特別是網卡處理數據的能力,它是最大併發的瓶頸。
C10K併發鏈接問題
C10K併發鏈接問題是指單機 1 萬個併發鏈接問題。如何突破單機性能侷限,是高性能網絡編程所必需要直面的問題。這些侷限和問題最先被 Dan Kegel 進行了概括和總結,並首次成系統地分析和提出解決方案,後來這種廣泛的網絡現象和技術侷限都被你們稱爲 C10K 問題 。
C10K問題本質上是操做系統的問題。對於 Web1.0/2.0 時代的操做系統而言, 傳統的同步阻塞 I/O 模型都是同樣的,處理的方式都是 requests per second,併發 10K 和 100 的區別關鍵在於CPU。
建立的進程線程多了,數據拷貝頻繁(緩存I/O、內核將數據拷貝到用戶進程空間、阻塞), 進程/線程上下文切換消耗大, 致使操做系統崩潰,這就是C10K問題的本質!
C10M併發鏈接問題
回顧了過去的10年裏,咱們面臨高性能網絡編程領域著名的C10K問題,最終也成功提出解決方案。下一個10年,是時候考慮C10M併發問題了。 C10M 併發鏈接問題指的是單機服務器實現 C10M(即單機千萬併發鏈接)。
想弄清楚這個問題,首先要了解下 Django 在服務器中所處的位置。
上圖中講到 Django 應用服務器能夠分爲三層:
Web 框架層 Web框架層就是咱們開發出來的 Django Web 應用程序。它負責處理 HTTP 請求的動態數據。
WSGI 層 WSGI 不是用於與程序交互的API,也不是真實的代碼,WSGI 只是一種接口。它只適用於 Python 語言,其全稱爲 Web Server Gateway Interface。其定義了 web服務器和 web應用之間的接口規範。
Web 服務器層 Web 服務層做用是主要是接收 HTTP 請求並返回響應。常見的 web服務器有 Nginx,Apache,IIS等。
特別是 Nginx, 它的出現是爲了解決 C10K 問題。Nginx 依靠異步事件驅動架構來幫助其處理大量的併發會話,因爲其對資源的輕量利用和伸縮自如的特性,它成爲了廣受歡迎的 web 服務器。
Django 框架注重的數據交互。因此考慮的問題是 Django 適不適合於高併發的場景。 它是一個通過大型網站規模驗證的框架。Instagram 支撐上億日活,因此 Django 能適用於高併發場景。因此不是想着 Django 框架能支撐到多大的併發量,而是咱們想要抗住很大的併發量,怎麼優化現有框架。
本文原創發佈於微信公衆號「極客猴」,歡迎關注第一時間獲取更多原創分享