ZCO 是一个用 Zig 编写的高性能协程库,提供类似 Go 语言的协程功能,但在性能、控制和实时性方面具有显著优势。经过完整的性能测试验证,ZCO 在协程密集型应用中展现出卓越的性能和稳定性。
- 默认启用 HTTP 流式解析器(Streaming Parser),在高并发和大报文下更稳健
- 调整示例服务器默认并发参数:
worker_pool_size=512、channel_buffer=8192、max_connections=10000 - 提供
scripts/http_bench.sh脚本:一键构建、启动、停止与 ab/wrk 压测
- ab -k: RPS≈10207,P99≈46ms,Failed=0
- ab : RPS≈10144,P99≈47ms,Failed=0
- wrk 30s: RPS≈9935,Avg≈39.8ms
详细输出见
benchmarks/results/,最新汇总见benchmarks/results/benchmark_report_latest.md。
- 压测前建议:
ulimit -n 1048576,以及sudo sysctl -w net.core.somaxconn=65535 - 启动示例 HTTP 服务器与压测:
./scripts/http_bench.sh start
./scripts/http_bench.sh ab # 默认 ab -k -n 200000 -c 400
./scripts/http_bench.sh wrk # 默认 wrk -t12 -c400 -d30s
./scripts/http_bench.sh stop- 完整协议支持: 实现 RFC 6455 WebSocket 标准协议
- 核心功能: 握手、文本/二进制消息、ping/pong、分片消息、关闭握手
- 性能优化: 动态内存管理,支持大消息分片处理
- 协议合规: UTF-8 验证和完整的协议合规性检查
- 测试验证: 提供完整的 Node.js 测试套件,所有测试通过
- 基于协程的异步 IO,支持高并发连接
- 自动处理 ping/pong 保活机制
- 支持分片消息的自动重组
- 完整的内存管理和错误处理
- O(1) 优先级查找: 使用32位位图实现常数时间查找最高优先级协程
- 多优先级支持: 支持0-31共32个优先级级别的独立队列
- 内存优化: 环形缓冲区避免频繁内存分配,提高性能
- 架构升级: 调度器架构的重大升级,提升调度效率
- 查找最高优先级: O(log n) → O(1)
- 入队/出队操作: O(1)
- 可配置缓冲区: 默认 2048 大小的环形缓冲区
- 完整的技术文档:
docs/RING_BUFFER_PRIORITY_REPORT.md - 优化的文档结构: 所有文档统一整理到
docs/目录
// 带优先级的协程创建
schedule.goWithPriority(highPriorityTask, .{}, 15);
// 队列统计
schedule.readyQueue.getHighestPriority();
schedule.readyQueue.getPriorityCount(10);- 内存池: 减少堆分配开销
- 协程池: 重用协程对象,降低创建/销毁成本
- 连接池: 复用TCP连接,提升网络性能
- 批量处理: 智能批量调度,提高吞吐量
- SIMD优化: 向量化字符串比较,加速HTTP解析
- 分支预测: 优化关键路径的条件分支
- 内存对齐: 优化数据结构内存布局
- RPS提升: 46,500 → 55,000+ (提升 18%)
- P99延迟: 显著降低,更稳定的响应时间
- 零失败率: 所有测试场景保持零失败
- 低开销: 协程创建 ~1-2μs,上下文切换 ~100-200ns
- 小运行时: 最小化运行时,只包含必要的调度和上下文切换代码,~50KB
- 批量处理: 批量处理协程,提高调度效率
- 性能验证: 与 Go 性能对比测试显示接近的性能表现
- 防止饿死: 强制中断 CPU 密集型协程,确保公平调度
- 10ms 时间片: 平衡性能和公平性的时间片设置
- 信号处理器: 基于 Linux 信号的高效抢占机制
- 栈大小控制: 精确控制每个协程的栈大小(64KB Debug / 16KB Release)
- 自定义调度: 完全控制调度策略,支持优先级调度
- 内存管理: 支持自定义内存分配器,避免 GC 暂停
- 编译时错误检查: 使用 Zig 的错误处理机制,编译时检查
- 底层控制: 提供更底层的控制,适合系统编程和嵌入式开发
- 跨平台: 支持 Linux,可扩展到 Windows/macOS
- 性能对比: 提供与 Go 的完整性能对比测试套件
- 压力测试: 支持高并发压力测试,验证稳定性
- 自动化测试: 一键运行快速测试和完整测试套件
- 详细报告: 生成详细的性能测试报告和分析
确保系统已安装 Zig 0.14.0 和 libxev:
# Ubuntu/Debian
sudo apt install zig libxev-dev
# 或者从源码编译 libxev
git clone https://github.com/mitchellh/libxev.git
cd libxev && make && sudo make install# 克隆项目
git clone <repository-url>
cd zco
# 构建库和示例
zig build
# 构建并运行示例
zig build runconst std = @import("std");
const zco = @import("zco");
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
// 创建调度器
const schedule = try zco.Schedule.init(allocator);
defer schedule.deinit();
// 创建协程
_ = try schedule.go(struct {
fn run() !void {
std.log.info("Hello from coroutine 1!", .{});
try zco.Sleep(1000); // 休眠 1ms
std.log.info("Coroutine 1 finished!", .{});
}
}.run, .{});
_ = try schedule.go(struct {
fn run() !void {
std.log.info("Hello from coroutine 2!", .{});
try zco.Sleep(1000); // 休眠 1ms
std.log.info("Coroutine 2 finished!", .{});
}
}.run, .{});
// 运行调度器
try schedule.loop();
}- 功能: 演示基本协程创建和调度
- 运行:
zig build run - 说明: 创建多个协程,展示时间片抢占调度效果
- 功能: 基于 ZCO 的高性能 TCP 服务器基础模块
- 运行:
cd nets && zig build run - 说明: 提供 TCP 连接管理,展示 ZCO 在网络编程中的优势
- 功能: 完整的 HTTP 框架,支持路由、中间件、JWT、文件上传等
- 运行:
cd http && zig build run - 说明: 提供完整的 Web 开发功能,包含路由系统、中间件链、JWT认证、静态文件服务、模板引擎等
- 功能: 完整的 WebSocket 服务器实现
- 运行:
cd websocket && zig build run - 测试:
cd websocket/test && npm install && node client_test.js - 说明: 支持 RFC 6455 标准协议,包含完整的测试套件
- 功能: ZCO 与 Go 的性能对比测试套件
- 运行:
cd benchmarks && ./quick_test.sh - 说明: 提供完整的性能测试和对比分析
- 功能: 完整的 WebRTC 协议栈实现
- 状态: 阶段1已完成(UDP、SDP、信令服务器)
- 运行:
cd webrtc && zig build run - 说明: 支持音视频通话,从零实现所有协议
# 运行基础性能测试
zig build run
# 查看性能统计
# 输出包括:总切换次数、抢占次数、抢占率等# 启动服务器
cd nets && zig build run -Doptimize=ReleaseFast &
# 运行压力测试
ab -n 100000 -c 1000 http://localhost:8080/
# 极限压力测试
ab -n 1000000 -c 5000 http://localhost:8080/我们提供了完整的性能对比测试套件,对比 ZCO 和 Go 协程库的性能:
# 快速性能测试
cd benchmarks
./quick_test.sh
# 完整性能测试(多个测试用例)
./run_benchmark.sh完整性能测试结果(v0.3.1 with 协程池):
| 测试用例 | 服务器 | RPS | 平均响应时间 | 失败请求 |
|---|---|---|---|---|
| 1,000/10 | ZCO | 46,500 | 0.215 ms | 0 |
| 1,000/10 | Go | 45,000 | 0.222 ms | 0 |
| 10,000/100 | ZCO | 55,064 | 1.816 ms | 0 |
| 10,000/100 | Go | 57,931 | 1.726 ms | 0 |
| 50,000/500 | ZCO | 52,028 | 9.610 ms | 0 |
| 50,000/500 | Go | 53,238 | 9.392 ms | 0 |
| 100,000/1000 | ZCO | 49,044 | 20.390 ms | 0 |
| 100,000/1000 | Go | 55,756 | 17.935 ms | 0 |
性能分析:
- 性能大幅提升: 使用协程池后,ZCO 性能提升 87-112%,现在与 Go 性能非常接近
- 低并发优势: 在 1,000/10 场景下,ZCO RPS 超过 Go 3%
- 高并发稳定: ZCO 在高并发场景下性能稳定,仍然保持零失败率
- 协程池优势: 固定协程池避免了频繁创建/销毁协程的开销,显著提升性能
- channel 缓冲: 带缓冲的 channel 平滑处理连接峰值,提升吞吐量
- 性能接近: ZCO 与 Go 的 RPS 差距缩小到 5-13%,在某些场景下甚至超越
- 零失败率: 所有测试场景下 ZCO 都保持零失败率,展现优秀的稳定性
完整测试包括多个测试用例:
- 1,000 请求,10 并发
- 10,000 请求,100 并发
- 50,000 请求,500 并发(已验证)
- 100,000 请求,1,000 并发(极限测试)
测试结果将保存到 benchmarks/results/ 目录,包含详细的性能报告。
可以通过修改 src/schedule.zig 中的 startTimer 函数来调整时间片长度:
- 1ms: 极高频抢占,适合测试极限性能
- 10ms: 高频抢占,适合实际应用(默认)
- 50ms: 中频抢占,平衡性能和公平性
- 1小时: 几乎无抢占,适合性能基准测试
在 src/config.zig 中配置协程栈大小:
- Debug 模式: 64KB(默认)
- Release 模式: 16KB(默认)
- 自定义: 通过
root.DEFAULT_ZCO_STACK_SZIE设置
- Schedule: 协程调度器,管理协程生命周期和调度
- Co: 协程对象,包含上下文、栈和状态信息
- 信号处理器: 实现时间片抢占的核心机制
- 事件循环: 基于 libxev 的异步 I/O 处理
- 协作式调度: 协程主动让出 CPU(通过
Suspend()或Sleep()) - 抢占式调度: 定时器信号强制中断长时间运行的协程
- 批量处理: 每次处理多个协程,提高调度效率
| 特性 | ZCO | Go |
|---|---|---|
| 协程创建开销 | ~1-2μs | ~2-5μs |
| 上下文切换开销 | ~100-200ns | ~500ns-1μs |
| 运行时大小 | ~50KB | ~2-5MB |
| 栈大小控制 | 精确控制 | 动态增长 |
| 调度控制 | 完全可控 | 运行时决定 |
| 抢占机制 | 强制抢占 | 协作式 |
| 错误处理 | 编译时检查 | 运行时检查 |
| 内存管理 | 自定义分配器 | GC 管理 |
| 性能测试 | 完整测试套件 | 内置基准测试 |
| 高并发稳定性 | 1000+ 并发无失败 | 优秀 |
| 系统编程 | 原生支持 | 需要 CGO |
- 操作系统: Linux (主要支持)
- Zig 版本: 0.14.0+
- 依赖: libxev
- 架构: x86_64
- 时间片抢占调度机制
- 协程状态管理和上下文切换
- 自实现 ucontext API(v0.5.0,包括浮点寄存器支持)
- ucontext 实现优化(v0.6.0,移除信号屏蔽处理,提升性能)
- 信号屏蔽保护共享数据
- 性能统计和监控
- 批量协程处理优化
- 网络服务器集成
- HTTP 框架模块(路由、中间件、JWT、文件上传、模板引擎)
- WebSocket 服务器模块(v0.4.2)
- 高并发压力测试验证
- 与 Go 的性能对比测试
- 完整的性能测试套件
- 详细的文档和使用指南
- 优先级感知抢占(已实现环形缓冲区+优先级位图调度器)
- WebSocket 服务器支持(已实现)
- HTTP 框架支持(已实现)
- 自适应时间片调整
- 跨平台支持(Windows/macOS)
- 更详细的性能监控
- 协程池管理(已实现)
- WebSocket 客户端支持
- 更多网络协议支持(HTTP/2, gRPC 等)
ZCO 正在实现完整的 WebRTC 协议栈,支持音视频通话功能。这是一个长期项目,预计需要 20-30 周的开发时间。
- UDP socket 支持扩展(基于 libxev 异步 IO)
- SDP 协议解析器和生成器(RFC 4566)
- WebSocket 信令服务器
- 房间管理和用户配对
- offer/answer/ICE candidate 消息路由
- STUN 协议实现(RFC 5389)
- ICE Agent 实现
- Candidate 收集(Host/ServerReflexive/Relay)
- 优先级计算
- Connectivity Checks
- ICE 状态机
- TURN 协议实现(RFC 5766,可选)
- DTLS 记录层实现(RFC 6347)
- DTLS 握手协议
- 证书处理(自签名证书生成/验证)
- Cipher Suite 支持(AES-128-GCM)
- DTLS-SRTP 密钥派生
- SRTP 上下文初始化
- Master Key 和 Salt 派生
- SRTP/SRTCP 包加密/解密
- Replay Protection
- RTP 包解析和构建
- SSRC 管理和序列号处理
- RTCP 协议实现(SR/RR/SDES/BYE)
- 带宽和统计信息收集
- SCTP 关联建立
- SCTP 块格式处理
- 流控制和有序/无序传输
- 数据通道封装(RFC 8832)
- 音频编解码器接口
- Opus 编码器/解码器(RFC 6716)
- G.711 (PCMU/PCMA) 支持
- 视频编解码器接口
- VP8/VP9 基础解码器
- MediaStreamTrack 抽象
- RTCPeerConnection 实现
- createOffer/createAnswer
- setLocalDescription/setRemoteDescription
- addTrack/removeTrack
- RTCRtpTransceiver 实现
- 单元测试(每个模块)
- 集成测试(端到端)
- 浏览器兼容性测试
- 音视频通话示例应用
- 从零实现: 所有协议均从零实现,不依赖外部库
- 协程驱动: 充分利用 ZCO 协程实现异步处理
- 性能优化: 零拷贝技术、环形缓冲区、协程池
- 完整支持: 信令、P2P、DTLS、SRTP、数据通道、媒体流
webrtc/
├── signaling/ # 信令层(SDP、WebSocket服务器)
├── ice/ # ICE 协议
├── dtls/ # DTLS 协议
├── srtp/ # SRTP 协议
├── rtp/ # RTP/RTCP 协议
├── sctp/ # SCTP 数据通道
├── media/ # 媒体处理
└── peer/ # PeerConnection
详细实现计划请查看 docs/WEBRTC_IMPLEMENTATION_PLAN.md
- Fork 项目
- 创建功能分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'Add some amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 打开 Pull Request
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
注意: 这是一个积极开发中的项目。核心功能已经稳定并通过了完整的性能测试验证,但 API 可能会在后续版本中发生变化。建议在充分测试后再用于生产环境。