MarioTCP(超級馬里奧)開源項目,不僅高效,而且超級簡易好玩。也是優秀的 Linux C 開發學習工程。掌握全項目可成 Linux C 牛人;亦可通過 mario.c 示例快速入門。
極致性能測試數據
- 單機最大帶寬吞吐 1000M
- 最高 TCP 長連接 100 萬
- 每秒處理連接數 4 萬 (CPS),系統 load 極低
- 經完備測試,運行穩定、資源佔用極少
下載:SourceForge | CSDN | 51CTO
五步構建自定義業務 TCP 服務器
- 初始化 SERVER
SERVER* server = init_server(port, workernum, connnum, read_timeout, write_timeout);
workernum * connnum = 最大長連接數,單 worker 輕鬆支撐 10 萬連接。
- 實現並註冊業務邏輯
透過 regist_akg_func(uint16 id, FUNC_PTR func) 註冊。
ID 範圍 0-65535,封裝在 MarioTCP 協議中。
例:新增 "say_hello" 服務 → 定義 CMD → 實現函數解析請求、寫回響應 → 註冊。
- 啟動日誌線程
start_log_thread()
- 啟動服務器
start_server((void*)server);
架構亮點:為何超級高效
- 零分配零銷毀:啟動時初始化所有結構體與記憶體,運行期無銷毀、無回收(拿來即用、用完即可)。
- 單 Master Accept:測試證實多線程 Accept 極限下無優勢,單 Master 避免同步鎖開銷。
- 單一生產者-消費者無鎖通信:Master 分發連接、後續連接處理、業務邏輯、日誌系統全程無鎖。
- 每 Worker 獨立 Libevent 實例:單 Libevent 處理 10 萬長連接性能最大化,多 Worker 獨立實例開銷極小、性能極高。
百萬長連接、四萬 CPS 測試環境調優
- 系統最大文件數設為 unlimited
- TCP 記憶體核心參數調至 256M+
- 配置 15 個 IP,理論支撐 15 × (65535-1024) 連接
- 客戶端用 epoll/libevent,單進程 5 萬連接,20 客戶端進程 = 100 萬連接,每秒隨機斷開/新建 1000 連接並發包
- 服務端開啟 SYN_WAIT 重用,客戶端主動斷開避免端口堆積
Go On 1.0.0 待解決議題
- 協議優化:現有 HEAD(STX, PKGLEN, AKG_ID) + Data 格式,能否更簡化或無協議?
- 日誌系統重構:現系統過於死板、耦合架構。
- 業務邏輯穩定性:Worker 線程池固定、死線程不可重啟、Master 缺乏 Worker 存活監控,業務阻塞導致任務堆積。計劃抽象出監控、告警、自動恢復機制。
本文出自 MarioTCP 開源項目,作者馮建華 (JohnFong)。