6.0之后的多线程主要解决什么问题我们知道,近年来底层网络硬件性能越来越好,Redis 的性能瓶颈逐渐体现在网络 I/O 的读写上,单个线程处理网络 I/O 读写的速度跟不上底层网络硬件执行的速度 。从下图我们可以看到,Redis 在处理网络数据时,调用 epoll 的过程是阻塞的,这个过程会阻塞线程 。如果并发量很高,达到万级别的 QPS,就会形成瓶颈,影响整体吞吐能力 。

文章插图
既然读写网络的 read/write 系统调用占用了Redis 执行期间大部分CPU 时间,那么要想真正做到提速,必须改善网络IO性能 。我们可以从这两个方面来优化:
- 提高网络 IO 性能,典型实现方式比如使用 DPDK 来替代内核网络栈的方式
- 使用多线程,这样可以充分利用多核CPU,同类实现案例比如 Memcached 。
- 可以充分利用服务器CPU的多核资源,而主线程明显只能利用一个
- 多线程任务可以分摊 Redis 同步 IO 读写负荷,降低耗时
【追求性能极致:Redis6.0的多线程模型】

文章插图
具体步骤如下:
- 主线程建立连接,并接受数据,并将获取的 socket 数据放入等待队列;
- 通过轮询的方式将 socket读取出来并分配给 IO 线程;
- 之后主线程保持阻塞,一直等到 IO 线程完成 socket 读取和解析;
- I/O 线程读取和解析完成之后,返回给主线程 ,主线程开始执行 Redis 命令;
- 执行完Redis命令后,主线程阻塞,直到IO 线程完成 结果回写到socket 的工作;
- 主线程清空已完成的队列,等待客户端新的请求 。
开启多线程的方式Redis6.0的多线程默认是禁用的,只使用主线程 。如需开启需要修改redis.conf配置文件:
# io-threads-do-reads noio-threads-do-reads yes
开启多线程后,还需要设置线程数,否则是不生效的 。同样修改redis.conf配置文件 。关于线程数的设置,官方有一个建议:4 核的机器建议设置为 2 或 3 个线程,8核的建议设置为 6 个线程,线程数一定要小于机器核数 。线程数并不是越大越好,官方认为超过了 8 个就很难继续提效了,没什么意义 。# 假设你的CPU核数是8核,尽量配置成 5~6io-threads 5
总结- 6.0之前,Redis所谓的单线程并不是所有工作都是只有一个线程在执行,而是指Redis的网络IO和读写是由一个线程来完成的 。其他诸如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的 。
- 互联网飞速发展,开发人员面临的线上流量场景越来越大,再使用单线程模式会导致在网络 I/O 浪费太多时间,极大的降低吞吐量,而普遍多核的cpu又没有得到有效的利用 。
经验总结扩展阅读
- 电视盒子性能排名 家用电视盒子排行榜
- MatrixOne从入门到实践08——SSB性能测试
- 索尼和夏普4k电视哪个好 不同性能优势你看好谁
- 甲亢为什么会突眼
- 宁可错过也不主动追求异性的星座女
- 追求者靠近,自己就会往后退的星座
- 天玑900和骁龙765G哪个好_天玑900和骁龙765G性能对比
- 高通骁龙895和骁龙888对比_哪款性能更好
- 迅鲲1300T和天玑1100区别对比_哪款性能更好
- 荣耀v50搭载什么处理器_荣耀v50处理器性能介绍