国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

圖解 | 深入理解Linux高性能網(wǎng)絡(luò)架構(gòu)的那些事

系統(tǒng) Linux
大白決定和小黑好好聊聊,Linux開發(fā)中常用的高性能網(wǎng)絡(luò)框架中的一些事兒,火鍋的映襯下讓夜色和天氣都不那么寒冷了。

[[355719]]

 本文轉(zhuǎn)載自微信公眾號「后端技術(shù)指南針」,作者指南針氪金入口。轉(zhuǎn)載本文請聯(lián)系后端技術(shù)指南針公眾號。  

1. 落寞的小黑

上周北京很冷,周五晚上大白下班奔地鐵站,收到了好基友小黑的微信:

于是大白掉頭掃了個單車奔五道口了,小黑靠譜地選了個不錯的位置。

 

小黑: 你今天下班挺早呀!

大白: 就咱這覺悟,心里有工作,哪里都是辦公桌,不要拘泥于形式嘛。

明顯能感覺得到小黑哥最近好像比較累,之前眼里bulingbuling閃的光是看不到了。

大白: 下午去面的哪家?啥崗位?咋樣?

小黑: 是一家做自動駕駛的創(chuàng)業(yè)公司,網(wǎng)站是看團隊介紹還不錯,就去看看了,這次沒咋準備,很多問題其實都熟悉,但是回答的不到位。

大白: 哦,明白了,那就是當(dāng)時理解的不到位,稀里糊涂過去了,現(xiàn)在忽然問起來,想不起重點。

小黑: 差不多吧,問我都做過哪些高性能的網(wǎng)絡(luò)框架模型,也就是IO和事件驅(qū)動那一套。

話說完,小黑喝了一大口啤酒,大白看出了小黑心里有一些落寞。畢竟在帝都這個地方競爭和工作壓力,以及生活瑣事都一直圍繞著我們,但是金錢和好運都巧妙地避開了自己...

 

想到這里,大白也深深喝了一大口,我命由我不由天,開整!

大白:黑哥,你說這個問題確實不好回答,全是術(shù)語和略帶歧義的東西,我覺得我們抓住本質(zhì)去闡述就好。

小黑:來,請開始你的表演,我學(xué)習(xí)學(xué)習(xí)。

大白決定和小黑好好聊聊,Linux開發(fā)中常用的高性能網(wǎng)絡(luò)框架中的一些事兒,火鍋的映襯下讓夜色和天氣都不那么寒冷了。

通過本文你將會了解到以下內(nèi)容:

 

  • IO事件和IO復(fù)用
  • 線程模型和事件驅(qū)動模型的架構(gòu)
  • 基于事件驅(qū)動的Reactor模式詳解
  • 同步IO和異步IO簡介

2. IO事件和IO復(fù)用

2.1 什么是IO事件

IO指的是輸入Input/輸出Output,但是從漢語角度來說,出和入是相對的,所以我們需要個參照物。這里我們的參照物選擇為程序運行時的主存儲空間,外部通常包括網(wǎng)卡、磁盤等。有了上述的設(shè)定理解起來就方便多了,我們來一起看下:

IO的本質(zhì)是數(shù)據(jù)的流動,數(shù)據(jù)可以從網(wǎng)卡到程序內(nèi)存,也可以從程序內(nèi)存寫到網(wǎng)卡,磁盤操作也是如此。

所以可以把常見的IO分為:

  • 網(wǎng)絡(luò)IO:內(nèi)存和網(wǎng)卡的數(shù)據(jù)交互
  • 文件IO:內(nèi)存和磁盤的數(shù)據(jù)交互

那什么又是IO事件呢?事件可以理解為一種狀態(tài)或者動作,也就是狀態(tài)的遷移會觸發(fā)一種相應(yīng)的動作。網(wǎng)絡(luò)IO的事件通常包括:

 

  • 可讀事件
  • 可寫事件
  • 異常事件

理解可讀可寫事件是非常有必要的,一般來說一個socket大部分時候是可寫的,但是并不是都可讀。可讀一般代表是一個新連接或者原有連接有新數(shù)據(jù)交互,對于服務(wù)端程序來說也是重點關(guān)注的事件。

 

2.2 什么是IO復(fù)用

設(shè)想假如有幾萬個IO事件,那么應(yīng)用程序該如何管理呢?這就要提到IO復(fù)用了。IO復(fù)用從本質(zhì)上來說就是應(yīng)用程序借助于IO復(fù)用函數(shù)向內(nèi)核注冊很多類型的IO事件,當(dāng)這些注冊的IO事件發(fā)生變化時內(nèi)核就通過IO復(fù)用函數(shù)來通知應(yīng)用程序。

從圖中可以看到,IO復(fù)用中復(fù)用的就是一個負責(zé)監(jiān)聽管理這些IO事件的線程。之所以可以實現(xiàn)一個線程管理成百上千個IO事件,是因為大部分時間里某個時刻只有少量IO事件被觸發(fā)。

大概就像這樣:草原上的一只大狗可以看管幾十只綿羊,因為大部分時候只有個別綿羊不守規(guī)矩亂跑,其他的都是乖乖吃草。

 

3. 網(wǎng)絡(luò)框架設(shè)計要素

要理解網(wǎng)絡(luò)框架有哪些,必須要清楚網(wǎng)絡(luò)框架完成了哪些事情。

大致描述下這個請求處理的流程:

 

  • 遠端的機器A發(fā)送了一個HTTP請求到服務(wù)器B,此時服務(wù)器B網(wǎng)卡接收到數(shù)據(jù)并產(chǎn)生一個IO可讀事件;
  • 我們以同步IO為例,此時內(nèi)核將該可讀事件通知到應(yīng)用程序的Listen線程;
  • Listen線程將任務(wù)甩給Handler線程,由Handler將數(shù)據(jù)從內(nèi)核讀緩沖區(qū)拷貝到用戶空間讀緩沖區(qū);
  • 請求數(shù)據(jù)包在應(yīng)用程序內(nèi)部進行計算和處理并封裝響應(yīng)包;
  • Handler線程等待可寫事件的到來;
  • 當(dāng)這個連接可寫時將數(shù)據(jù)從用戶態(tài)寫緩沖區(qū)拷貝到內(nèi)核緩沖區(qū),并通過網(wǎng)卡發(fā)送出去;

備注:上述例子是以同步IO為例,并且將線程中的角色分為Listen線程、Handler線程、Worker線程,分別完成不同的工作,后續(xù)會詳細展開。

所以我們可以知道,要完成一個數(shù)據(jù)交互,涉及了幾大塊內(nèi)容:

  • IO事件監(jiān)聽
  • 數(shù)據(jù)拷貝
  • 數(shù)據(jù)處理和計算

大白認為,這三大塊內(nèi)容,不論什么形式的框架都繞不開,也是理解網(wǎng)絡(luò)架構(gòu)的關(guān)鍵所在。

 

4. 高性能網(wǎng)絡(luò)框架實踐

4.1 基于線程模型

在早期并發(fā)數(shù)不多的場景中,有一種One Request One Thread的架構(gòu)模式。該模式下每次接收一個新請求就創(chuàng)建一個處理線程,線程雖然消耗資源并不多,但是成千上萬請求打過來,性能也是扛不住的。

這是一種比較原始的架構(gòu),思路也非常清晰,創(chuàng)建多個線程來提供處理能力,但在高并發(fā)生產(chǎn)環(huán)境中幾乎沒有應(yīng)用,本文不再展開。

 

4.2 基于事件驅(qū)動模型

當(dāng)前流行的是基于事件驅(qū)動的IO復(fù)用模型,相比多線程模型優(yōu)勢很明顯。

在此我們先理解一下什么是事件驅(qū)動Event-Drive-Model。

 

事件驅(qū)動編程是一種編程范式,程序的執(zhí)行流由外部事件來決定,它的特點是包含一個事件循環(huán),當(dāng)外部事件發(fā)生時使用回調(diào)機制來觸發(fā)相應(yīng)的處理。

通俗來說就是:有一個循環(huán)裝置在一直等待各種事件的到來,并將到達的事件放到隊列中,再由一個分揀裝置來調(diào)用對應(yīng)的處理裝置來響應(yīng)。

 

4.3 Reactor反應(yīng)堆模式

第一次聽到這個模式的時候很困惑,究竟反應(yīng)堆是個啥?研究了一下發(fā)現(xiàn),反應(yīng)堆是個核物理的概念,大致是這個樣子的:

核反應(yīng)堆是核電站的心臟 ,它的工作原理是這樣的:原子由原子核與核外電子組成,原子核由質(zhì)子與中子組成。

當(dāng)鈾235的原子核受到外來中子轟擊時,一個原子核會吸收一個中子分裂成兩個質(zhì)量較小的原子核,同時放出2-3個中子。

這裂變產(chǎn)生的中子又去轟擊另外的鈾235原子核,引起新的裂變,如此持續(xù)進行就是裂變的鏈式反應(yīng)。

結(jié)合這種核裂變的圖,好像是一個請求打過來,服務(wù)器內(nèi)部瞬間延伸出很多分支來完成響應(yīng),一變二,二變四,甚至更多,確實有種反應(yīng)堆的感覺。接下來我們看看究竟反應(yīng)堆模式是如何構(gòu)建高性能網(wǎng)絡(luò)框架的。

 

5.反應(yīng)堆模式詳解

反應(yīng)堆模式是一種思想,形式卻有很多種。

5.1 反應(yīng)堆模式的本質(zhì)是什么

從本質(zhì)上理解,無論什么網(wǎng)絡(luò)框架都要完成兩部分操作:

IO操作:數(shù)據(jù)包的讀取和寫入

CPU操作:數(shù)據(jù)請求的處理和封裝

所以上述這些問題由誰來做以及多少線程來做,就衍生出了很多形式,所以不要被表面現(xiàn)象迷惑,出現(xiàn)必有原因,追溯之后我們才能真正掌握它。

反應(yīng)堆模式根據(jù)處理IO環(huán)節(jié)和處理數(shù)據(jù)環(huán)節(jié)的數(shù)量差異分為如下幾種:

 

  • 單Reactor線程
  • 單Reactor線程和線程池
  • 多Reactor線程和線程池

我們來看看這三種常見模式的特點、原理、優(yōu)缺點、應(yīng)用場景等。

 

5.2 單Reactor線程模式

這種模式最為簡潔,一個線程完成了連接的監(jiān)聽、接收新連接、處理連接、讀取數(shù)據(jù)、寫入數(shù)據(jù)全套工作。由于只使用了一個線程,對于多核利用率偏低,但是編程簡單。是不是覺得這個種單線程的模式?jīng)]有市場?那可未必,不信你看Redis。

在這種模式種IO操作和CPU操作是沒有分開的,都是由1個線程來完成的,顯然如果在Handler處理某個請求超時了將會阻塞客戶端的正常連接。在Redis中由于都是內(nèi)存操作,速度很快,這種瓶頸雖然存在但是不夠明顯。

 

5.3 單Reactor線程和線程池模式

為了解決IO操作和CPU操作的不匹配,也就是IO操作和CPU操作是在一個線程內(nèi)部串行執(zhí)行的,這樣就拉低了CPU操作效率。

一種解決方法就是將IO操作和CPU操作分別由單獨的線程來完成,各玩各的互不影響。單Reactor線程完成IO操作、復(fù)用工作線程池來完成CPU操作就是一種解決思路。

在這種模式種由Reactor線程完成連接的管理和數(shù)據(jù)讀取&寫回,完全掌管IO操作。工作線程池處理來自上游分發(fā)的任務(wù),對其中的數(shù)據(jù)進行解碼、計算、編碼再返回給Reactor線程和客戶端完成交互。這種模式有效利用了多核,但是單Reactor線程來完成IO操作在高并發(fā)場景中仍然會出現(xiàn)瓶頸。換句話說,連接實在太多了,一個Reactor線程忙不過來建立新連接和響應(yīng)舊連接這些事情,因此Reactor線程也需要幾個幫手。

 

5.4 多Reactor線程和線程池模式

水平擴展往往是提供性能的有效方法。


 

我們將Reactor線程進行擴展,一個Reactor線程負責(zé)處理新連接,多個Reactor線程負責(zé)處理連接成功的IO數(shù)據(jù)讀寫。也就是進一步將監(jiān)聽&創(chuàng)建連接 和 處理連接 分別由兩個及以上的線程來完成,進一步提高了IO操作部分的效率。

這種模式算是比較高配的版本了,在實際生產(chǎn)環(huán)境也有使用。

 

5.5 拓展:同步IO和異步IO

我們可以輕易區(qū)分什么是阻塞IO和非阻塞IO,那么什么是同步IO和異步IO呢?前面提到Reactor模式其中非常重要的一環(huán)就是調(diào)用read/write函數(shù)來完成數(shù)據(jù)拷貝,這部分是應(yīng)用程序自己完成的,內(nèi)核只負責(zé)通知監(jiān)控的事件到來了,所以本質(zhì)上Reactor模式屬于非阻塞同步IO。還有一種Preactor模式,借助于系統(tǒng)本身的異步IO特性,由操作系統(tǒng)進行數(shù)據(jù)拷貝,在完成之后來通知應(yīng)用程序來取就可以,效率更高一些,但是底層需要借助于內(nèi)核的異步IO機制來實現(xiàn)。

底層的異步IO機制可能借助于DMA和Zero-Copy技術(shù)來實現(xiàn),理論上性能更高。當(dāng)前Windows系統(tǒng)通過IOCP實現(xiàn)了真正的異步I/O,而在Linux 系統(tǒng)的異步I/O還不完善,比如Linux中的boost.asio模塊就是異步IO的支持,但是目前Linux系統(tǒng)還是以基于Reactor模式的非阻塞同步IO為主。

 

6. 小結(jié)

 

本文從IO事件和IO復(fù)用出發(fā),闡述了網(wǎng)絡(luò)架構(gòu)最底層的組成。繼續(xù)展開了基于線程模型和基于事件驅(qū)動模型的網(wǎng)絡(luò)框架特點及其設(shè)計要素。之后重點描述了反應(yīng)堆模式的核心本質(zhì),以及生產(chǎn)環(huán)境中的多種形式。最后簡單介紹了同步IO和異步IO的區(qū)別,以及Preactor模式的優(yōu)勢。希望讀者朋友可以摒棄專業(yè)術(shù)語和表述,抓住問題的本質(zhì)和重點,找到一個適合自己思維方法去理解和掌握高性能網(wǎng)絡(luò)架構(gòu)的設(shè)計之道。或許,高性能網(wǎng)絡(luò)框架只是一個紙老虎。

 

責(zé)任編輯:武曉燕 來源: 后端技術(shù)指南針
相關(guān)推薦

2025-01-13 13:00:00

Go網(wǎng)絡(luò)框架nbio

2021-03-10 07:20:45

網(wǎng)絡(luò)IO同步

2024-08-12 08:43:09

2017-08-15 13:05:58

Serverless架構(gòu)開發(fā)運維

2019-04-08 16:50:33

前端性能監(jiān)控

2025-09-09 09:32:04

2018-04-16 11:04:23

HBaseRegion Serv數(shù)據(jù)庫

2022-01-14 12:28:18

架構(gòu)OpenFeign遠程

2014-11-27 15:32:31

openstacknetworkovs

2022-04-24 10:42:59

Kubernete容器網(wǎng)絡(luò)Linux

2023-06-07 15:34:21

架構(gòu)層次結(jié)構(gòu)

2021-08-31 10:32:11

LinuxPage Cache命令

2023-02-10 08:11:43

Linux系統(tǒng)調(diào)用

2022-11-09 08:12:07

2025-10-28 04:25:00

2017-05-26 09:50:19

PythonGIL線程安全

2021-09-03 09:55:43

架構(gòu)Yarn內(nèi)部

2013-07-31 10:04:42

hadoopHadoop集群集群和網(wǎng)絡(luò)

2012-11-08 14:47:52

Hadoop集群

2012-08-31 10:00:12

Hadoop云計算群集網(wǎng)絡(luò)
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲欧美中文字幕在线观看| 3p视频在线观看| 欧美一级专区| 国产精品极品美女在线观看免费 | 久久精品一区| 91亚洲va在线va天堂va国 | 亚洲国产99精品国自产| 色的视频在线免费看| 午夜精品福利一区二区蜜股av| 免费男女羞羞的视频网站中文字幕| 不卡视频一二三| 国产精品www在线观看| 国产麻豆精品一区二区| 黄色www在线观看| 精品一区二区三区日韩| 日韩尤物视频| 韩国成人福利片在线播放| 亚洲精品久久区二区三区蜜桃臀| 天堂一区二区在线| 亚洲狠狠婷婷综合久久久| 另类调教123区| 国产女教师bbwbbwbbw| 99久久精品国产一区二区三区| 国产二区视频在线| 久久久五月婷婷| 中文字幕av不卡在线| 国产精品麻豆欧美日韩ww| 黄网站免费入口| 亚洲成人激情av| a天堂在线资源| 精品福利视频一区二区三区| 精品3atv在线视频| 欧美激情极品视频| 色婷婷亚洲mv天堂mv在影片| 99久久综合狠狠综合久久止| 美女黄网久久| www.成年人视频| 国产精品久久三区| 在线观看导航| 欧美电视剧在线看免费| 在线观看爽视频| 欧美贵妇videos办公室| 欧美天天综合| 久久青青草原| 成人动漫一区二区| 二区三区中文字幕| 欧美人狂配大交3d怪物一区| 色偷偷色偷偷色偷偷在线视频| 久久久国产影院| 精品精品99| 欧美三级网色| 国产性做久久久久久| 三级在线电影| 亚洲人成电影网站色…| 希岛爱理av免费一区二区| 高清视频一区二区三区| 国产乱码精品一品二品| 国产又大又黄又粗又爽| 欧美日韩在线播放三区四区| 日韩性xxx| 国产精品永久免费视频| 老牛国产精品一区的观看方式| 黄色成人在线看| 亚洲国产欧美在线| 亚洲天堂电影| 国产精品美乳一区二区免费| 精油按摩中文字幕久久| 神马午夜dy888| 亚洲视频第一页| 亚洲成人最新网站| 熟女少妇在线视频播放| 在线看日韩精品电影| 四虎地址8848精品| 国产精品日韩欧美一区二区三区| 成人av免费在线| 日本中文字幕电影在线免费观看| 欧美高清在线视频观看不卡| 日韩电影免费在线观看网站| 日本福利片免费看| 亚洲视频在线观看| 一个色综合网| 国产又猛又黄的视频| 亚洲福利在线观看| 我不卡影院28| 狠狠躁狠狠躁视频专区| 日韩av网址在线| 欧美激情综合色综合啪啪| 成年人小视频网站| 日韩成人在线免费观看| 亚洲午夜精品久久久久久app| 精品久久久久久中文字幕2017| 欧美一区二区三区影视| 国产va免费精品观看精品视频| 亚洲爆乳无码精品aaa片蜜桃| 欧美亚男人的天堂| 亚洲精品**不卡在线播he| 僵尸世界大战2 在线播放| 欧美成人在线直播| 国产一区二区三区四区三区四| 九七影院理论片| 久久夜精品香蕉| 国产精品12区| 男女免费观看在线爽爽爽视频| 国产在线视频91| 国产精品国产三级国产aⅴ入口| 久久久一本精品| 日本视频一区在线观看| 色狠狠一区二区三区香蕉| 国产96在线亚洲| 国产高清精品在线观看| 日韩精品亚洲精品| 日本91福利区| 91麻豆国产福利在线观看宅福利| 91在线视频九色| 亚洲综合在线视频| 一区二区小说| www.大网伊人| 2025国产精品视频| 中文字幕精品一区二区精品绿巨人 | 日韩精品在线观看av| 在线观看中文字幕不卡| 偷拍亚洲色图| 缴情综合网五月天| 欧美精品999| 国产清纯美女被跳蛋高潮一区二区久久w| 国产污视频在线播放| 国产成人激情视频| 美女日批免费视频| 欧美videossexotv100| 三上亚洲一区二区| 黄色av免费在线播放| 日韩av一区二区在线观看| 一区二区高清| 你懂的视频在线| 欧美在线亚洲在线| 26uuu久久天堂性欧美| 深夜福利视频一区二区| 蜜桃视频成人| 欧美精品日韩一区| 欧美日韩视频| 国产理论电影在线观看| 91在线高清视频| 欧美日韩另类在线| 一级毛片免费高清中文字幕久久网| 天堂中文字幕| 国产精品福利在线观看网址| 中文字幕中文字幕在线一区| 成人盗摄视频| 国产网站免费观看| 国产精品小说在线| 香蕉乱码成人久久天堂爱免费| 成人情趣视频| 97国产在线| 91麻豆蜜桃| 欧美一级夜夜爽| 美女网站视频久久| 国产国产一区| 国产精品久久a| 国产成人久久精品| 色噜噜夜夜夜综合网| 亚洲综合三区| 亚洲私拍视频| jizzjizzxxxx| 欧洲日韩成人av| 精品久久久国产精品999| 欧美jizzhd精品欧美巨大免费| 黄网站免费在线播放| 九一免费在线观看| 久久久久久久久网站| 亚洲大片免费看| 国产亚洲亚洲| 日韩电影免费观| 97在线资源在| 99蜜桃在线观看免费视频网站| 日韩一级视频免费观看在线| 国产精品亚洲一区二区三区妖精| 日韩一区二区三区色| 精东传媒在线观看| 日韩电影免费观看高清完整| 国产美女网站在线观看| 三区四区电影在线观看| 国精产品一区二区| 日韩成人av一区| 久久久一区二区三区| 免费看成人吃奶视频在线| 国产乱理伦片a级在线观看| 天天爽天天狠久久久| 久久精品青青大伊人av| 亚洲黄色小视频| 国产乱码精品| 视频一区中文字幕精品| 午夜男人视频在线观看| 亚洲午夜精品国产| 午夜精品久久久久久久久久久久久 | 色婷婷在线播放| 天天爱天天做天天操| 久久久久免费视频| 欧美日韩三级视频| 久久久99免费| 快she精品国产999|