C1000k 新思路:用戶態(tài) TCP/IP 協(xié)議棧[陳碩]


現(xiàn)在的服務(wù)器支撐上百萬個并發(fā) TCP 連接已經(jīng)不是新聞(余鋒2010年的演講,ideawuiComet 開源項目,WhatsApp 做到了 2.5M)。實(shí)現(xiàn) C1000k 的常規(guī)做法是調(diào)整內(nèi)核參數(shù),提高文件數(shù),降低每個連接的內(nèi)存消耗(參考 ideawu 的博客)。

在今年的 BSDCan2014 會議上, Patrick Kelsey 介紹了把 FreeBSD 9.x 的 TCP/IP 協(xié)議棧移植到了用戶態(tài)(slides, github.com/pkelsey/libuinet),并用于WANProxy 項目。在用戶態(tài)運(yùn)行 TCP/IP 協(xié)議棧意味著并發(fā) TCP 連接不再占用系統(tǒng)文件數(shù),只占內(nèi)存,解決了 C1000k 的一大瓶頸,內(nèi)核只要提供一個收發(fā)網(wǎng)絡(luò) packet 的接口就行(例如 netmap)。

內(nèi)核的網(wǎng)絡(luò)協(xié)議棧強(qiáng)調(diào)通用性,主要是為吞吐量優(yōu)化(性能指標(biāo)通常是 MB/s 或 packets per second),順帶兼顧大量并發(fā)連接。為了支持 C1000k,要調(diào)整內(nèi)核參數(shù)讓每個連接少占資源,這與內(nèi)核代碼的設(shè)計初衷是違背的。

用戶態(tài)協(xié)議棧捅破了這層窗戶紙,可以根據(jù)應(yīng)用的特點(diǎn)來剪裁協(xié)議棧功能。優(yōu)化也更直接,不再是調(diào)黑盒參數(shù)組合,而是直接上 profiling,根據(jù)結(jié)果修改應(yīng)用程序和協(xié)議棧的代碼。

用戶態(tài)協(xié)議棧的吞吐量比不上內(nèi)核,不過對 C1000k 的應(yīng)用場合(例如 comet)應(yīng)該不成問題。


muduo 的 C1000k 實(shí)驗

我用 muduo 做了一次 C1000k 的實(shí)驗,用的是傳統(tǒng)方案,沒有用 libuinet。在一臺 16GB 內(nèi)存的 Dell WS490 舊工作站上創(chuàng)建了 50萬個 TCP 連接,提供 echo 服務(wù)。系統(tǒng)可用內(nèi)存減少了 5286MiB,即每個連接 10.8KiB(其中服務(wù)進(jìn)程占用了 1421MiB 內(nèi)存,即每個連接 2.9KiB,其余 8KiB 左右是內(nèi)核協(xié)議棧的開銷)??蛻舳耸且慌_ 8GB 內(nèi)存的 i5-2500,內(nèi)存消耗也是 5GB 多,因此這次實(shí)驗只試到了 C500k。客戶機(jī)綁定了 10 個 IP,每個 IP 上發(fā)出 5 萬 TCP 連接,運(yùn)行 pingpong 協(xié)議,每個連接輪流收發(fā) 64 字節(jié)的消息。測得 QPS 大約是 11k,服務(wù)器的 CPU 占用率約為 60%(單線程)。profile 顯示 CPU 的主要開銷在內(nèi)核中,我對這個結(jié)果基本滿意。


復(fù)活 4.4BSD-Lite2 的網(wǎng)絡(luò)協(xié)議棧

受 libuinet 啟發(fā),我把 4.4BSD-Lite2 的網(wǎng)絡(luò)協(xié)議棧也移植到了 Linux 用戶態(tài)(github.com/chenshuo/4.4BSD-Lite2),方便《TCP/IP 詳解 第2卷》的讀者跟蹤調(diào)試其代碼。以下是 Eclipse CDT 單步跟蹤的截圖。

Paste_Image.png

也可以用各種現(xiàn)成的工具來分析函數(shù)的調(diào)用關(guān)系:

Paste_Image.png

我在《談一談網(wǎng)絡(luò)編程學(xué)習(xí)經(jīng)驗》中說這本書的“代碼只能看,不能上機(jī)運(yùn)行,也不能改動試驗”如今不再成立了。
我在《關(guān)于 TCP 并發(fā)連接的幾個思考題與試驗》中用 TAP/TUN 作為自己寫的協(xié)議棧的對外接口,對 4.4BSD-Lite2 也可如法炮制,讓 20 年前的 TCP/IP 協(xié)議棧與現(xiàn)在的機(jī)器通信。除了與本機(jī)通信,還可以通過 NAT 轉(zhuǎn)發(fā),讓 4.4BSD-Lite2 連上現(xiàn)在的 Internet。(sudo iptables -t nat -A PREROUTING -p tcp --dport 2009 -i eth0 -j DNAT --to192.168.0.2:2009


轉(zhuǎn)自:
陳碩的 Blog

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,875評論 11 349
  • 1.這篇文章不是本人原創(chuàng)的,只是個人為了對這部分知識做一個整理和系統(tǒng)的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,389評論 6 174
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,255評論 0 7
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,846評論 0 4
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,605評論 0 6

友情鏈接更多精彩內(nèi)容