《從零開始學(xué)架構(gòu)》讀書筆記四:計算高性能

?高性能計算是每個程序員的追求坪稽,好的算法匿刮,合理的數(shù)據(jù)結(jié)構(gòu)這些都對性能起著至關(guān)重要的作用。但是站在架構(gòu)師的角度掂榔,則自然考慮的是高性能架構(gòu)設(shè)計
?高性能架構(gòu)無非集中在單機(jī)和集群上继效,對于單機(jī)來說,我們的目標(biāo)就是將單機(jī)服務(wù)器的性能發(fā)揮到極致装获。至于集群則是我們的單機(jī)無法支撐我們的業(yè)務(wù)所采用的架構(gòu)方案瑞信,自然這也會給我們帶來相應(yīng)的復(fù)雜度。
?單機(jī)服務(wù)器高性能的關(guān)鍵之一就是我們服務(wù)器所采取的網(wǎng)絡(luò)編程模型穴豫,網(wǎng)絡(luò)編程模型有如下兩個設(shè)計點(diǎn)凡简,即如何管理連接和如何處理響應(yīng)逼友。這兩個設(shè)計點(diǎn)最終都和操作系統(tǒng)的I/O模型和進(jìn)程模型相關(guān):
?1.I/O模型:阻塞,非阻塞秤涩,同步帜乞,異步
?2.進(jìn)程模型:單進(jìn)程,多進(jìn)程筐眷,多線程
首先來看一看PPC(process per connection)其含義就是每次有新的連接就創(chuàng)建一個進(jìn)程去專門處理這個連接的請求黎烈,這是傳統(tǒng)的unix網(wǎng)絡(luò)服務(wù)器所采用的模型≡纫ィ基本的流程如下:


PPC模型.jpg

注:圖中有一個小細(xì)節(jié)照棋,父進(jìn)程fork子進(jìn)程后,直接調(diào)用了close武翎,看起來好像關(guān)閉了連接烈炭,其實只是將引用計數(shù)器減一,等子進(jìn)程也調(diào)用close后后频,連接對應(yīng)的文件描述符引用變?yōu)?后梳庆,系統(tǒng)才會真正的關(guān)閉連接暖途。
1.父進(jìn)程接受連接(accept操作)
2.父進(jìn)程fork子進(jìn)程
3.子進(jìn)程處理連接的請求
4.子進(jìn)程關(guān)閉連接
這個模型顯然處理不了高并發(fā)場景卑惜,一來fork進(jìn)程的代價十分巨大,二來當(dāng)請求的連接時常比較大時驻售,會堆積大量的進(jìn)程露久。導(dǎo)致操作系統(tǒng)進(jìn)程調(diào)度和切換的頻率越來越高,所以這個方案也就解決200左右的并發(fā)欺栗。在PPC模型中毫痕,當(dāng)連接進(jìn)來時才fork新進(jìn)程,為了提高處理效率于是就有了prefork模型,見名知意迟几,就是提前創(chuàng)建進(jìn)程消请,系統(tǒng)在啟動的時候就預(yù)先創(chuàng)建好進(jìn)程,然后才開始接受用戶請求类腮。如下入所示:


prefork模型.jpg

雖然Prefork解決了fork進(jìn)程慢的問題臊泰,但是在高并發(fā)場景下還是不合適。因為進(jìn)程間通信的成本也很高蚜枢,但是自然也有好的一面就是進(jìn)程是獨(dú)自享有自己的內(nèi)存空間的缸逃,不用過多關(guān)注數(shù)據(jù)安全問題。
既然進(jìn)程這么笨重厂抽,就有了TPC模型的誕生(Thread per connection)相比進(jìn)程線程更加輕量級需频,實際上TPC解決或弱化了PPC的問題(fork代價高和進(jìn)程間通信的復(fù)雜度問題)
?TPC的基本流程圖如下:
TPC模型.jpg

注:圖中有一個小細(xì)節(jié),和PPC相比筷凤,主進(jìn)程不需要close連接了昭殉,原因是子線程是共享主進(jìn)程的內(nèi)存空間的,連接的文件描述符并沒有被復(fù)制,因此只需要close一次即可挪丢。
TPC解決了fork進(jìn)程代價過高和通信復(fù)雜的問題莽鸭,同時也帶來了新的問題,那就是線程間會出現(xiàn)的互斥和共享吃靠,一不小心就導(dǎo)致了死鎖問題
硫眨,prethread和prefork的思想是想通的這里就不多提及了。

?無論是PPC還是TPC巢块,連接結(jié)束后就銷毀了礁阁,這樣做其實是一個巨大的浪費(fèi),為了解決資源復(fù)用的問題就引入了進(jìn)程池和線程池的概念族奢,這里我們以進(jìn)TPC的進(jìn)程池為例姥闭,當(dāng)引入這種資源池的處理方式后,會引出一個新的問題:進(jìn)程如何才能高效的處理多個業(yè)務(wù)越走,當(dāng)一個進(jìn)程處理一個連接時棚品,進(jìn)程采用的是read-業(yè)務(wù)處理-write的處理流程,因為read是阻塞操作廊敌,當(dāng)前連接如果沒有數(shù)據(jù)可讀那么就阻塞到read操作上铜跑,這在PPC模型中不會有問題的,但是一個進(jìn)程處理多個連接那么就有問題了骡澈。如果這個進(jìn)程阻塞在某個連接的read操作上锅纺,此時其他連接有數(shù)據(jù)可讀,進(jìn)程也無法進(jìn)行處理肋殴,很顯然這樣和高性能是相悖的囤锉。解決這個問題最簡單的方式就是將read操作改為非阻塞操作,然后進(jìn)程不斷輪詢多個連接护锤。這種方式雖然能解決阻塞的問題官地,但并不是一個優(yōu)雅的解決方案,如果連接數(shù)過多那是十分消耗時間的烙懦。為了能夠更好的解決上述問題驱入,一種自然而然的想法就是當(dāng)連接上有數(shù)據(jù)的時候進(jìn)程才去處理,這就是I/O多路復(fù)用的技術(shù)來源修陡。這里有必要解釋一下沧侥,我們有時候會想當(dāng)然的認(rèn)為多路復(fù)用就是多條連接復(fù)用同一通道。這是一個嚴(yán)重的誤區(qū)魄鸦,其正確的語意就是多條連接復(fù)用同一個阻塞對象宴杀,這個阻塞對象和具體的實現(xiàn)有關(guān),如果使用select,則這個公共的阻塞對象就是select用到的fd_set,如果使用epoll,就是epoll_create創(chuàng)建的文件描述符拾因。多路復(fù)用技術(shù)歸納起來有如下兩個關(guān)鍵點(diǎn):
1.當(dāng)多條連接公用一個阻塞對象后旺罢,進(jìn)程只需要在一個阻塞對象上等待旷余,而無需輪詢所有連接
2.當(dāng)某條連接有新的數(shù)據(jù)可以處理時 ,操作系統(tǒng)會通知進(jìn)程扁达,將阻塞的狀態(tài)返回正卧,開始進(jìn)行業(yè)務(wù)處理。
?多路復(fù)用技術(shù)結(jié)合線程池或進(jìn)程池跪解,完美的解決了PPC和TPC模型的問題炉旷,這也就是大名鼎鼎的reactor模式,也就是非阻塞同步網(wǎng)絡(luò)模型。其本質(zhì)就是I/O多路復(fù)用統(tǒng)一監(jiān)聽事件叉讥,收到事件后分配給某個進(jìn)程處理窘行。reactor可以有多個。這就有了許多排列組合方案了图仓。為我們提供了很多的靈活性罐盔。下面來看一看經(jīng)典的reactor實現(xiàn)方案:
1.單reactor單進(jìn)程/單線程


單reactor單進(jìn)程.jpg

方案流是,reactor對象通過select監(jiān)控連接事件救崔,收到事件后通過dispatch進(jìn)行分發(fā)惶看。如果是連接建立的事件,則由Acceptor處理六孵,Acceptor通過accept接受連接建立一個handler來處理后續(xù)的各種事件纬黎。如果不是連接建立事件,則reactor會調(diào)用連接對應(yīng)的Handler進(jìn)行響應(yīng)狸臣。Handler會完成read->業(yè)務(wù)處理->send的完整業(yè)務(wù)流程莹桅。單reactor單進(jìn)程的優(yōu)點(diǎn)就是簡單昌执,沒有進(jìn)程間通信烛亦,沒有競爭,全部都在同一個進(jìn)程內(nèi)完成懂拾。但缺點(diǎn)也同樣明顯就是無法利用多核CPU的優(yōu)勢煤禽。還有handler在處理某個連接的業(yè)務(wù)時,整個進(jìn)程都無法處理其他的岖赋。連接事件檬果,很容易導(dǎo)致性能瓶頸,因此這種模式只適用于業(yè)務(wù)處理非程贫希快的場景选脊,目前redis的通信模型就采用了此模型。
2.單reactor多進(jìn)程/多線程
單reactor多線程.jpg

這種模式可以利用多核CPU的優(yōu)勢脸甘,但是線程通信直接的數(shù)據(jù)共享和互斥問題是需要去解決的恳啥,通信模型比較復(fù)雜,reactor承擔(dān)所有的事件和響應(yīng)丹诀,只在主線程中運(yùn)行钝的,瞬間高并發(fā)時會成為性能瓶頸翁垂。
3.多reactor多進(jìn)程/多線程
多reactor多進(jìn)程.jpg

目前開源軟件中的nginx,netty硝桩,memcache都是采用的此模型沿猜。
?單臺服務(wù)器始終會有它的瓶頸所在,當(dāng)單機(jī)無法滿足我們的 業(yè)務(wù)時就需要采用集群策略了碗脊,也就是增加更多的服務(wù)器 來提升系統(tǒng)的處理能力啼肩。那么負(fù)載均衡就是其中必不可少的部分了。常見的負(fù)載均衡有三種DNS,硬件和軟件負(fù)載均衡衙伶。DNS負(fù)載均衡的緩存更新時間比較長疟游,修改DNS配置后不能立即生效,很多用戶還會繼續(xù)訪問修改前的IP痕支,導(dǎo)致訪問失敗颁虐。硬件負(fù)載均衡的特點(diǎn)就是功能強(qiáng)大,拿F5來說卧须,可以達(dá)到百萬/每秒的處理能力另绩,而且支持安全防護(hù)比如防火墻和ddos攻擊,缺點(diǎn)就是太貴非土豪公司 請勿嘗試。軟件負(fù)載均衡方面有基于網(wǎng)絡(luò)層的LVS負(fù)載均衡花嘶,可以達(dá)到10萬/秒的處理能力笋籽。因為基于網(wǎng)絡(luò)層所以適用面積比較廣,幾乎所有的應(yīng)用都可以用它來做椭员。另一個比較著名的就是nginx车海,可以支撐5萬/秒的處理能力。它是基于應(yīng)用層的負(fù)載均衡隘击,通常和協(xié)議掛鉤侍芝,支持HTTP,E-MAIL協(xié)議等。這些負(fù)載均衡可以自由搭配使用來滿足自己的業(yè)務(wù)埋同。
?常見的負(fù)載均衡算法
1.任務(wù)平分類(輪詢州叠,加權(quán)輪詢)
2.負(fù)載最低優(yōu)先
3.性能最優(yōu)類
4.Hash類(源地址Hash,ID Hash)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凶赁,隨后出現(xiàn)的幾起案子咧栗,更是在濱河造成了極大的恐慌,老刑警劉巖虱肄,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件致板,死亡現(xiàn)場離奇詭異,居然都是意外死亡咏窿,警方通過查閱死者的電腦和手機(jī)斟或,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翰灾,“玉大人缕粹,你說我怎么就攤上這事稚茅。” “怎么了平斩?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵亚享,是天一觀的道長。 經(jīng)常有香客問我绘面,道長欺税,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任揭璃,我火速辦了婚禮晚凿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瘦馍。我一直安慰自己歼秽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布情组。 她就那樣靜靜地躺著燥筷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪院崇。 梳的紋絲不亂的頭發(fā)上肆氓,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音底瓣,去河邊找鬼谢揪。 笑死,一個胖子當(dāng)著我的面吹牛捐凭,可吹牛的內(nèi)容都是我干的拨扶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼柑营,長吁一口氣:“原來是場噩夢啊……” “哼屈雄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起官套,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚁孔,沒想到半個月后奶赔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杠氢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年站刑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鼻百。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绞旅,死狀恐怖摆尝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情因悲,我是刑警寧澤堕汞,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站晃琳,受9級特大地震影響讯检,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卫旱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一人灼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧顾翼,春花似錦投放、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至取逾,卻和暖如春耗绿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砾隅。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工误阻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晴埂。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓究反,卻偏偏與公主長得像,于是被迫代替她去往敵國和親儒洛。 傳聞我的和親對象是個殘疾皇子精耐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容