當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > CPP開(kāi)發(fā)者
[導(dǎo)讀]↓推薦關(guān)注↓我們現(xiàn)在已經(jīng)搞定了C10K并發(fā)連接問(wèn)題,升級(jí)一下,如何支持千萬(wàn)級(jí)的并發(fā)連接?你可能說(shuō),這不可能。你說(shuō)錯(cuò)了,現(xiàn)在的系統(tǒng)可以支持千萬(wàn)級(jí)的并發(fā)連接,只不過(guò)所使用的那些激進(jìn)的技術(shù),并不為人所熟悉。要了解這是如何做到的,我們得求助于ErrataSecurity的CEORober...




我們現(xiàn)在已經(jīng)搞定了 C10K并發(fā)連接問(wèn)題 ,升級(jí)一下,如何支持千萬(wàn)級(jí)的并發(fā)連接?你可能說(shuō),這不可能。你說(shuō)錯(cuò)了,現(xiàn)在的系統(tǒng)可以支持千萬(wàn)級(jí)的并發(fā)連接,只不過(guò)所使用的那些激進(jìn)的技術(shù),并不為人所熟悉。


要了解這是如何做到的,我們得求助于Errata Security的CEO Robert Graham,看一下他在 Shmoocon 2013 的絕對(duì)奇思妙想的演講,題目是 C10M Defending The Internet At Scale。


Robert以一種我以前從來(lái)沒(méi)有聽(tīng)說(shuō)過(guò)的才華橫溢的方式來(lái)搭建處理這個(gè)問(wèn)題的架構(gòu)。他的開(kāi)場(chǎng)是一些歷史,關(guān)于Unix最初為什么不是設(shè)計(jì)成一個(gè)通用的服務(wù)器的OS,而是為電話網(wǎng)絡(luò)的控制系統(tǒng)設(shè)計(jì)的。真正傳輸數(shù)據(jù)的是電話網(wǎng)絡(luò),因而控制層和數(shù)據(jù)層有非常清晰的區(qū)分。


問(wèn)題是,我們現(xiàn)在用的Unix服務(wù)器還是數(shù)據(jù)層的一部分,雖然并不應(yīng)當(dāng)是這樣的。如果一臺(tái)服務(wù)器只有一個(gè)應(yīng)用程序,為這樣的系統(tǒng)設(shè)計(jì)內(nèi)核,與設(shè)計(jì)一個(gè)多用戶系統(tǒng)的內(nèi)核的區(qū)別是非常大的。


關(guān)鍵問(wèn)題:


  • 不要讓內(nèi)核去做所有繁重的處理。把數(shù)據(jù)包處理,內(nèi)存管理以及處理器調(diào)度從內(nèi)核移到可以讓他更高效執(zhí)行的應(yīng)用程序中去。讓Linux去處理控制層,數(shù)據(jù)層由應(yīng)用程序來(lái)處理。



結(jié)果就是成為一個(gè)用200個(gè)時(shí)鐘周期處理數(shù)據(jù)包,14萬(wàn)個(gè)時(shí)鐘周期來(lái)處理應(yīng)用程序邏輯,可以處理1000萬(wàn)并發(fā)連接的系統(tǒng)。而作為重要的內(nèi)存訪問(wèn)花費(fèi)300個(gè)時(shí)鐘周期,這是盡可能減少編碼和緩存的設(shè)計(jì)方法的關(guān)鍵。


用一個(gè)面向數(shù)據(jù)層的系統(tǒng)你可以每秒處理1000萬(wàn)個(gè)數(shù)據(jù)包。用一個(gè)面向控制層的系統(tǒng)每秒你只能獲得1百萬(wàn)個(gè)數(shù)據(jù)包。


這貌似有點(diǎn)極端,你不能局限于操作系的性能,你必須自己去實(shí)現(xiàn)。


現(xiàn)在,讓我們學(xué)習(xí)Robert是怎樣創(chuàng)作一個(gè)能處理1000萬(wàn)并發(fā)連接的系統(tǒng)……


C10K的問(wèn)題——過(guò)去十年

十年前,工程師在處理C10K可擴(kuò)展性問(wèn)題時(shí),都盡可能的避免服務(wù)器處理超過(guò)10,000個(gè)的并發(fā)連接。通過(guò)修正操作系統(tǒng)內(nèi)核以及用事件驅(qū)動(dòng)型服務(wù)器(如Nginx和Node)替代線程式的服務(wù)器(如Apache)這個(gè)問(wèn)題已經(jīng)解決。從Apache轉(zhuǎn)移到可擴(kuò)展的服務(wù)器上,人們用了十年的時(shí)間。在過(guò)去的幾年中,(我們看到)可擴(kuò)展服務(wù)器的采用率在大幅增長(zhǎng)。


Apache的問(wèn)題


Apache的問(wèn)題是,(并發(fā))連接數(shù)越多它的性能會(huì)越低下。



關(guān)鍵問(wèn)題(服務(wù)器的)性能和可擴(kuò)展性并不是一碼事。它們指的不是同一件事情。當(dāng)人們談?wù)撘?guī)模的時(shí)候往往也會(huì)談起性能的事情,但是規(guī)模和性能是不可同日而語(yǔ)的。比如Apache。



在僅持續(xù)幾秒的短時(shí)連接時(shí),比如快速事務(wù)處理,如果每秒要處理1,000個(gè)事務(wù),那么大約有1,000個(gè)并發(fā)連接到服務(wù)器。如果事務(wù)增加到10秒,要保持每秒處理1,000個(gè)事務(wù)就必須要開(kāi)啟10K(10,000個(gè))的并發(fā)連接。這時(shí)Apache的性能就會(huì)陡降,即使拋開(kāi)DDos攻擊。僅僅是大量的下載就會(huì)使Apache宕掉。



如果每秒需要處理的并發(fā)請(qǐng)求從5,000增加到10,000,你會(huì)怎么做?假使你把升級(jí)硬件把處理器速度提升為原來(lái)的兩倍。會(huì)是什么情況?你得到了兩倍的性能,但是卻沒(méi)有得到兩倍的處理規(guī)模。處理事務(wù)的規(guī)模或許僅僅提高到了每秒6,000個(gè)(即每秒6,000個(gè)并發(fā)請(qǐng)求)。




繼續(xù)提高處理器速度,還是無(wú)濟(jì)于事。甚至當(dāng)性能提升到16倍時(shí),并發(fā)連接數(shù)還不能達(dá)到10,000個(gè)。由此,性能和規(guī)模并不是一回事。



問(wèn)題在于Apache總是創(chuàng)建了一個(gè)進(jìn)程然后又把它關(guān)閉了,這并不是可擴(kuò)展的。為什么?因?yàn)閮?nèi)核采用的O(n^2) 算法導(dǎo)致服務(wù)器不能處理10,000個(gè)并發(fā)連接。



  • 內(nèi)核中的兩個(gè)基本問(wèn)題:


    • 連接數(shù) = 線程數(shù)/進(jìn)程數(shù)。當(dāng)一個(gè)包(數(shù)據(jù)包)來(lái)臨時(shí),它(內(nèi)核)會(huì)遍歷所有的10,000個(gè)進(jìn)程以決定由哪個(gè)進(jìn)程處理這個(gè)包。


    • 連接數(shù)= 選擇數(shù)/輪詢次數(shù)(單線程情況下)。同樣的擴(kuò)展性問(wèn)題。每個(gè)包不得不遍歷一遍列表中的socket。


  • 解決方法:修正內(nèi)核在規(guī)定的時(shí)間內(nèi)進(jìn)行查找


    • 不管有多少線程,線程切換的時(shí)間都是恒定的。


    • 使用一個(gè)新的可擴(kuò)展的epoll()/IOCompletionPort在規(guī)定的時(shí)間內(nèi)做socket查詢。





由于線程調(diào)度依然沒(méi)有被擴(kuò)展,因此服務(wù)器對(duì)socket大規(guī)模的采用epoll,導(dǎo)致需要使用異步編程模式,然而這正是Node和Nginx所采用的方式。這種軟件遷移會(huì)得到(和原來(lái))不一樣的表現(xiàn)(指從apache遷移到ngix等)。





即使在一臺(tái)很慢(配置較低)的服務(wù)器上增加連接數(shù)性能也不會(huì)陡降。介于此,在開(kāi)啟10K并發(fā)連接時(shí),一臺(tái)筆記本電腦(運(yùn)行ngix)的速度甚至超越了一臺(tái)16核的服務(wù)器(運(yùn)行Apache)。




異步編程模型可以參考:深入理解重要的編程模型



C10M問(wèn)題 —— 下一個(gè)十年


在不久的將來(lái),服務(wù)器將需要處理數(shù)百萬(wàn)的并發(fā)連接。由于IPV6普及,連接到每一個(gè)服務(wù)器的潛在可能連接數(shù)目將達(dá)到數(shù)百萬(wàn),所以我們需要進(jìn)入下一個(gè)可擴(kuò)張性階段。


示例應(yīng)用程序?qū)?huì)用到這類(lèi)可擴(kuò)張性方案:IDS/IPS,因?yàn)樗麄兪沁B接到一臺(tái)服務(wù)器的主干。另一個(gè)例子:DNS根服務(wù)器、TOR節(jié)點(diǎn)、Nmap互聯(lián)網(wǎng)絡(luò)、視頻流、銀行業(yè)務(wù)、NAT載體、網(wǎng)絡(luò)語(yǔ)音電話業(yè)務(wù)PBX、負(fù)載均衡器、web緩存、防火墻、郵件接收、垃圾郵件過(guò)濾。


通常人們認(rèn)為互聯(lián)網(wǎng)規(guī)模問(wèn)題是個(gè)人計(jì)算機(jī)而不是服務(wù)器,因?yàn)樗麄冧N(xiāo)售的是硬件 軟件。你買(mǎi)的設(shè)備連接到你的數(shù)據(jù)中心。這些設(shè)備可能包含英特爾主板或網(wǎng)絡(luò)處理器和用于加密的芯片、數(shù)據(jù)包檢測(cè),等等。


2013年2月40gpbs、32核、256gigs RAM X86在新蛋的售價(jià)為$5000。這種配置的服務(wù)器能夠處理10K以上的連接。如果不能,這不是底層的硬件問(wèn)題,那是因?yàn)槟氵x錯(cuò)了軟件。這樣的硬件能夠輕而易舉的支持千萬(wàn)的并發(fā)連接。


10,000,000個(gè)并發(fā)連接挑戰(zhàn)意味著什么


1. 10,000,000個(gè)并發(fā)連接


2. 每秒1,000,000個(gè)連接——每個(gè)連接大約持續(xù)10秒


3. 10千兆比特/每秒——快速連接到互聯(lián)網(wǎng)。


4. 10,000,000包/每秒——預(yù)期當(dāng)前服務(wù)器處理50,000包/每秒,這將導(dǎo)致更高的級(jí)別。服務(wù)器能夠用來(lái)處理每秒100,000個(gè)中斷和每個(gè)包引發(fā)的中斷。


5. 10微秒延遲——可擴(kuò)張的服務(wù)器也許能夠處理這樣的增長(zhǎng),但是延遲將會(huì)很突出。


6. 10微秒上下跳動(dòng)——限制最大延遲


7. 10個(gè)一致的CPU內(nèi)核——軟件應(yīng)該擴(kuò)張到更多內(nèi)核。典型的軟件只是簡(jiǎn)單的擴(kuò)張到四個(gè)內(nèi)核。服務(wù)器能夠擴(kuò)張到更多的內(nèi)核,所以軟件需要被重寫(xiě)以支持在擁有更多內(nèi)核的機(jī)器上運(yùn)行。



我們學(xué)的是Unix而不是網(wǎng)絡(luò)編程(Network Programming)


  • 一代代的程序員通過(guò)W. Richard Stevens所著的《Unix網(wǎng)絡(luò)編程》(Unix Networking Programming)學(xué)習(xí)網(wǎng)絡(luò)編程技術(shù)。問(wèn)題是,這本書(shū)是關(guān)于Unix的,并不是網(wǎng)絡(luò)編程。它講述的是,你僅需要寫(xiě)一個(gè)很小的輕量級(jí)的服務(wù)器就可以讓Unix做一切繁復(fù)的工作。然而內(nèi)核并不是規(guī)模的(規(guī)模不足)。解決方案是,將這些繁復(fù)的工作轉(zhuǎn)移到內(nèi)核之外,自已處理。



  • 一個(gè)頗具影響的例子,就是在考慮到Apache的線程每個(gè)連接模型(is to consider Apache’s thread per connection model)。這就意味著線程調(diào)度器根據(jù)到來(lái)的數(shù)據(jù)(on which data arrives)決定調(diào)用哪一個(gè)(不同的)read()函數(shù)(方法)。把線程調(diào)度系統(tǒng)當(dāng)做(數(shù)據(jù))包調(diào)度系統(tǒng)來(lái)使用(我非常喜歡這一點(diǎn),之前從來(lái)沒(méi)聽(tīng)說(shuō)過(guò)類(lèi)似的觀點(diǎn))。



  • Nginx宣稱,它并不把線程調(diào)度當(dāng)作(數(shù)據(jù))包調(diào)度來(lái)用使用,它自已做(進(jìn)行)包調(diào)度。使用select來(lái)查找socket,我們知道數(shù)據(jù)來(lái)了,于是就可以立即讀取并處理它,數(shù)據(jù)也不會(huì)堵塞。



  • 經(jīng)驗(yàn):讓Unix/Linux處理網(wǎng)絡(luò)堆棧,之后的事情就由你自已來(lái)處理。



你怎么編寫(xiě)軟件使其可伸縮?

你怎么改變你的軟件使其可伸縮?有大量的經(jīng)驗(yàn)規(guī)則都是假設(shè)硬件能處理多少。我們需要真實(shí)的執(zhí)行性能。


要進(jìn)入下一個(gè)等級(jí),我們需要解決的問(wèn)題是:


  1. 包的可擴(kuò)展性


  2. 多核的可擴(kuò)展性


  3. 內(nèi)存的可擴(kuò)展性



精簡(jiǎn)包-編寫(xiě)自己的定制驅(qū)動(dòng)來(lái)繞過(guò)內(nèi)核堆棧


  • 數(shù)據(jù)包的存在的問(wèn)題是它們要通過(guò)Unix的內(nèi)核。網(wǎng)絡(luò)堆棧復(fù)雜又慢。你的應(yīng)用程序需要的數(shù)據(jù)包的路徑要更加直接。不要讓操作系統(tǒng)來(lái)處理數(shù)據(jù)包。



  • 做到這一點(diǎn)的方法是編寫(xiě)自己的驅(qū)動(dòng)程序。所有驅(qū)動(dòng)程序要做到是發(fā)送數(shù)據(jù)包到你的應(yīng)用程序而不是通過(guò)內(nèi)核協(xié)議棧。你可以找得到驅(qū)動(dòng)有:PF_RING,Netmap,Interl DPDK(數(shù)據(jù)層開(kāi)發(fā)套件)。



  • 有多快呢?Inter有一個(gè)基準(zhǔn)是在一個(gè)輕量級(jí)的服務(wù)器上每秒可以處理8000萬(wàn)的數(shù)據(jù)包(每個(gè)數(shù)據(jù)包200個(gè)時(shí)鐘周期)。這也是通過(guò)用戶模式。數(shù)據(jù)包通過(guò)用戶模式后再向下傳遞。當(dāng)Linux獲得UDP數(shù)據(jù)包后通過(guò)用戶模式在向下傳遞時(shí),它每秒處理的數(shù)據(jù)包不會(huì)超過(guò)100萬(wàn)個(gè)。客戶驅(qū)動(dòng)對(duì)Linux來(lái)說(shuō)性能比是80:1。



  • 如果用200個(gè)時(shí)間周期來(lái)每秒獲得1000萬(wàn)個(gè)數(shù)據(jù)包,那么可以剩下1400個(gè)時(shí)鐘周期來(lái)實(shí)現(xiàn)一個(gè)類(lèi)似DNS/IDS的功能。



  • 用PF_RING/DPDK來(lái)獲得原始的數(shù)據(jù)包的話,你必須自己去做TCP協(xié)議棧。人們正在做用戶模式的堆棧。對(duì)于Inter來(lái)講已有一個(gè)提供真正可擴(kuò)展性能的可用的TCP堆棧。



多核的可擴(kuò)展性

多核的可擴(kuò)展性和多線程可擴(kuò)展性是不一樣的。我們熟知的idea處理器不在漸漸變快,但是我們卻擁有越來(lái)越多的idea處理器。


大多數(shù)代碼并不能擴(kuò)展到4核。當(dāng)我們添加更多的核心時(shí)并不是性能不變,而是我們添加更多的核心時(shí)越來(lái)越慢。因?yàn)槲覀兙帉?xiě)的代碼不好。我們期望軟件和核心成線性的關(guān)系。我們想要的是添加更多的核心就更快。



多線程編程不是多核編程


多線程:


  • 每個(gè)CPU有多個(gè)線程
  • 鎖來(lái)協(xié)調(diào)線程(通過(guò)系統(tǒng)調(diào)用)
  • 每個(gè)線程有不同的任務(wù)
多核:


  • 每個(gè)CPU核心一個(gè)線程
  • 當(dāng)兩個(gè)核心中的兩個(gè)不同線程訪問(wèn)同一數(shù)據(jù)時(shí),它們不用停止來(lái)相互等待
  • 所有線程是同一任務(wù)的一部分
我們的問(wèn)題是如何讓一個(gè)程序能擴(kuò)展到多個(gè)核心。Unix中的鎖是在內(nèi)核中實(shí)現(xiàn)的,在4核心上使用鎖會(huì)發(fā)生什么? 大多數(shù)軟件會(huì)等待其他線程釋放一個(gè)鎖,這樣的以來(lái)你有更多的CPU核心內(nèi)核就會(huì)耗掉更多的性能。


我們需要的是一個(gè)像高速公路的架構(gòu)而不是一個(gè)像靠紅綠燈控制的十字路口的架構(gòu)。我們想用盡可能少的小的開(kāi)銷(xiāo)來(lái)讓每個(gè)人在自己的節(jié)奏上而沒(méi)有等待。



解決方案:



  • 保持每一個(gè)核心的數(shù)據(jù)結(jié)構(gòu),然后聚集起來(lái)讀取所有的組件。


  • 原子性. CPU支持的指令集可以被C調(diào)用。保證原子性且沒(méi)有沖突是非常昂貴的,所以不要期望所有的事情都使用指令。


  • 無(wú)鎖的數(shù)據(jù)結(jié)構(gòu)。線程間訪問(wèn)不用相互等待。不要自己來(lái)做,在不同架構(gòu)上來(lái)實(shí)現(xiàn)這個(gè)是一個(gè)非常復(fù)雜的工作。


  • 線程模型。線性線程模型與輔助線程模型。問(wèn)題不僅僅是同步。而是怎么架構(gòu)你的線程。


  • 處理器族。告訴操作系統(tǒng)使用前兩個(gè)核心。之后設(shè)置你的線程運(yùn)行在那個(gè)核心上。你也可以使用中斷來(lái)做同樣的事兒。所以你有多核心的CPU,但這不關(guān)Linux事。




內(nèi)存的可擴(kuò)展性


假設(shè)你有20G內(nèi)存(RAM),第個(gè)連接占用2K,假如你只有20M三級(jí)緩存(L3 cache),緩存中沒(méi)有數(shù)據(jù)。從緩存轉(zhuǎn)移到主存上消耗300個(gè)時(shí)鐘周期,此時(shí)CPU處于空閑狀態(tài)。想象一下,(處理)每個(gè)包要1400個(gè)時(shí)鐘周期。




切記還有200時(shí)鐘周期/每包的開(kāi)銷(xiāo)(應(yīng)該指等待包的開(kāi)銷(xiāo))。每個(gè)包有4次高速緩存的缺失,這是個(gè)問(wèn)題。



  • 提高緩存效率,不要使用指針在整個(gè)內(nèi)存中隨便亂放數(shù)據(jù)。每次你跟蹤一個(gè)指針都會(huì)造成一次高速緩存缺失:[hash pointer] -> [Task Control Block] -> [Socket] -> [App]。這造成了4次高速緩存缺失。將所有的數(shù)據(jù)保持在一個(gè)內(nèi)存塊中:[TCB | Socket | App]. 為每個(gè)內(nèi)存塊預(yù)分配內(nèi)存。這樣會(huì)將高速緩存缺失從4降低到1。



  • 分頁(yè),32G的數(shù)據(jù)需要占用64M的分頁(yè)表,不適合都放在高速緩存上。所以造成2個(gè)高速緩存缺失,一個(gè)是分頁(yè)表另一個(gè)是它指向的數(shù)據(jù)。這些細(xì)節(jié)在開(kāi)發(fā)可擴(kuò)展軟件時(shí)是不可忽略的。解決:壓縮數(shù)據(jù),使用有很多內(nèi)存訪問(wèn)的高速架構(gòu),而不是二叉搜索樹(shù)。NUMA加倍了主內(nèi)存的訪問(wèn)時(shí)間。內(nèi)存有可能不在本地,而在其它地方



  • 內(nèi)存池 , 在啟動(dòng)時(shí)立即分配所有的內(nèi)存。在對(duì)象(object)、線程(thread)和socket的基礎(chǔ)上分配(內(nèi)存)。



  • 超線程,提高CPU使用率,減少延遲,比如當(dāng)在內(nèi)存訪問(wèn)中一個(gè)線程等待另一個(gè)全速線程,這種情況,超線程CPU可以并行執(zhí)行,不用等待。



  • 大內(nèi)存頁(yè), 減小頁(yè)表的大小。從一開(kāi)始就預(yù)留內(nèi)存,并且讓?xiě)?yīng)用程序管理內(nèi)存。




選擇合適的語(yǔ)言



go語(yǔ)言這種天生為并發(fā)而生的語(yǔ)言,完美的發(fā)揮了服務(wù)器多核優(yōu)勢(shì),很多可以并發(fā)處理的任務(wù)都可以使用并發(fā)來(lái)解決,比如go處理http請(qǐng)求時(shí)每個(gè)請(qǐng)求都會(huì)在一個(gè)goroutine中執(zhí)行,C和C 語(yǔ)言當(dāng)然也可以實(shí)現(xiàn)高并發(fā)系統(tǒng),總之:怎樣合理的壓榨CPU,讓其發(fā)揮出應(yīng)有的價(jià)值,是優(yōu)化一直需要探索學(xué)習(xí)的方向。




推薦開(kāi)源項(xiàng)目學(xué)習(xí):




F-Stack 開(kāi)發(fā)框架F-Stack 是一款兼顧高性能、易用性和通用性的網(wǎng)絡(luò)開(kāi)發(fā)框架,傳統(tǒng)上 DPDK 大多用于 SDN、NFV、DNS 等簡(jiǎn)單的應(yīng)用場(chǎng)景下,對(duì)于復(fù)雜的 TCP 協(xié)議棧上的七層應(yīng)用很少,市面上已出現(xiàn)了部分用戶態(tài)協(xié)議棧,如 mTCP、Mirage、lwIP、NUSE 等,也有用戶態(tài)的編程框架,如 SeaStar 等,但統(tǒng)一的特點(diǎn)是應(yīng)用程序接入門(mén)檻較高,不易于使用。




F-Stack 使用純 C 實(shí)現(xiàn),充當(dāng)膠水粘合了 DPDK、FreeBSD 用戶態(tài)協(xié)議棧、Posix API、微線程框架和上層應(yīng)用(Nginx、Redis),使絕大部分的網(wǎng)絡(luò)應(yīng)用可以通過(guò)直接修改配置或替換系統(tǒng)的網(wǎng)絡(luò)接口即可接入 F-Stack,從而獲得更高的網(wǎng)絡(luò)性能。


F-Stack 架構(gòu)



F-Stack 總體架構(gòu)如上圖所示,具有以下特點(diǎn):


  • 使用多進(jìn)程無(wú)共享架構(gòu)。


  • 各進(jìn)程綁定獨(dú)立的網(wǎng)卡隊(duì)列和 CPU,請(qǐng)求通過(guò)設(shè)置網(wǎng)卡 RSS 散落到各進(jìn)程進(jìn)行處理。


  • 各進(jìn)程擁有獨(dú)立的協(xié)議棧、PCB 表等資源。


  • 每個(gè) NUMA 節(jié)點(diǎn)使用獨(dú)立的內(nèi)存池。


  • 進(jìn)程間通信通過(guò)無(wú)鎖環(huán)形隊(duì)列(rte_ring)進(jìn)行。


  • 使用 DPDK 作為網(wǎng)絡(luò) I/O 模塊,將數(shù)據(jù)包從網(wǎng)卡直接接收到用戶態(tài)。


  • 移植 FreeBSD Release 11.0.1 協(xié)議棧到用戶態(tài)并與 DPDK 對(duì)接。


http://www.f-stack.org



Nginx :


一個(gè)高性能的HTTP和反向代理web服務(wù)器,同時(shí)也提供了IMAP/POP3/SMTP服務(wù)。


http://nginx.org/



Redis :


一個(gè)開(kāi)源的使用ANSI C語(yǔ)言編寫(xiě)、遵守BSD協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型。


https://redis.io/



Fasthttp :

Fasthttp是一個(gè)高性能的web server框架。Golang官方的net/http性能相比f(wàn)asthttp遜色很多。根據(jù)測(cè)試,fasthttp的性能可以達(dá)到net/http的10倍。所以,在一些高并發(fā)的項(xiàng)目中,我們經(jīng)常用fasthttp來(lái)代替net/http。

https://github.com/savsgio/atreugo



Oat :


oat 是一個(gè)輕量級(jí)高性能 Web 服務(wù)開(kāi)發(fā)框架,采用純 C 編寫(xiě)而成。


https://gitee.com/mirrors/oatpp



Undertow,jetty,Tomcat等:


java語(yǔ)言的高并發(fā)框架。


https://undertow.io/


https://gitee.com/mirrors/jetty


https://tomcat.apache.org/



性能測(cè)試對(duì)比(排行榜):





https://www.techempower.com/benchmarks/



有興趣同學(xué)可以試一試你的極限優(yōu)化,讓你們的程序上榜!這個(gè)絕對(duì)是簡(jiǎn)歷和項(xiàng)目推薦里面的最有力的說(shuō)明。



參考



翻譯:DYOS, 裴寶亮, dexterman, zicode


https://www.oschina.net/translate/the-secret-to-10-million-concurrent-connections-the-kernel?lang=chs



- EOF -


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。

CPP開(kāi)發(fā)者

234 篇文章

關(guān)注

發(fā)布文章

編輯精選

技術(shù)子站

關(guān)閉