origin:
在今年的 bsdcan2014 會議上, patrick kelsey 介紹了把 freebsd 9.x 的 tcp/ip 協議棧移植到了使用者態(slides, github.com/pkelsey/libuinet),並用於 wanproxy 專案。在使用者態執行 tcp/ip 協議棧意味著併發 tcp 連線不再占用系統檔案數,只佔記憶體,解決了 c1000k 的一大瓶頸,核心只要提供乙個收發網路 packet 的介面就行(例如netmap)。
核心的網路協議棧強調通用性,主要是為吞吐量優化(效能指標通常是 mb/s 或 packets per second),順帶兼顧大量併發連線。為了支援 c1000k,要調整核心引數讓每個連線少佔資源,這與核心**的設計初衷是違背的。
使用者態協議棧捅破了這層窗戶紙,可以根據應用的特點來剪裁協議棧功能。優化也更直接,不再是調黑盒引數組合,而是直接上 profiling,根據結果修改應用程式和協議棧的**。
使用者態協議棧的吞吐量比不上核心,不過對 c1000k 的應用場合(例如 comet)應該不成問題。
我用 muduo 做了一次 c1000k 的實驗,用的是傳統方案,沒有用 libuinet。在一台 16gb 記憶體的 dell ws490 舊工作站上建立了 50萬個 tcp 連線,提供 echo 服務。系統可用記憶體減少了 5286mib,即每個連線 10.8kib(其中服務程序占用了 1421mib 記憶體,即每個連線 2.9kib,其餘 8kib 左右是核心協議棧的開銷)。客戶端是一台 8gb 記憶體的 i5-2500,記憶體消耗也是 5gb 多,因此這次實驗只試到了 c500k。客戶機繫結了 10 個 ip,每個 ip 上發出 5 萬 tcp 連線,執行 pingpong 協議,每個連線輪流收發 64 位元組的訊息。測得 qps 大約是 11k,伺服器的 cpu 佔用率約為 60%(單執行緒)。profile 顯示 cpu 的主要開銷在核心中,我對這個結果基本滿意。
受 libuinet 啟發,我把 4.4bsd-lite2 的網路協議棧也移植到了 linux 使用者態(github.com/chenshuo/4.4bsd-lite2),方便《tcp/ip 詳解 第2卷》的讀者跟蹤除錯其**。以下是 eclipse cdt 單步跟蹤的截圖。
也可以用各種現成的工具來分析函式的呼叫關係:
我在《談一談網路程式設計學習經驗》中說這本書的「**只能看,不能上機執行,也不能改動試驗」如今不再成立了。
我在《關於 tcp 併發連線的幾個思考題與試驗》中用 tap/tun 作為自己寫的協議棧的對外介面,對 4.4bsd-lite2 也可如法炮製,讓 20 年前的 tcp/ip 協議棧與現在的機器通訊。除了與本機通訊,還可以通過 nat **,讓 4.4bsd-lite2 連上現在的 internet。(sudo iptables -t nat -a prerouting -p tcp --dport 2009 -i eth0 -j dnat --to192.168.0.2:2009)
LINUX效能調優 C10K,C1000K
c10k 1999年由dan kegel 那時的伺服器執行著linux2.2系統,32位系統,記憶體很少 2g 千兆網絡卡。怎麼在這樣的系統中支援併發 1 萬的請求呢?先來計算一下 最大每個連線的記憶體 2gb 10000 200kb 最大每個連線的頻寬 1000mbit 10000 100bit ...
Loongson 2K1000B IRQ驅動分析
龍芯2k1000b soc目前主要用在2k pc樣機和龍芯派上。龍芯派2代日前已經發布,將pcie等介面引出,採用了固態硬碟作為主儲存,比先前sd卡或者usb啟動速度和穩定性均有所提高,只是暫時還不知道採用的什麼核心版本。本文簡單分析一下龍芯派的irq驅動。本文基於龍芯派 1代 3.10.84核心版...
C語言 題目1000 計算a b
時間限制 1 秒記憶體限制 32 兆特殊判題 否提交 43010解決 18542題目描述 求整數a,b的和。輸入 測試案例有多行,每行為a,b的值。輸出 輸出多行,對應a b的結果。樣例輸入 1 24 5 6 9樣例輸出 39 15九度online judge測試題 看到這題的第一反應,我要怎麼連續...