Linux高性能網(wǎng)絡(luò)編程十談 | 九個(gè)C++的開源的網(wǎng)絡(luò)框架
github代碼地址:https://github.com/linkxzhou/mylib/tree/master/c%2B%2B/high_performance_server
為了大家簡(jiǎn)便測(cè)試,所以當(dāng)前項(xiàng)目使用 Bazel 構(gòu)建,減少一些庫(kù)的依賴,構(gòu)建步驟如下:
# ========== 安裝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
# ========== 構(gòu)建所有服務(wù)器
./build_all_bazel.sh
# 或使用 Bazel 直接構(gòu)建
bazel build //...
# 構(gòu)建特定服務(wù)器
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++ 標(biāo)準(zhǔn) | 特點(diǎn) | 代表的開源項(xiàng)目 |
libevent | 事件驅(qū)動(dòng) | C++11 | 跨平臺(tái)、輕量級(jí)、廣泛使用 | Memcached, Tor, Chromium, tmux |
libev | 事件驅(qū)動(dòng) | C++11 | 高性能、Linux 優(yōu)化 | Node.js (早期版本), PowerDNS, Varnish |
libuv | 事件驅(qū)動(dòng) | C++11 | Node.js 底層、跨平臺(tái) | Node.js, Julia, Luvit, pyuv |
Boost.Asio | 異步 I/O | C++11 | 功能豐富、標(biāo)準(zhǔn)化 | Beast (HTTP/WebSocket), cpp-netlib, Riak |
ACE | 面向?qū)ο?/p> | C++17 | 企業(yè)級(jí)、模式豐富 | TAO (CORBA), OpenDDS, JAWS Web Server |
Seastar | 無共享 | C++17 | 極高性能、現(xiàn)代設(shè)計(jì) | ScyllaDB, Redpanda, Seastar HTTP Server |
Wangle | 異步 | C++17 | Facebook 開源、Pipeline 架構(gòu) | Proxygen, McRouter, Facebook Services |
Proxygen | HTTP 專用 | C++17 | Facebook HTTP 庫(kù) | Facebook Web Services, Instagram API |
Mongoose | 嵌入式 | C++11 | 輕量級(jí)、易集成 | ESP32 項(xiàng)目, IoT 設(shè)備, 嵌入式 Web 服務(wù)器 |
性能對(duì)比
圖片
框架簡(jiǎn)介
1. libevent - 事件驅(qū)動(dòng)架構(gòu)
特點(diǎn):
- 跨平臺(tái)兼容性: 支持 Linux (epoll)、macOS (kqueue)、Windows (IOCP) 等多種平臺(tái)
- 多種 I/O 多路復(fù)用: 自動(dòng)選擇最優(yōu)的 I/O 機(jī)制 (epoll/kqueue/select)
- 緩沖事件處理: 內(nèi)置緩沖區(qū)管理,簡(jiǎn)化網(wǎng)絡(luò)編程
- HTTP 支持: 內(nèi)置 HTTP 服務(wù)器和客戶端功能
- 定時(shí)器支持: 高精度定時(shí)器和超時(shí)處理
- 線程安全: 支持多線程環(huán)境下的事件處理
- 內(nèi)存管理: 高效的內(nèi)存池和緩沖區(qū)管理
底層架構(gòu):
圖片
核心組件:
- event_base: 事件循環(huán)核心,管理所有事件
- evconnlistener: 連接監(jiān)聽器,處理新連接
- bufferevent: 緩沖事件處理,自動(dòng)管理讀寫緩沖區(qū)
- 回調(diào)函數(shù): echo_read_cb, echo_event_cb
- 平臺(tái)適配: 自動(dòng)選擇最優(yōu) I/O 多路復(fù)用機(jī)制
2. libev - 高性能事件循環(huán)
特點(diǎn):
- 極致性能: 專為高性能設(shè)計(jì),最小化系統(tǒng)調(diào)用開銷
- Linux 優(yōu)化: 深度優(yōu)化 epoll 性能,支持 Linux 特有功能
- 輕量級(jí)設(shè)計(jì): 代碼簡(jiǎn)潔,內(nèi)存占用極小
- 多種事件類型: 支持 I/O、定時(shí)器、信號(hào)、子進(jìn)程等事件
- 嵌套事件循環(huán): 支持事件循環(huán)的嵌套調(diào)用
- 高精度定時(shí)器: 基于紅黑樹的高效定時(shí)器實(shí)現(xiàn)
- 信號(hào)處理: 安全的異步信號(hào)處理機(jī)制
底層架構(gòu):
圖片
核心組件:
- ev_loop: 高性能事件循環(huán),支持多種后端
- ev_io: I/O 事件監(jiān)視器,監(jiān)控文件描述符
- ev_timer: 高精度定時(shí)器,基于紅黑樹實(shí)現(xiàn)
- accept_cb: 連接接受回調(diào),處理新連接
- client_cb: 客戶端數(shù)據(jù)處理回調(diào)
3. libuv - 跨平臺(tái)異步 I/O
特點(diǎn):
- Node.js 底層: Node.js 的核心依賴,經(jīng)過大規(guī)模生產(chǎn)驗(yàn)證
- 跨平臺(tái)統(tǒng)一: 統(tǒng)一的 API 抽象不同平臺(tái)的異步 I/O
- 線程池: 內(nèi)置線程池處理文件 I/O 和 CPU 密集任務(wù)
- 異步文件操作: 完整的異步文件系統(tǒng) API
- 進(jìn)程管理: 跨平臺(tái)的進(jìn)程創(chuàng)建和管理
- 網(wǎng)絡(luò)抽象: 高級(jí)網(wǎng)絡(luò) API,支持 TCP、UDP、管道
- 事件循環(huán): 單線程事件循環(huán) + 多線程工作池
底層架構(gòu):
圖片
核心組件:
- uv_loop_t: 跨平臺(tái)事件循環(huán),統(tǒng)一不同平臺(tái)的異步機(jī)制
- uv_tcp_t: TCP 句柄,封裝網(wǎng)絡(luò)連接
- uv_read_start: 開始異步讀取數(shù)據(jù)
- uv_write: 異步寫入數(shù)據(jù),支持批量寫入
- 線程池: 處理阻塞操作,避免阻塞主線程
4. Boost.Asio - 異步網(wǎng)絡(luò)編程
特點(diǎn):
- C++ 標(biāo)準(zhǔn)候選: 設(shè)計(jì)現(xiàn)代,可能成為 C++ 標(biāo)準(zhǔn)庫(kù)的一部分
- 類型安全: 強(qiáng)類型系統(tǒng),編譯時(shí)錯(cuò)誤檢查
- 協(xié)程支持: 支持 C++20 協(xié)程,簡(jiǎn)化異步編程
- 可擴(kuò)展性: 支持自定義 I/O 對(duì)象和協(xié)議
- SSL/TLS: 內(nèi)置 SSL/TLS 支持
- 定時(shí)器: 高精度定時(shí)器和截止時(shí)間
- 信號(hào)處理: 異步信號(hào)處理機(jī)制
底層架構(gòu):
圖片
核心組件:
- io_context: I/O 執(zhí)行上下文,管理異步操作
- tcp::acceptor: TCP 接受器,監(jiān)聽新連接
- session: 會(huì)話管理類,封裝連接生命周期
- 異步操作: async_accept, async_read_some, async_write
- 協(xié)程支持: C++20 協(xié)程集成
5. ACE - 自適應(yīng)通信環(huán)境
特點(diǎn):
- 企業(yè)級(jí)框架: 經(jīng)過大型企業(yè)系統(tǒng)驗(yàn)證的成熟框架
- 設(shè)計(jì)模式豐富: 實(shí)現(xiàn)了多種網(wǎng)絡(luò)編程設(shè)計(jì)模式
- 高度可配置: 支持編譯時(shí)和運(yùn)行時(shí)配置
- 跨平臺(tái): 支持 40+ 種操作系統(tǒng)和編譯器
- 面向?qū)ο? 完全面向?qū)ο蟮脑O(shè)計(jì)
- 組件化: 模塊化設(shè)計(jì),可按需使用
- 性能優(yōu)化: 針對(duì)高并發(fā)場(chǎng)景的優(yōu)化
底層架構(gòu):
圖片
核心組件:
- ACE_Reactor: 反應(yīng)器模式核心,支持多種實(shí)現(xiàn)
- ACE_Event_Handler: 事件處理器基類
- ACE_SOCK_Acceptor: 套接字接受器
- ACE_SOCK_Stream: 套接字流,封裝網(wǎng)絡(luò)通信
- 設(shè)計(jì)模式: Reactor、Proactor、Acceptor-Connector
6. Seastar - 無共享架構(gòu)
特點(diǎn):
- 無共享設(shè)計(jì): 每個(gè) CPU 核心獨(dú)立運(yùn)行,避免鎖競(jìng)爭(zhēng)
- 用戶態(tài)網(wǎng)絡(luò)棧: 繞過內(nèi)核,直接操作網(wǎng)絡(luò)硬件 (DPDK)
- 協(xié)程支持: 基于 future/promise 的協(xié)程模型
- 內(nèi)存管理: 自定義內(nèi)存分配器,減少內(nèi)存碎片
- CPU 親和性: 嚴(yán)格的 CPU 核心綁定
- 零拷貝: 最小化數(shù)據(jù)拷貝操作
- 現(xiàn)代 C++: 大量使用 C++14/17 特性
底層架構(gòu):
圖片
核心組件:
- app_template: 應(yīng)用程序模板,管理應(yīng)用生命周期
- server_socket: 服務(wù)器套接字,支持多核心
- connected_socket: 連接套接字,封裝網(wǎng)絡(luò)連接
- future<>: 異步操作結(jié)果,支持鏈?zhǔn)秸{(diào)用
- 無共享架構(gòu): 每核心獨(dú)立的內(nèi)存、網(wǎng)絡(luò)隊(duì)列、調(diào)度器
7. Wangle - Pipeline 架構(gòu)
特點(diǎn):
- Pipeline 設(shè)計(jì): 模塊化的請(qǐng)求處理管道
- Facebook 生產(chǎn): Facebook 內(nèi)部大規(guī)模使用
- 類型安全: 強(qiáng)類型的 Pipeline 組件
- 可組合性: 靈活的處理器組合
- 協(xié)議無關(guān): 支持多種網(wǎng)絡(luò)協(xié)議
- 負(fù)載均衡: 內(nèi)置負(fù)載均衡和連接池
- SSL/TLS: 完整的 SSL/TLS 支持
底層架構(gòu):
圖片
核心組件:
- ServerBootstrap: 服務(wù)器引導(dǎo)程序,配置服務(wù)器
- Pipeline: 處理管道,鏈?zhǔn)教幚碚?qǐng)求
- ByteToMessageDecoder: 字節(jié)到消息解碼器
- HandlerAdapter: 處理器適配器,連接不同類型的處理器
- IOBuf: 高效的緩沖區(qū)管理
8. Proxygen - HTTP 專用庫(kù)
特點(diǎn):
- HTTP 專用: 專為 HTTP/1.1 和 HTTP/2 優(yōu)化
- Facebook 開源: Facebook 內(nèi)部 HTTP 服務(wù)的基礎(chǔ)
- HTTP/2 支持: 完整的 HTTP/2 實(shí)現(xiàn),包括服務(wù)器推送
- 流式處理: 支持大文件的流式上傳下載
- 壓縮支持: 內(nèi)置 gzip、deflate 壓縮
- WebSocket: 完整的 WebSocket 支持
- 性能監(jiān)控: 內(nèi)置性能指標(biāo)和監(jiān)控
底層架構(gòu):
圖片
核心組件:
- HTTPServer: HTTP 服務(wù)器,支持 HTTP/1.1 和 HTTP/2
- RequestHandler: 請(qǐng)求處理器,處理 HTTP 請(qǐng)求生命周期
- RequestHandlerFactory: 處理器工廠,創(chuàng)建請(qǐng)求處理器
- ResponseBuilder: 響應(yīng)構(gòu)建器,構(gòu)建 HTTP 響應(yīng)
- HTTP/2 特性: 流復(fù)用、服務(wù)器推送、頭部壓縮
9. Mongoose - 嵌入式 Web 服務(wù)器
特點(diǎn):
- 輕量級(jí): 單文件實(shí)現(xiàn),易于集成
- 嵌入式友好: 適合資源受限的環(huán)境
- 多協(xié)議支持: HTTP、WebSocket、MQTT、CoAP
- 跨平臺(tái): 支持嵌入式系統(tǒng)、桌面、服務(wù)器
- 零依賴: 不依賴外部庫(kù)
- 事件驅(qū)動(dòng): 基于事件的異步處理
- 內(nèi)置功能: 文件服務(wù)、CGI、SSI 支持
底層架構(gòu):
圖片
核心組件:
- mg_mgr: 連接管理器,管理所有網(wǎng)絡(luò)連接
- mg_connection: 連接對(duì)象,封裝單個(gè)網(wǎng)絡(luò)連接
- mg_http_listen: HTTP 監(jiān)聽,啟動(dòng) HTTP 服務(wù)
- mg_http_reply: HTTP 響應(yīng),發(fā)送 HTTP 回復(fù)
- 多協(xié)議: HTTP、WebSocket、MQTT、CoAP 統(tǒng)一接口
參考
- libevent 官方文檔
- libev 官方文檔
- libuv 官方文檔
- Boost.Asio 文檔
- ACE 官方網(wǎng)站
- 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》