ssxrver
github地址: https://github.com/RandyLambert/ssxrver
_______. _______.___ ___ .______ ____ ____ _______ .______
/ | / |\ \ / / | _ \ \ \ / / | ____|| _ \
| (----` | (----` \ V / | |_) | \ \/ / | |__ | |_) |
\ \ \ \ > < | / \ / | __| | /
.----) | .----) | / . \ | |\ \----. \ / | |____ | |\ \----.
|_______/ |_______/ /__/ \__\ | _| `._____| \__/ |_______|| _| `._____|
ssxrver 是一个运行于 Linux 平台下的高性能高并发网络库,使用 C++17 进行编写,支持 TCP 和UDP 协议。
优势
- 使用了优化版 one-loop-per-thread + 细粒度锁 thread-pool 模型.
- 高性能高并发,压测数据高于 Nginx/1.14.2 与 Apache/2.4.28
- 主线程只进行 accept 操作通过 eventfd 进行事件分发,避免锁的竞争,IO 线程进行数据读写.
- 根据在不同场景下的分析,使用 epoll 的不同的多路复用方式,提高性能.
- 使用 RAII 的机制进行对象生命周期控制,所有内存分配操作使用智能指针,避免了内存泄露.
- 使用 Linux 内核提供的 timerfd 将定时事件和 IO 时间统一处理, 通过 C++11 标准库 std::chrono 和 std::priority_queue 实现定时器管理,实现纳秒级别定时任务.
- 使用非阻塞套接字,避免线程被单个连接阻塞.
- 封装 http 模块,简单操作就可配置出一个高性能 HTTP Server,采用 Ragel (有限状态机)进行 HTTP 请求解析,调高效率,支持 HTTP/1.0 , HTTP/1.1 的 GET、POST 请求,支持长连接.
- 封装高性能 buffer 类进行数据发送和接收.
- 文件发送使用 sendfile 零拷贝技术,提高文件发送性能.
- 封装数据库操作模块,可简单解析生成 MySQL 数据库对应 sql 语句,可配合细粒度锁 thread-pool 实现数据库连接池.
- 实现多缓冲区异步日志库,支持设立日志级别,日志滚动大小等功能.
- 使用 std::make_shared , std::make_unique , std:string_view , explicit , [[nodiscard]] , emplace_back 等 C++11 14 17语法新特性,提高性能.
- 使用统一风格的代码风格和命名规范,同时添加 10 余个编译参数来规范代码实现,提高代码质量和编译器优化可能性.
- 多处设计进行对象复用,减少某些对象频繁申请释放.
- 使用基于对象的编程思想,项目代码结构清晰明白,互相调用频繁的函数尽量放在一起,增加 CPU Cache命中率,模块之间松耦合,极易添加新功能模块.
- 使用单例模式,策略模式,适配器模式等设计模式,降低代码冗杂度,使实现代码实现更加优雅.
- 封装配置文件模块,使用 json 格式来快速进行配置.
- 可以通过配置文件来配置 CPU 亲和度,从而减少线程直接上下文切换次数,提高性能.
- 支持 UDP 协议.
开发环境
- 操作系统发型版本 : deepin v20.1 社区版(1030)
- 内核版本 : 5.4.70-amd64-desktop (64位)
- 编译器版本 : gcc 8.3
- 语言 : c++ 17
- cmake版本 : 3.11.2
- boost库版本 : 1.72
- 数据库版本 : MySQL 5.7.21-1