## 项目概述
一个基于 C++ 的 Linux 高性能 Web 服务器,采用主从多 Reactor 架构 + Epoll IO 多路复用 + 模拟 Proactor 事件处理模型,使用时间轮定时器管理定时,支持 HTTP GET/POST 请求处理与 MySQL 数据库交互。
## 构建与运行
```bash
# 克隆仓库
git clone git@github.com:c1y1k/tinywebserver.git
cd tinywebserver
# 构建
mkdir build && cd build
cmake ..
make
# 运行
./server# 高性能多 Reactor WebServer(基于 C++)
> 本项目基于 [qinguoyi/TinyWebServer](https://github.com/qinguoyi/TinyWebServer) 进行深度改造与性能优化,
> 定位并修复多项高并发稳定性缺陷,QPS 提升 **300%**。
## 核心特性
### 架构设计
- **主从多 Reactor**:MainReactor 通过 Epoll 监听 `listenfd`,Round-Robin 分发连接到 SubReactor
- **模拟 Proactor**:SubReactor 提前读取 socket 数据到连接对象,工作线程直接处理,减少 IO 等待
- **线程池**:工作线程池处理业务逻辑,关注锁粒度与上下文切换开销
### 连接管理
- **O(1) 时间轮定时器**:替代传统轮询方案,利用 `epoll_wait` 心跳触发过期检测,无额外定时器开销
- **RAII 连接池**:`ConnectionRAII` 对象自动管理 MySQL 连接获取与归还,互斥锁 + 条件变量保证线程安全
### 稳定性
- 定位短连接洪水后服务器 **"假死"** 根因:超时回调未释放 socket fd 及 fd 计数器
- 通过 Valgrind 内存检测 + 日志埋点逐步定位,修复后 **10,000 并发稳定运行 30 分钟**
### 性能优化
- 火焰图定位核心瓶颈:`sys_munmap`(48.75%)+ `native_send_call_func_ipi`(20.24%)
- 根因定位:多线程并发 `mmap/munmap` 文件映射导致全核 **TLB shootdown**
- 优化方案:`mmap+writev` → **sendfile 零拷贝**
- 优化结果:
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| `sys_munmap` 开销 | 48.75% | 0% | 完全消除 |
| QPS | 18,700 | 74,868 | **+300%** |
| 新瓶颈 | — | `sem_post/futex`(31%) | 指向无锁化改造方向 |
---
## 技术栈
| 分类 | 技术 |
|------|------|
| 语言 | C++(RAII、智能指针、移动语义) |
| IO 模型 | Epoll ET/LT、非阻塞 IO |
| 事件模型 | Reactor + Proactor |
| 并发 | 多线程、互斥锁、条件变量、信号量 |
| 数据库 | MySQL(RAII 连接池) |
| 构建 | CMake / Makefile |
| 调试 | GDB(崩溃/死锁定位)、Valgrind(内存泄漏检测) |
| 压测 | wrk |
| 性能分析 | perf + 火焰图(FlameGraph) |
| 版本控制 | Git |
---