V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lsk569937453
V2EX  ›  程序员

今天咱也用 rust 实现一个 redis 的 demo,性能差不多。[第二弹]

  •  
  •   lsk569937453 · 230 天前 · 2084 次点击
    这是一个创建于 230 天前的主题,其中的信息可能已经有所发展或是发生改变。

    鉴于上次帖子,有很多同学提出想要对比一下 tokio 的mini-redis的性能(毕竟 tokio 在 rust 界就如高山一样让我们仰望)。我马不停蹄的开始拉镜像做对比,发现 mini-redis 在多线程下 QPS 居然是原生 redis 的两倍。我拜读了一下 mini-redis 的源码,发现流程非常之简洁。因此把 rcache 重构了一把,终于达到了 mini-redis 的水准。

    源码

    https://github.com/lsk569937453/rcache/tree/mutex

    性能对比(4 核心 8Gb 内存)

    • X 轴代表吞吐量
    • Y 轴代表 benchmark 下单线程和多线程(添加--threads 16)的测试 alt tag

    总共做了三组对比实验:

    • redis:原生 redis
    • rcache(mpsc 的 channel 版本):rcache 的 1.0 实现
    • rcache(全局 mutex 版本):rcache 参考 mini-redis 实现,性能和 mini-redis 一样

    实验结果

    rcache 基于 mini-redis 的实现,性能等于 mini-redis 。相比原生的 redis ,单线程吞吐量是 redis 的 90%,多线程的吞吐量是原生的 redis 的两倍。

    架构

    参考 mini-redis,直接用 Mutex 对全局的数据加锁,全局的 struct 内部其实就是用多个 HashMap 来存储 string,list,hash 以及过期 map 等数据结构。没想到效果出奇的好。

    6 条回复    2024-04-24 13:36:44 +08:00
    xxxccc
        1
    xxxccc  
       230 天前
    没仔细了解过 mini-redis ,请教一下为啥多线程能够达到 redis 的两倍吞吐
    keakon
        2
    keakon  
       230 天前
    大概是因为 redis 是单线程的。
    bug123
        3
    bug123  
       230 天前
    cpu 占用分别是多少?一个是多线程一个是单线程
    lsk569937453
        4
    lsk569937453  
    OP
       230 天前
    @bug123 rcache 和 redis 的机器配置都是 4 核 8G 。
    实验中 redis-benchmark 的请求数是 10 万,16 线程。
    当请求数为 10 万,线程数为 16 时,rcache 的 cpu 使用率 115%,吞吐量为 20 万。redis 的使用率为 70%,吞吐量 10 万。
    当请求数为 100 万,线程数为 16 时,rcache 的 cpu 使用率 380%,吞吐量为 33 万。redis 的使用率为 100%,吞吐量 11 万。
    bug123
        5
    bug123  
       230 天前
    @lsk569937453 从你的数据看,redis 就是单线程呀,要不 rcache 用单线程试试?
    cfeitong
        6
    cfeitong  
       218 天前 via Android
    有个最简单的优化可以试试:改系统内存分配器为 mimalloc ,几行代码的效果不小。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5945 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:25 · PVG 10:25 · LAX 18:25 · JFK 21:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.