一个生产级 C++ 高性能 WebServer,支持静态文件服务和 AI 推理网关:
- 页面:
GET /predict.html - 预测接口:
POST /api/predict(Body 为数字字符串,例如50)
| 特性 | 实现 | 优势 |
|---|---|---|
| IO 多路复用 | Epoll (ET+ONESHOT) | 吞吐高,避免竞态 |
| 并发模型 | Reactor + 线程池 | 主线程不阻塞,可支持 10K+ 连接 |
| 零拷贝传输 | mmap + writev | 响应头+文件一次 syscall,减少 2 倍拷贝 |
| 连接管理 | 堆定时器 (O(log n)) | 自动清除超时连接,心跳延长 |
| AI 集成 | ONNX Runtime | 端到端 PyTorch → C++ 推理网关 |
| 异步日志 | 双缓冲队列 + 后台线程 | 日志 IO 不阻塞业务线程,按日期自动分割 |
| 配置管理 | 环境变量 + .env | 符合 12-Factor,避免硬编码密码 |
测试工具:wrk | 测试时长:每组 10s
最新回归时间:2026-03-21(串行压测,避免并发压测互相干扰)
| 并发模型 | QPS | 平均延迟 | 最大延迟 | 吞吐量 | 异常 |
|---|---|---|---|---|---|
| 4 线程 / 500 连接 | 32,699 | 15.23ms | 20.19ms (P99) | 47.43 MB/s | 0 |
| 8 线程 / 1000 连接 | 33,464 | 29.68ms | 36.50ms (P99) | 48.54 MB/s | 0 |
静态服务稳定在 3.2万~3.4万 QPS,1000 并发下保持零 socket error
| 并发模型 | QPS | 平均延迟 | 最大延迟 | 吞吐量 |
|---|---|---|---|---|
| 4 线程 / 100 连接 | 32,276 | 2.69ms | 3.81ms (P99) | 3.29 MB/s |
推理接口稳定在 3.2万+ QPS,socket error 为 0
- Linux / WSL
- CMake + g++
- MySQL(本地可连)
- ONNX Runtime 动态库(本项目默认用本地路径)
✅ 已实现的安全加固:
- SIGPIPE / SIGTERM / SIGINT 优雅处理(防崩溃)
- 请求体大小限制(防 OOM 攻击,默认 1MB)
- 并发连接数限制(防资源耗尽)
- 连接超时回收(缓解慢连接占用)
- 路径规范化检查(防路径遍历)
服务启动时会读取以下环境变量:
MYSQL_USER(默认root)MYSQL_PASSWORD(默认空)MYSQL_DB(默认test)SERVER_PORT(默认8080)SERVER_SRC_DIR(默认/home/wjh/MyWebServer)MODEL_PATH(默认/home/wjh/MyWebServer/test_model.onnx)
示例:
export MYSQL_USER=wjh
export MYSQL_PASSWORD='你的密码'
export MYSQL_DB=test
export SERVER_PORT=8080
export SERVER_SRC_DIR=/home/wjh/MyWebServer
export MODEL_PATH=/home/wjh/MyWebServer/test_model.onnx推荐一条命令启动(自动读取 .env):
cd ~/MyWebServer
./run.sh手动方式:
cd ~/MyWebServer/build
cmake ..
make
./server启动后访问:
- 页面:
http://127.0.0.1:8080/predict.html - 优雅关闭:按
Ctrl+C或kill -TERM <pid>(自动完成连接生命周期)
# 静态文件服务
curl http://127.0.0.1:8080/predict.html
# AI 推理接口
curl -X POST --data "50" http://127.0.0.1:8080/api/predict# 安装 wrk
sudo apt-get install wrk
# 静态文件压测 (GET)
wrk -t4 -c500 -d10s --latency --timeout 10s http://127.0.0.1:8080/predict.html
# AI 推理压测 (POST)
wrk -t4 -c100 -d10s --latency --timeout 10s -s post.lua http://127.0.0.1:8080/api/predict
# post.lua 内容:
# wrk.method = "POST"
# wrk.headers["Content-Type"] = "text/plain"
# wrk.body = "50"# 查看进程
pgrep -af server
# 查看端口监听
ss -ltnp | grep 8080
# 杀死服务
pkill -f "MyWebServer/build/server"已通过 .gitignore 忽略以下本地/敏感内容:
.venv/.env/.env.*build/log//*.logonnxruntime/test_model.onnx*
主线程 (Main Reactor)
|
Epoll(ET) -- 监听 listenFd
|
+-------+--------+
| |
新连接 活跃连接 (EPOLLIN/EPOLLOUT/EPOLLERR)
| |
加入定时器 丢到线程池执行
|
+--------+--------+--------+
| | | |
Worker Worker Worker Worker (线程池)
| | | |
读HTTP 解析请求 生成响应 writev 零拷贝
|
mmap + iov
(response header + file)
所有线程 --LOG_INFO/WARN/ERROR--> [有界阻塞队列] --> 后台写盘线程 --> log/YYYY_MM_DD.log
| 模块 | 职责 | 关键设计 |
|---|---|---|
| WebServer | 主框架,事件分派 | Epoll + ONESHOT + 非阻塞 |
| HttpConn | HTTP 解析和响应 | 简易状态机,mmap,writev |
| HeapTimer | 连接超时管理 | 堆+hash,O(log n) 调整 |
| ThreadPool | 异步任务执行 | 生产者-消费者,完美转发 |
| Buffer | 数据缓冲 | readPos/writePos,readv |
| SqlConnPool | DB 连接复用 | 单例+信号量+互斥,线程安全 |
| AIEngine | ONNX 推理 | 单例 + Session 池并发推理 |
| Log | 异步日志 | 有界阻塞队列 + 后台写盘线程,四级日志 |
- 零拷贝:文件通过 mmap 映射,不进用户空间;writev 一次 syscall 完成响应头+文件
- ET 模式:减少 epoll_wait 通知次数;+ONESHOT 防并发竞态
- 定时器:堆+hash 结构,O(log n) 调整;自动清除僵尸连接
- 线程池:避免"一线程一连接"爆炸;完美转发减少拷贝
- 异步日志:有界阻塞队列背压,后台单线程顺序写盘;日志 IO 完全不阻塞业务路径
- 推理并发化:AIEngine 使用 Session 池并发推理,去除全局串行瓶颈
- 监听强化:启用 SO_REUSEPORT,listen backlog 使用系统上限(当前 4096)
30秒版本:
这是一个高性能 WebServer,用 Epoll(ET) + 线程池 Reactor 架构,wrk 压测静态接口稳定 3.2万+ QPS(500 并发),1000 并发仍保持 3.3万+ QPS。核心亮点是零拷贝(mmap+writev)、线程安全堆定时器(mutex 保护)、异步日志(有界阻塞队列+后台写盘)、SIGTERM 优雅关闭。集成 ONNX Runtime 并使用 Session 池并发推理,推理接口吞吐 3.2万+ QPS。
扩展版:
项目从网络编程(Epoll)、并发(线程池)、数据结构(堆定时器)、系统优化(零拷贝)、异步日志(有界队列+后台写盘)多个维度展示工程能力。特别是 ET 模式、ONESHOT、mmap+writev 等细节,体现了对性能的执着。安全方面补了 SIGPIPE/SIGTERM、请求体限制、请求体严格校验、连接池失败回滚与幂等销毁等生产级特性。经 wrk 压测验证,静态接口 500 并发 3.2万+ QPS、1000 并发 3.3万+ QPS,AI 推理 3.2万+ QPS,均实现零 socket error。