在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

高性能服務器網(wǎng)絡模型詳解

SDNLAB ? 來源:SDNLAB ? 作者:SDNLAB ? 2023-07-03 15:36 ? 次閱讀

作者簡介:謝友鵬,目前在螞蟻金服-支付寶-網(wǎng)絡技術(shù)部任職技術(shù)專家,先后在華為和支付寶從事網(wǎng)絡和云相關(guān)開發(fā)。涉及領域vpn、sdwan、全球網(wǎng)絡加速、區(qū)塊鏈網(wǎng)絡加速、cdn靜態(tài)緩存等。長期研究nginx、apache traffic server、frp等代理項目和基于k8s的云原生項目。不定期更新個人微信公眾號--網(wǎng)絡技術(shù)修煉。關(guān)注領域:網(wǎng)絡、云、linux高性能服務端。

1999年Dan Kegel在發(fā)表的論文中提出了The C10K problem,這篇論文對傳統(tǒng)服務器架構(gòu)處理大規(guī)模并發(fā)連接時的挑戰(zhàn)進行了詳細描述,并提出了一些解決方案和優(yōu)化技術(shù)。這里的C指的是Concurrent(并發(fā))的縮寫,C10K問題是指怎么在單臺服務器上并發(fā)一萬個請求。如果你分析過性能問題一定會注意到,性能極限通常受到一個或多個資源的限制,比如內(nèi)存、文件句柄個數(shù)、網(wǎng)絡帶寬、CPU等。這里討論的前提是機器的物理資源和系統(tǒng)配置能夠滿足一萬個請求。在這個前提下,網(wǎng)絡并發(fā)主要關(guān)注兩個方面:一是應用程序和操作系統(tǒng)內(nèi)核之間如何進行IO事件通知,二是應用程序進程或線程的分配方式。

I/O模型

阻塞vs非阻塞、同步vs異步

你可能經(jīng)??吹侥衬稠椖坑玫耐椒亲枞P汀⒛衬稠椖坑玫漠惒椒亲枞P?,所以在正式討論I/O模型前,還是先對齊一下關(guān)于阻塞、非阻塞以及同步、異步的概念吧。

阻塞、非阻塞指的是系統(tǒng)調(diào)用時“等待數(shù)據(jù)準備好”這個動作。比如read時候,如果內(nèi)核判定數(shù)據(jù)還沒準備好:

內(nèi)核讓應用進程一直等待,直到數(shù)據(jù)準備好才通知應用進程就是阻塞;

內(nèi)核立即通知應用程序說數(shù)據(jù)沒準備好,你先干別的吧,就是非阻塞。

同步、異步指的是“內(nèi)核空間與用戶空間復制數(shù)據(jù)”這個動作。比如read時候,如果內(nèi)核判定數(shù)據(jù)還沒準備,過一段時間數(shù)據(jù)來了:

內(nèi)核通知應用進程你來讀取數(shù)據(jù)吧,應用程序再次系統(tǒng)調(diào)用將數(shù)據(jù)讀走就是同步;

內(nèi)核將數(shù)據(jù)拷貝到用戶空間后再通知應用進程,數(shù)據(jù)已經(jīng)拷貝好了直接用吧,就是異步。

I/O模型詳解

Stevens在《UNIX 網(wǎng)絡編程 卷1》一書的6.2章節(jié)介紹了五種 I/O 模型。以下模型以UDP接收報文為例來說明這五種I/O 的工作方式。

阻塞式I/O

wKgaomSiewuAUyc2AACRullMN3g800.jpg

該模型使用最簡,用戶進程調(diào)用讀取數(shù)據(jù)系統(tǒng)后就一直等待,直到內(nèi)核數(shù)據(jù)準備好,并將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間后,調(diào)用結(jié)束。這種模型效率顯然的低下,因為這種模型會導致兩種可能結(jié)果:

為每個請求分配一個進程或線程,那么高并發(fā)意味著內(nèi)核要調(diào)度的進程或線程數(shù)量很龐大,調(diào)度、上下文切換等開銷會使系統(tǒng)性能降低。

固定數(shù)量的進程或線程處理請求,那么這些進程或線程全被被占用后,新請求就只能等了。

該模型低效的根本原因在于阻塞,內(nèi)核數(shù)據(jù)沒有準備好的時候,用戶態(tài)進程明明可以干其他活的,現(xiàn)在只能白白等待。

非阻塞式 I/O

wKgaomSiewuAdp-KAAB8fE5pVjY725.jpg

這種模型通過非阻塞的方式與內(nèi)核打交道,如果內(nèi)核中數(shù)據(jù)還未準備好,就立刻返回給用戶進程,用戶進程就可以先干別的事情,過一段再進行讀數(shù)據(jù)的系統(tǒng)調(diào)用,直到內(nèi)核數(shù)據(jù)準備好,并將數(shù)據(jù)拷貝到用戶空間。相比于阻塞的模型,這種非阻塞+主動輪詢的模型避免了用戶進程白白等待內(nèi)核準備數(shù)據(jù)的時間,所以效率有所提升,但是因為每次輪詢都是系統(tǒng)調(diào)用,所以上下文切換變多了,因此性能也不高。

I/O 復用

wKgaomSiewuAEnzSAABw59S0WqY351.jpg

既然不停主動查詢內(nèi)核數(shù)據(jù)是否準備好這件事會引起系統(tǒng)性能下降,那能不能通過注冊+通知的方式呢?這就是大名鼎鼎的I/O復用模型。該模型允許用戶態(tài)通過一個進程將所有相關(guān)的讀寫事件(使用select、poll或epoll)注冊到內(nèi)核,然后內(nèi)核會主動通知用戶態(tài)進程,一旦任意一個或多個請求的讀寫數(shù)據(jù)準備好。這種方式在單個進程或線程中同時處理多個I/O通道的就緒狀態(tài)被稱為I/O多路復用。使用I/O多路復用既不會阻塞處理請求的進程,也不會因為輪詢內(nèi)核數(shù)據(jù)是否準備好而導致過多的系統(tǒng)調(diào)用,因此具有高效的特點。然而,需要注意的是,一旦內(nèi)核通知應用進程數(shù)據(jù)準備就緒,仍然需要通過系統(tǒng)調(diào)用觸發(fā)數(shù)據(jù)的讀取過程。

Linux內(nèi)核對這種模型的支持非常完善,因此許多高性能服務器在Linux環(huán)境中廣泛采用這種模式。

信號驅(qū)動式 I/O

wKgZomSiewuAR3RuAABwnaO4-yo763.jpg

I/O復用模型中是用一個進程(select、poll或epoll)阻塞或輪詢所有請求的數(shù)據(jù)是否準備好,從而讓所有請求進程的處理都不會阻塞。信號驅(qū)動式則沒有這個復用的I/O進程,每個請求進程自己去內(nèi)核注冊,然后等數(shù)據(jù)準備好內(nèi)核通知應用進程去處理。這種模型應用套接字處理的實踐場景為基于UDP的NTP服務,幾乎沒有在TCP上的應用,因為對于TCP來說信號產(chǎn)生過于頻繁,而且并沒有告訴應用程序發(fā)生了什么事件,比如下面條件均會導致TCP套接字產(chǎn)生SIGIO信號:

監(jiān)聽套接字某個連接請求已經(jīng)完成;

某個斷鏈請求已經(jīng)發(fā)起;

某個斷鏈請求已經(jīng)完成;

某個半連接已經(jīng)關(guān)閉;

數(shù)據(jù)到達套接字;

數(shù)據(jù)已經(jīng)從套接字發(fā)出;

發(fā)生某個異步錯誤。

異步 I/O

wKgZomSiewuAEWhRAABPZxGGdsQ551.jpg

前面幾種方式,無論是阻塞還是非阻塞,從內(nèi)核空間到用戶空間復制數(shù)據(jù)的動作都是在內(nèi)核通知用戶進程后,用戶進程再通過系統(tǒng)調(diào)用觸發(fā)完成的,因此都屬于同步操作。而異步I/O模型則不同,它允許用戶態(tài)進程通過系統(tǒng)調(diào)用讀取數(shù)據(jù)后,即使內(nèi)核數(shù)據(jù)未準備好,也會立即返回給用戶進程,告知數(shù)據(jù)未準備好,讓用戶進程可以執(zhí)行其他操作。當數(shù)據(jù)準備好后,內(nèi)核會將數(shù)據(jù)從內(nèi)核空間拷貝到用戶態(tài),并直接回調(diào)用戶進程,將數(shù)據(jù)送到用戶進程手中。這種模型不僅具備非阻塞特性,還能進一步減少系統(tǒng)調(diào)用的次數(shù),因此在理論上相對于其他模型更加高效。需要注意的是,這種模型需要操作系統(tǒng)內(nèi)核的支持。

在《UNIX網(wǎng)絡編程卷1》一書中,截至書稿時,支持POSIX異步I/O的系統(tǒng)相對較少。由于早期Linux內(nèi)核對網(wǎng)絡異步I/O的支持不夠成熟,在Linux環(huán)境下,大多數(shù)高性能網(wǎng)絡服務器選擇采用I/O復用的方式,如epoll。然而,從Linux內(nèi)核5.0版本開始,引入了io_uring異步操作,隨著該技術(shù)的成熟,越來越多的高性能網(wǎng)絡服務器(例如nginx)開始支持使用這種異步I/O方式。

如何簡單理解5種I/O?

下面通過一個例子對比一下5種模型,顧客是應用進程,餐飲人員為內(nèi)核,餐桌為應用進程的數(shù)據(jù)buffer:

阻塞式I/O:交完錢也要在窗口排隊,等師傅做好,將飯端給你,你再端到自己餐桌。

非阻塞式I/O:交完錢你就可以離開窗口玩一會了,窗口有個屏幕,你過一會跑過來看一下自己的飯好了沒,直到飯做好,自己端到自己的餐桌。

I/O復用:好幾個同學都把飯卡交給你,你一個人跑到窗口排隊刷卡,誰的飯好了,你就打電話給誰,讓他自己將飯端到餐桌。

信號驅(qū)動式I/O:你去窗口手機刷卡后就可離開了,飯做好會通過手機通知你,然后自己過去將飯端到餐桌。

異步I/O:去窗口點餐后,告訴服務員你在哪個餐桌就可以離開了,飯做好,服務員會將飯幫你端到餐桌。

進程/線程分配

進程和線程的創(chuàng)建、調(diào)度都需要系統(tǒng)開銷。在高并發(fā)系統(tǒng)中,為每個請求分配一個進程或線程會對性能產(chǎn)生不利影響。為了克服這個問題,高性能的網(wǎng)絡模型通常采用進程池或線程池來管理進程或線程。進程/線程池的設計目的是降低創(chuàng)建和銷毀進程/線程的頻率,并限制系統(tǒng)中總進程/線程的數(shù)量,以減少內(nèi)核調(diào)度的開銷。

常用高性能模式

reactor 模式

《The Design and Implementation of the Reactor》一文詳細介紹了reactor模式的工作方式,簡單來說,reactor模式=I/O復用 + 進程池/線程池。

proactor模式

《Proactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handlers for Asynchronous Events》一文詳細介紹了proactor模式的工作方式,簡單來說,proactor模式=異步I/O+ 進程池/線程池。

驚群效應

對于TCP請求來說,最理想的情況是每個事件每次從池中喚醒一個進程或線程去執(zhí)行,這樣既不需要等待又不會引起競爭。用一個進程或線程專門負責處理accept事件,然后將接下來的事件繼續(xù)分發(fā)給其他worker處理是可行的。有一些模型(比如nginx)存在多個進程或線程監(jiān)聽同一個端口的情況,如果不加處理會出現(xiàn)一個accept事件喚醒所有worker進程的情況,即驚群效應。為了應對驚群效應,早期nginx引入了accept_mutex的機制,競爭到鎖的worker才會執(zhí)行accept操作,從而避免所有worker都被喚醒。Linux3.9 版本后提供了reuseport更好的解決了多個進程或線程監(jiān)聽同一個端口引起的驚群問題,簡單說就是內(nèi)核幫你輪詢,而不用在應用層面競爭了。

更快、更強大的網(wǎng)絡模型

欲望是永無止境的,有人提出The C10K problem問題,就有人提出The C10M problem,前文中的討論基本都是圍繞用戶態(tài)進程和內(nèi)核的交互優(yōu)化,既然和內(nèi)核交互容易導致性能瓶頸,那為何不旁路掉內(nèi)核協(xié)議棧呢?所以有了更快的網(wǎng)絡方案,比如DPDK、XDP、甚至硬件加速等。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11326

    瀏覽量

    209964
  • 服務器
    +關(guān)注

    關(guān)注

    12

    文章

    9253

    瀏覽量

    85749
  • UDP
    UDP
    +關(guān)注

    關(guān)注

    0

    文章

    327

    瀏覽量

    34007
  • 網(wǎng)絡模型
    +關(guān)注

    關(guān)注

    0

    文章

    44

    瀏覽量

    8452

原文標題:高性能服務器網(wǎng)絡模型詳解

文章出處:【微信號:SDNLAB,微信公眾號:SDNLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    海單路高性能服務器主板

    服務器
    jf_10805031
    發(fā)布于 :2024年04月26日 14:23:58

    服務器技術(shù)基礎

    中國高性能計算機標準1.1 什么是服務器服務器Server從功能上說,它負責偵聽網(wǎng)絡上其它客戶機(Client)提交的服務請求,
    發(fā)表于 09-12 22:55

    解鎖高性能計算與區(qū)塊鏈應用,阿里云Kubernetes服務召喚神龍

    網(wǎng)絡驅(qū)動沒有做額外的overlay的開銷,經(jīng)過之前的測試,配合神龍(X-Dragon)彈性裸金屬服務器高性能網(wǎng)絡和容器服務
    發(fā)表于 06-13 15:52

    高性能服務器開發(fā)2018年的原創(chuàng)匯總

    高性能服務器開發(fā) 2018 年原創(chuàng)匯總
    發(fā)表于 06-10 12:33

    高性能高并發(fā)服務器架構(gòu)分享

    由于自己正在做一個高性能大用戶量的論壇程序,對高性能高并發(fā)服務器架構(gòu)比較感興趣,于是在網(wǎng)上收集了不少這方面的資料和大家分享。希望能和大家交流 msn: ——————————————————————————————————————
    發(fā)表于 09-16 06:45

    服務器的特性與劃分

    服務器,也稱伺服。服務器網(wǎng)絡環(huán)境中的高性能計算機,它偵聽網(wǎng)絡上的其他計算機(客戶機)提交的
    發(fā)表于 12-13 15:42 ?2.3w次閱讀

    通用高性能密碼服務系統(tǒng)模型

    通用高性能密碼服務系統(tǒng)模型_寇文龍
    發(fā)表于 01-07 21:39 ?0次下載

    基于OPNET實現(xiàn)跨層網(wǎng)絡服務器模型的構(gòu)型

    設計,并通過權(quán)威的網(wǎng)絡仿真工具(OPNET)實現(xiàn)了跨層網(wǎng)絡服務器模型的構(gòu)建。實驗結(jié)果表明,本文設計的跨層網(wǎng)絡模型能夠很好地實現(xiàn)
    發(fā)表于 11-05 11:08 ?5次下載
    基于OPNET實現(xiàn)跨層<b class='flag-5'>網(wǎng)絡服務器</b><b class='flag-5'>模型</b>的構(gòu)型

    服務器的功能_服務器是干嘛的

    服務器是一種高性能計算機,作為網(wǎng)絡的節(jié)點,存儲、處理網(wǎng)絡上80%的數(shù)據(jù)、信息,因此也被稱為網(wǎng)絡的靈魂。
    的頭像 發(fā)表于 07-24 10:10 ?1.1w次閱讀

    詳解Nginx高性能的HTTP和反向代理服務器

    Nginx 是一個高性能的 HTTP 和反向代理服務器,特點是占用內(nèi)存少,并發(fā)能力強,事實上 Nginx 的并發(fā)能力確實在同類型的網(wǎng)頁服務器中表現(xiàn)較好。
    的頭像 發(fā)表于 03-16 11:23 ?2476次閱讀

    高性能服務器優(yōu)化大型HFSS模型

    在仿真優(yōu)化HFSS復雜模型時,經(jīng)常會發(fā)現(xiàn),如果優(yōu)化調(diào)整某個結(jié)構(gòu)尺寸,高頻VSWR指標與低頻VSWR指標存在翹翹板現(xiàn)象,按下葫蘆起了瓢! 島主見過有人用高性能服務器優(yōu)化大型HFSS模型
    發(fā)表于 08-28 11:26 ?2次下載

    人工智能服務器高性能計算需求

    人工智能(AI)服務器是一種專門為了運行人工智能應用和提供大數(shù)據(jù)處理能力而設計的高性能計算機。它既可以支持本地應用程序和網(wǎng)頁,也可以為云和本地服務器提供復雜的AI模型
    的頭像 發(fā)表于 12-08 09:44 ?548次閱讀

    GPU高性能服務器配置

    GPU高性能服務器作為提升計算速度和效率的關(guān)鍵設備,在各大應用場景中發(fā)揮著越來越重要的作用。在此,petacloud.ai小編為你介紹GPU高性能服務器的配置要點。
    的頭像 發(fā)表于 10-21 10:42 ?247次閱讀

    高性能服務器有什么用處?

    高性能服務器是一種基于云計算技術(shù)的虛擬化服務器,具有高性能、靈活性、可靠性和安全性等特點。它廣泛應用于網(wǎng)絡托管
    的頭像 發(fā)表于 11-04 10:22 ?232次閱讀

    GPU服務器AI網(wǎng)絡架構(gòu)設計

    眾所周知,在大型模型訓練中,通常采用每臺服務器配備多個GPU的集群架構(gòu)。在上一篇文章《高性能GPU服務器AI網(wǎng)絡架構(gòu)(上篇)》中,我們對GP
    的頭像 發(fā)表于 11-05 16:20 ?488次閱讀
    GPU<b class='flag-5'>服務器</b>AI<b class='flag-5'>網(wǎng)絡</b>架構(gòu)設計
    主站蜘蛛池模板: 六月丁香婷婷激情国产| 国产理论在线观看| 婷婷激情四射网| 韩日一级毛片| 亚欧人成精品免费观看| 亚洲综合国产一区二区三区| 爽天天天天天天天| 国产免费私拍一区二区三区| 欧美一级做一级做片性十三| 五月网婷婷| 亚洲综合久久久久久888| 亚洲欧美在线一区二区| 欧美性第一页| 国产精品莉莉欧美自在线线| 99精品视频在线播放2| 就是操就是干| 夜夜夜操| av2021天堂网手机版| 黄色软件入口| 就去干综合| 国产免费美女| 天天综合网天天综合色| 在线观看天堂| 不卡无毒免费毛片视频观看| 精品三级三级三级三级三级| 玖玖在线精品| 99精品久久久久久久婷婷| 天天干夜夜添| 人人揉人人爽五月天视频| 午夜大片男女免费观看爽爽爽尤物| 成人女人a毛片在线看| 国产精品久久婷婷六月丁香| 国产美女在线精品观看| 午夜影院免费观看视频| 五月天欧美| www.狠狠艹| a免费网站| 综合久色| 在线看片成人| 亚洲国产成人精品女人久久久| 亚洲欧美日韩动漫|