[开源分享]Rain:从零开始构建异步库,部分场景性能超越tokio
- 内容介绍
- 文章标签
- 相关推荐
本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容:
- 我的帖子已经打上 开源推广 标签: 是
- 我的开源项目完整开源,无未开源部分: 是
- 我的开源项目已链接认可 LINUX DO 社区: 是
- 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是
- 以上选择我承诺是永久有效的,接受社区和佬友监督: 是
以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出
github项目连接:
GitHub - wzxzhuxi/Rain: 从零开始构建C++23 异步运行时框架。每核事件循环、协程任务、epoll...
从零开始构建C++23 异步运行时框架。每核事件循环、协程任务、epoll 反应器、层次时间轮、线程池与同步-异步桥接。
项目主页:(已添加L站友好链接)
image961×520 27.3 KB
接下来是正文部分
在24年学习tokio的时候,看到tokio宣称自己在通用领域做到了极致,各项测试也非常nice,那时候只关注了如何使用,而没有探究原理
到今年2月辞职,我想回到互联网行业(之前从事嵌入式,使用c/c++),就想着一边学习tokio的架构,如果可以,最好使用c++仿制一个异步运行时库
一开始是打算完全仿制的,从架构到细节,直到后面在b站看到了"zedio"的介绍视频,发现已经有人仿制过tokio了,而且获得了持平tokio的性能
好吧…看来老王想做的已经有人做过了…
我转而尝试另一个方向:能不能通过做减法,降低通用性来做到部分场景超越tokio呢?
有哪些c/c++的项目以性能见长呢?
我想到了大名鼎鼎的nginx,借鉴设计思路,我决定使用thread-per-core架构(不过准确来说nginx是Process-per-Core架构)
经过两个月的学习,最终完成了Rain,至于为什么叫Rain,原因很简单,4月7日徐州下了好大的雨,所以就叫Rain了
这是使用wrk进行测试的性能表现
| 指标 | Rain | Tokio |
|---|---|---|
| Requests/sec | 247,283 | 219,543 |
| Avg Latency | 788 us | 819 us |
| Max Latency | 9.31 ms | 18.45 ms |
| Stdev | 282 us | 477 us |
| Timeouts | 0 | 0 |
到底为什么比 Tokio 还要快?
难道老王是天才吗?很遗憾,并不是。
Rain 之所以能在这组测试里超过 Tokio,主要原因是它没有采用任务窃取(per-core可以优化cpu cache miss和任务转移损耗)。因此,可以减少任务在不同 CPU 核之间传递带来的额外开销。
这是否意味着 Rain 没有应用层自动负载均衡策略?是的。Rain 没有设计应用层自动负载均衡,而是把负载均衡更多交给内核层处理。
对于网络任务,使用 SO_REUSEPORT 后,内核可以自动把连接分配到不同的 CPU 核上,从而达到负载均衡的效果,也因此减少了自动跨核传递任务的成本。
这是否意味着 Rain 完全没有跨核任务传递能力?也不是。我们仍然可以通过 EventLoop::submit() 显式地把任务投递到指定核心,在需要时完成跨核传递。
正文最后是使用jekyll制作的文档站
文档站链接:
Rain | Rain
面向可理解性的 C++23 异步运行时
网友解答:--【壹】--:
谢谢你,我后面也会在b站发教学视频,到时候会再发帖
--【贰】--:
佬友牛皮,star支持下,学习学习。。
本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容:
- 我的帖子已经打上 开源推广 标签: 是
- 我的开源项目完整开源,无未开源部分: 是
- 我的开源项目已链接认可 LINUX DO 社区: 是
- 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是
- 以上选择我承诺是永久有效的,接受社区和佬友监督: 是
以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出
github项目连接:
GitHub - wzxzhuxi/Rain: 从零开始构建C++23 异步运行时框架。每核事件循环、协程任务、epoll...
从零开始构建C++23 异步运行时框架。每核事件循环、协程任务、epoll 反应器、层次时间轮、线程池与同步-异步桥接。
项目主页:(已添加L站友好链接)
image961×520 27.3 KB
接下来是正文部分
在24年学习tokio的时候,看到tokio宣称自己在通用领域做到了极致,各项测试也非常nice,那时候只关注了如何使用,而没有探究原理
到今年2月辞职,我想回到互联网行业(之前从事嵌入式,使用c/c++),就想着一边学习tokio的架构,如果可以,最好使用c++仿制一个异步运行时库
一开始是打算完全仿制的,从架构到细节,直到后面在b站看到了"zedio"的介绍视频,发现已经有人仿制过tokio了,而且获得了持平tokio的性能
好吧…看来老王想做的已经有人做过了…
我转而尝试另一个方向:能不能通过做减法,降低通用性来做到部分场景超越tokio呢?
有哪些c/c++的项目以性能见长呢?
我想到了大名鼎鼎的nginx,借鉴设计思路,我决定使用thread-per-core架构(不过准确来说nginx是Process-per-Core架构)
经过两个月的学习,最终完成了Rain,至于为什么叫Rain,原因很简单,4月7日徐州下了好大的雨,所以就叫Rain了
这是使用wrk进行测试的性能表现
| 指标 | Rain | Tokio |
|---|---|---|
| Requests/sec | 247,283 | 219,543 |
| Avg Latency | 788 us | 819 us |
| Max Latency | 9.31 ms | 18.45 ms |
| Stdev | 282 us | 477 us |
| Timeouts | 0 | 0 |
到底为什么比 Tokio 还要快?
难道老王是天才吗?很遗憾,并不是。
Rain 之所以能在这组测试里超过 Tokio,主要原因是它没有采用任务窃取(per-core可以优化cpu cache miss和任务转移损耗)。因此,可以减少任务在不同 CPU 核之间传递带来的额外开销。
这是否意味着 Rain 没有应用层自动负载均衡策略?是的。Rain 没有设计应用层自动负载均衡,而是把负载均衡更多交给内核层处理。
对于网络任务,使用 SO_REUSEPORT 后,内核可以自动把连接分配到不同的 CPU 核上,从而达到负载均衡的效果,也因此减少了自动跨核传递任务的成本。
这是否意味着 Rain 完全没有跨核任务传递能力?也不是。我们仍然可以通过 EventLoop::submit() 显式地把任务投递到指定核心,在需要时完成跨核传递。
正文最后是使用jekyll制作的文档站
文档站链接:
Rain | Rain
面向可理解性的 C++23 异步运行时
网友解答:--【壹】--:
谢谢你,我后面也会在b站发教学视频,到时候会再发帖
--【贰】--:
佬友牛皮,star支持下,学习学习。。

![[开源分享]Rain:从零开始构建异步库,部分场景性能超越tokio](/imgrand/UOLPfC74.webp)