原文地址 https://developpaper.com/redis-6-0-multithreading-performance-test-results-and-analysis/
Redis 6.0 多线程性能测试和分析
因为做的主要是低延迟的内存操作,CPU不是内存操作的瓶颈,最可能的瓶颈是网络IO操作。Redis6.0支持多线程,只是套接字层面的多线程,主要的内存读写仍是多线程模式。
测试环境
测试配置:CENTOS 7, 16核CPU 32G内存
Redis version: 6.0.6
分别配置 1线程、2线程、4线程、6线程、8线程和10线程,200并发链接处理1亿请求。为避免网络延迟,redis-benchmark进行本地测试。
redis-benchmark -d 128 -c 200 -n 1000000 -t set -q --threads 8
坑
- 坑1
CENTOS7 默认的GCC版本是 4.* , Redis6.0不能直接编译,因此需要升级GCC,因为机器不支持Yum 安装,所以需要用源码编译,又因为需要一些其他依赖,所以扁蓄用了一些时间。
- 坑2
要测试多线程IO,redis-benchmark也必须加
--threads
来使用多线程模式测试。
测试结果及分析
不同线程数下100Wget/set请求的QPS结果
可以看出:
2个线程的QPS为18W/s,大约于单线程的9W/s的两倍。4线程相对于2线程,有约30%的提升。
对于set操作,4线程、6线程、8线程的QPS没太大差别,约为23W~24W。8线程相对于4到6线程,有约10%的提升。
6线程或10线程,与最高效的8线程相比,性能开始下降,效果与4线程或6线程等同。
因此,本地环境,I/O线程数设置2个或4个就可以,最大不要超过8个,否则性能会降级。但是要注意,要么不开,要开线程数最低也得设置为1个。
下面是不同线程数下GET/SET的QPS比较。
io-threads-do-reads 测试
io-threads-do-reads
参数用于设置读取套接字操作是否使用多线程操作。Redis套接字读取使用多路复用技术,本身不回成为瓶颈。现在测下配置这个参数是否会对性能有所改善。
从下图可以看出,io-threads-do-reads
开不开对性能影响不大。
开启多线程且开启多线程读取套接字,线程数设置为2:
开启多线程关闭多线程套读取套接字,线程数设置为2: