Linux高性能網絡編程十談 | 九個C++的開源的網絡框架
github代碼地址:https://github.com/linkxzhou/mylib/tree/master/c%2B%2B/high_performance_server
為了大家簡便測試,所以當前項目使用 Bazel 構建,減少一些庫的依賴,構建步驟如下:
# ========== 安裝bazel
# macOS
brew install bazel
# Ubuntu/Debian
sudo apt install apt-transport-https curl gnupg
curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor > bazel.gpg
sudo mv bazel.gpg /etc/apt/trusted.gpg.d/
echo"deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
sudo apt update && sudo apt install bazel
# CentOS/RHEL
sudo dnf copr enable vbatts/bazel
sudo dnf install bazel
# ========== 安裝依賴
# macOS
brew install libuv libevent libev boost
brew install folly wangle proxygen # 可選
# Ubuntu/Debian
sudo apt-get install libuv1-dev libevent-dev libev-dev libboost-all-dev
# CentOS/RHEL
sudo yum install libuv-devel libevent-devel libev-dev boost-devel
# ========== 構建所有服務器
./build_all_bazel.sh
# 或使用 Bazel 直接構建
bazel build //...
# 構建特定服務器
bazel build //ace:ace_echo_server
bazel build //libevent:libevent_echo_server
bazel build //boost_asio:boost_asio_echo_server
bazel build //seastar:seastar_echo_server
bazel build //libev:libev_echo_server
bazel build //libuv:libuv_echo_server
bazel build //mongoose:mongoose_echo_server
bazel build //proxygen:proxygen_echo_server
bazel build //wangle:wangle_echo_server
開源框架
框架 | 類型 | C++ 標準 | 特點 | 代表的開源項目 |
libevent | 事件驅動 | C++11 | 跨平臺、輕量級、廣泛使用 | Memcached, Tor, Chromium, tmux |
libev | 事件驅動 | C++11 | 高性能、Linux 優化 | Node.js (早期版本), PowerDNS, Varnish |
libuv | 事件驅動 | C++11 | Node.js 底層、跨平臺 | Node.js, Julia, Luvit, pyuv |
Boost.Asio | 異步 I/O | C++11 | 功能豐富、標準化 | Beast (HTTP/WebSocket), cpp-netlib, Riak |
ACE | 面向對象 | C++17 | 企業級、模式豐富 | TAO (CORBA), OpenDDS, JAWS Web Server |
Seastar | 無共享 | C++17 | 極高性能、現代設計 | ScyllaDB, Redpanda, Seastar HTTP Server |
Wangle | 異步 | C++17 | Facebook 開源、Pipeline 架構 | Proxygen, McRouter, Facebook Services |
Proxygen | HTTP 專用 | C++17 | Facebook HTTP 庫 | Facebook Web Services, Instagram API |
Mongoose | 嵌入式 | C++11 | 輕量級、易集成 | ESP32 項目, IoT 設備, 嵌入式 Web 服務器 |
性能對比
圖片
框架簡介
1. libevent - 事件驅動架構
特點:
- 跨平臺兼容性: 支持 Linux (epoll)、macOS (kqueue)、Windows (IOCP) 等多種平臺
- 多種 I/O 多路復用: 自動選擇最優的 I/O 機制 (epoll/kqueue/select)
- 緩沖事件處理: 內置緩沖區管理,簡化網絡編程
- HTTP 支持: 內置 HTTP 服務器和客戶端功能
- 定時器支持: 高精度定時器和超時處理
- 線程安全: 支持多線程環境下的事件處理
- 內存管理: 高效的內存池和緩沖區管理
底層架構:
圖片
核心組件:
- event_base: 事件循環核心,管理所有事件
- evconnlistener: 連接監聽器,處理新連接
- bufferevent: 緩沖事件處理,自動管理讀寫緩沖區
- 回調函數: echo_read_cb, echo_event_cb
- 平臺適配: 自動選擇最優 I/O 多路復用機制
2. libev - 高性能事件循環
特點:
- 極致性能: 專為高性能設計,最小化系統調用開銷
- Linux 優化: 深度優化 epoll 性能,支持 Linux 特有功能
- 輕量級設計: 代碼簡潔,內存占用極小
- 多種事件類型: 支持 I/O、定時器、信號、子進程等事件
- 嵌套事件循環: 支持事件循環的嵌套調用
- 高精度定時器: 基于紅黑樹的高效定時器實現
- 信號處理: 安全的異步信號處理機制
底層架構:
圖片
核心組件:
- ev_loop: 高性能事件循環,支持多種后端
- ev_io: I/O 事件監視器,監控文件描述符
- ev_timer: 高精度定時器,基于紅黑樹實現
- accept_cb: 連接接受回調,處理新連接
- client_cb: 客戶端數據處理回調
3. libuv - 跨平臺異步 I/O
特點:
- Node.js 底層: Node.js 的核心依賴,經過大規模生產驗證
- 跨平臺統一: 統一的 API 抽象不同平臺的異步 I/O
- 線程池: 內置線程池處理文件 I/O 和 CPU 密集任務
- 異步文件操作: 完整的異步文件系統 API
- 進程管理: 跨平臺的進程創建和管理
- 網絡抽象: 高級網絡 API,支持 TCP、UDP、管道
- 事件循環: 單線程事件循環 + 多線程工作池
底層架構:
圖片
核心組件:
- uv_loop_t: 跨平臺事件循環,統一不同平臺的異步機制
- uv_tcp_t: TCP 句柄,封裝網絡連接
- uv_read_start: 開始異步讀取數據
- uv_write: 異步寫入數據,支持批量寫入
- 線程池: 處理阻塞操作,避免阻塞主線程
4. Boost.Asio - 異步網絡編程
特點:
- C++ 標準候選: 設計現代,可能成為 C++ 標準庫的一部分
- 類型安全: 強類型系統,編譯時錯誤檢查
- 協程支持: 支持 C++20 協程,簡化異步編程
- 可擴展性: 支持自定義 I/O 對象和協議
- SSL/TLS: 內置 SSL/TLS 支持
- 定時器: 高精度定時器和截止時間
- 信號處理: 異步信號處理機制
底層架構:
圖片
核心組件:
- io_context: I/O 執行上下文,管理異步操作
- tcp::acceptor: TCP 接受器,監聽新連接
- session: 會話管理類,封裝連接生命周期
- 異步操作: async_accept, async_read_some, async_write
- 協程支持: C++20 協程集成
5. ACE - 自適應通信環境
特點:
- 企業級框架: 經過大型企業系統驗證的成熟框架
- 設計模式豐富: 實現了多種網絡編程設計模式
- 高度可配置: 支持編譯時和運行時配置
- 跨平臺: 支持 40+ 種操作系統和編譯器
- 面向對象: 完全面向對象的設計
- 組件化: 模塊化設計,可按需使用
- 性能優化: 針對高并發場景的優化
底層架構:
圖片
核心組件:
- ACE_Reactor: 反應器模式核心,支持多種實現
- ACE_Event_Handler: 事件處理器基類
- ACE_SOCK_Acceptor: 套接字接受器
- ACE_SOCK_Stream: 套接字流,封裝網絡通信
- 設計模式: Reactor、Proactor、Acceptor-Connector
6. Seastar - 無共享架構
特點:
- 無共享設計: 每個 CPU 核心獨立運行,避免鎖競爭
- 用戶態網絡棧: 繞過內核,直接操作網絡硬件 (DPDK)
- 協程支持: 基于 future/promise 的協程模型
- 內存管理: 自定義內存分配器,減少內存碎片
- CPU 親和性: 嚴格的 CPU 核心綁定
- 零拷貝: 最小化數據拷貝操作
- 現代 C++: 大量使用 C++14/17 特性
底層架構:
圖片
核心組件:
- app_template: 應用程序模板,管理應用生命周期
- server_socket: 服務器套接字,支持多核心
- connected_socket: 連接套接字,封裝網絡連接
- future<>: 異步操作結果,支持鏈式調用
- 無共享架構: 每核心獨立的內存、網絡隊列、調度器
7. Wangle - Pipeline 架構
特點:
- Pipeline 設計: 模塊化的請求處理管道
- Facebook 生產: Facebook 內部大規模使用
- 類型安全: 強類型的 Pipeline 組件
- 可組合性: 靈活的處理器組合
- 協議無關: 支持多種網絡協議
- 負載均衡: 內置負載均衡和連接池
- SSL/TLS: 完整的 SSL/TLS 支持
底層架構:
圖片
核心組件:
- ServerBootstrap: 服務器引導程序,配置服務器
- Pipeline: 處理管道,鏈式處理請求
- ByteToMessageDecoder: 字節到消息解碼器
- HandlerAdapter: 處理器適配器,連接不同類型的處理器
- IOBuf: 高效的緩沖區管理
8. Proxygen - HTTP 專用庫
特點:
- HTTP 專用: 專為 HTTP/1.1 和 HTTP/2 優化
- Facebook 開源: Facebook 內部 HTTP 服務的基礎
- HTTP/2 支持: 完整的 HTTP/2 實現,包括服務器推送
- 流式處理: 支持大文件的流式上傳下載
- 壓縮支持: 內置 gzip、deflate 壓縮
- WebSocket: 完整的 WebSocket 支持
- 性能監控: 內置性能指標和監控
底層架構:
圖片
核心組件:
- HTTPServer: HTTP 服務器,支持 HTTP/1.1 和 HTTP/2
- RequestHandler: 請求處理器,處理 HTTP 請求生命周期
- RequestHandlerFactory: 處理器工廠,創建請求處理器
- ResponseBuilder: 響應構建器,構建 HTTP 響應
- HTTP/2 特性: 流復用、服務器推送、頭部壓縮
9. Mongoose - 嵌入式 Web 服務器
特點:
- 輕量級: 單文件實現,易于集成
- 嵌入式友好: 適合資源受限的環境
- 多協議支持: HTTP、WebSocket、MQTT、CoAP
- 跨平臺: 支持嵌入式系統、桌面、服務器
- 零依賴: 不依賴外部庫
- 事件驅動: 基于事件的異步處理
- 內置功能: 文件服務、CGI、SSI 支持
底層架構:
圖片
核心組件:
- mg_mgr: 連接管理器,管理所有網絡連接
- mg_connection: 連接對象,封裝單個網絡連接
- mg_http_listen: HTTP 監聽,啟動 HTTP 服務
- mg_http_reply: HTTP 響應,發送 HTTP 回復
- 多協議: HTTP、WebSocket、MQTT、CoAP 統一接口
參考
- libevent 官方文檔
- libev 官方文檔
- libuv 官方文檔
- Boost.Asio 文檔
- ACE 官方網站
- Seastar 官方文檔
- Wangle GitHub
- Proxygen GitHub
- Mongoose 官方文檔
- https://docs.seastar.io/master/tutorial.html
- https://zhuanlan.zhihu.com/p/30738569
- https://blog.csdn.net/Rong_Toa/article/details/108193340
- https://www.cnblogs.com/ahfuzhang/p/15824213.html《Memory Barriers: a Hardware View for Software Hackers》