您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費注冊]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>DSP編程>

C10K到C10M高性能網(wǎng)絡(luò)的實踐分析

大?。?/span>0.6 MB 人氣: 2017-10-12 需要積分:1
 C10K時代的問題與優(yōu)化手段
  首先帶大家回顧一下當(dāng)年C10K場景中遇到的問題以及為了解決我們單機下高并發(fā)的承載能力所做的改進。在當(dāng)時的年代,國內(nèi)互聯(lián)網(wǎng)的普及程度相對較低,C10K并沒有給當(dāng)時中國的互聯(lián)網(wǎng)環(huán)境帶來太大沖擊,但是在全球互聯(lián)網(wǎng)環(huán)境下大家開始意識到這個問題。為了解決該問題,首先的研究方向就是IO模型的優(yōu)化,逐漸解決了C10K的問題。
  epoll、kqueue、iocp就是IO模型優(yōu)化的一些最佳實踐,這幾種技術(shù)實現(xiàn)分別對應(yīng)于不同的系統(tǒng)平臺。以epoll為例,在它的基礎(chǔ)上抽象了一些開發(fā)框架和庫,為廣大軟件開發(fā)者在軟件開發(fā)帶來了便利,比如libevent、libev等。隨著當(dāng)年在IO模型上的革命,衍生出了很多至今為止我們都在大量使用的優(yōu)秀開源軟件,比如nginx、haproxy、squid等,通過大量的創(chuàng)新、實踐和優(yōu)化,使我們在今天能夠很輕易地解決一個大并發(fā)壓力場景下的技術(shù)問題。
  這里簡單列了幾點,較為常用的優(yōu)化技術(shù)手段。
  CPU親和性&內(nèi)存局域性
  目前我們使用的服務(wù)器主要是多路、多核心的x86平臺。用于運行我們的軟件代碼,在很多場景的業(yè)務(wù)需求下,都會涉及一定并發(fā)任務(wù),無論是多進程模型還是多線程模型,都要把所有的調(diào)度任務(wù)交給操作系統(tǒng),讓操作系統(tǒng)幫我們分配硬件資源。我們常用的服務(wù)器操作系統(tǒng)都屬于分時操作系統(tǒng),調(diào)度模型都盡可能的追求公平,并沒有為某一類任務(wù)做特別的優(yōu)化,如果當(dāng)前系統(tǒng)僅僅運行某一特定任務(wù)的時候,默認的調(diào)度策略可能會導(dǎo)致一定程度上的性能損失。我運行一個A任務(wù),第一個調(diào)度周期在0號核心上運行,第二個調(diào)度周期可能就跑到1號核心上去了,這樣頻繁的調(diào)度可能會造成大量的上下文切換,從而影響到一定的性能。
  數(shù)據(jù)局域性是同樣類似的問題。當(dāng)前x86服務(wù)器以NUMA架構(gòu)為主,這種平臺架構(gòu)下,每個CPU有屬于自己的內(nèi)存,如果當(dāng)前CPU需要的數(shù)據(jù)需要到另外一顆CPU管理的內(nèi)存獲取,必然增加一些延時。所以我們盡可能的嘗試讓我們的任務(wù)和數(shù)據(jù)在始終在相同的CPU核心和相同的內(nèi)存節(jié)點上,Linux提供了sched_set_affinity函數(shù),我們可以在代碼中,將我們的任務(wù)綁定在指定的CPU核心上。一些Linux發(fā)行版也在用戶態(tài)中提供了numactl和taskset工具,通過它們也很容易讓我們的程序運行在指定的節(jié)點上。
  RSS、RPS、RFS、XPS
  這些技術(shù)都是近些年來為了優(yōu)化Linux網(wǎng)絡(luò)方面的性能而添加的特性,RPS、RFS、XPS都是Google貢獻給社區(qū),RSS需要硬件的支持,目前主流的網(wǎng)卡都已支持,即俗稱的多隊列網(wǎng)卡,充分利用多個CPU核心,讓數(shù)據(jù)處理的壓力分布到多個CPU核心上去。RPS和RFS在linux2.6.35的版本被加入,一般是成對使用的,在不支持RSS特性的網(wǎng)卡上,用軟件來模擬類似的功能,并且將相同的數(shù)據(jù)流綁定到指定的核心上,盡可能提升網(wǎng)絡(luò)方面處理的性能。XPS特性在linux2.6.38的版本中被加入,主要針對多隊列網(wǎng)卡在發(fā)送數(shù)據(jù)時的優(yōu)化,當(dāng)你發(fā)送數(shù)據(jù)包時,可以根據(jù)CPU MAP來選擇對應(yīng)的網(wǎng)卡隊列,低于指定的kernel版本可能無法使用相關(guān)的特性,但是發(fā)行版已經(jīng)backport這些特性。
  IRQ 優(yōu)化
  關(guān)于IRQ的優(yōu)化,這里主要有兩點,第一點是關(guān)于中斷合并。在比較早期的時候,網(wǎng)卡每收到一個數(shù)據(jù)包就會觸發(fā)一個中斷,如果小包的數(shù)據(jù)量特別大的時候,中斷被觸發(fā)的數(shù)量也變的十分可怕。大部分的計算資源都被用于處理中斷,導(dǎo)致性能下降。后來引入了NAPI和Newernewer NAPI特性,在系統(tǒng)較為繁忙的時候,一次中斷觸發(fā)后,接下來用輪循的方式讀取后續(xù)的數(shù)據(jù)包,以降低中斷產(chǎn)生的數(shù)量,進而也提升了處理的效率。第二點是IRQ親和性,和我們前面提到了CPU親和性較為類似,是將不同的網(wǎng)卡隊列中斷處理綁定到指定的CPU核心上去,適用于擁有RSS特性的網(wǎng)卡。
  這里再說說關(guān)于網(wǎng)絡(luò)卸載的優(yōu)化,目前主要有TSO、GSO、LRO、GRO這幾個特性,先說說TSO,以太網(wǎng)MTU一般為1500,減掉TCP/IP的包頭,TCP的MaxSegment Size為1460,通常情況下協(xié)議棧會對超過1460的TCP Payload進行分段,保證最后生成的IP包不超過MTU的大小,對于支持TSO/GSO的網(wǎng)卡來說,協(xié)議棧就不再需要這樣了,可以將更大的TCPPayload發(fā)送給網(wǎng)卡驅(qū)動,然后由網(wǎng)卡進行封包操作。通過這個手段,將需要在CPU上的計算offload到網(wǎng)卡上,進一步提升整體的性能。GSO為TSO的升級版,不在局限于TCP協(xié)議。LRO和TSO的工作路徑正好相反,在頻繁收到小包時,每次一個小包都要向協(xié)議棧傳遞,對多個TCPPayload包進行合并,然后再傳遞給協(xié)議棧,以此來提升協(xié)議棧處理的效率。GRO為LRO的升級版本,解決了LRO存在的一些問題。這些特性都是在一定的場景下才可以發(fā)揮其性能效率,在不明確自己的需求的時候,開啟這些特性反而可能造成性能下降。
  Kernel 優(yōu)化
  關(guān)于Kernel的網(wǎng)絡(luò)相關(guān)優(yōu)化我們就不過多的介紹了,主要的內(nèi)核網(wǎng)絡(luò)參數(shù)的調(diào)整在以下兩處:net.ipv4.參數(shù)和net.core.參數(shù)。主要用于調(diào)節(jié)一些超時控制及緩存等,通過搜索引擎我們能很容易找到關(guān)于這些參數(shù)調(diào)優(yōu)的文章,但是修改這些參數(shù)是否能帶來性能的提升,或者會有什么弊端,建議詳細的閱讀kernel文檔,并且多做一些測試來驗證。
  更深入的探索和實踐
  接下來,我們著重了解如何去更進一步提升我們單機網(wǎng)絡(luò)吞吐以及網(wǎng)絡(luò)處理性能的技術(shù)和手段。
  計算機硬件做為當(dāng)前IT發(fā)展的重要組成部分。作為軟件開發(fā)者,我們更應(yīng)該掌握這部分的內(nèi)容,學(xué)習(xí)了解我們的軟件如何在操作系統(tǒng)中運行,操作系統(tǒng)又怎樣分配我們的硬件資源。
  硬件
  CPU
  CPU是計算機系統(tǒng)中最核心、最關(guān)鍵的部件。在當(dāng)前的x86服務(wù)器領(lǐng)域我們接觸到主要還是Intel芯片。索性我們就以IntelXeon 2600系列舉例。
  Intel Xeon 2600系列的CPU已經(jīng)發(fā)布了3代,第4代產(chǎn)品2016年Q1也即將面市,圖例中均選取了4代產(chǎn)品最高端的型號。圖一為該系列CPU的核心數(shù)量統(tǒng)計,從第一代的8核心發(fā)展到即將上市的22核心,若干年前,這是很可怕的事情。裝配該型號CPU的雙路服務(wù)器,再開啟超線程,輕而易舉達到80多個核心。就多核處理器的發(fā)展歷程來講,核心數(shù)量逐年提升,主頻基本穩(wěn)定在一定的范圍內(nèi),不是說單核主頻不再重要,而是說在當(dāng)前的需求場景下,多核心才是更符合我們需求的處理器。
  C10K到C10M高性能網(wǎng)絡(luò)的實踐分析
  圖1
  不僅僅是核心數(shù)量,像LLC緩存的容量、內(nèi)存帶寬都有很大的提升,分別達到了55MB和76.8GB/s。

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發(fā)表評論

      用戶評論
      評價:好評中評差評

      發(fā)表評論,獲取積分! 請遵守相關(guān)規(guī)定!

      ?