一. 背景描述
目前缓存环境中,使用较多的是Redis缓存,但是Redis单线程机制,在特高并发场景中还是能达到吞吐瓶颈,又由于很多大数据应用场景需要单次GET 1000或者更多的key,所以直接打到Redis服务器上,很容易让Redis主线程出现阻塞情况,产生吞吐大大下降的情况。
在这样的情况下,我们就设想架构设计一个分布式内存的缓存系统(MKV),主要设计目标包括一下:
- 多线程机制保障多核使用,提高云服务器的CPU使用率。
- 实现高性能、并发安全、存储具备数据完整性的内存缓存存储,支撑单次1000以上的key获取操作。
- 支持Redis-RESP应用层协议,由于大部分业务方使用redis缓存,尽量避免缓存切换带来的系统调整成本。
- 服务可用性达到99.99%
- 支持分布式场景不是和使用。
- 等等。。。
二. 模型试验
由于团队一直在研究Redis内核及其通信协议,因此我们首先需要对多线程版本的缓存MKV 进行模型实验,证明猜想的有效性。
于是,我们分别针对官方Redis内核 和 我们目前的多线程版本缓存KV组件 - MKV进行性能测试对比。
2.1 测试环境
我们的测试在下面的环境中进行:
- Linux 5.0.0 Kernel
- Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz [4核]
- 16GB内存
- 单次请求 :1000 个key
- 使用Redis官方 redis-benchmark 工具进行压测
2.2 Redis 官方版本压测【SET: 85w/s GET: 105w/s 】
redis-benchmark -p 6379 -t get -n 5000000 -P 1000 -c 10
压测结果如下:
====== SET ======
10000000 requests completed in 11.75 seconds
10 parallel clients
3 bytes payload
keep alive: 1
0.00% <= 1 milliseconds
0.03% <= 2 milliseconds
0.82% <= 3 milliseconds
29.82% <= 4 milliseconds
30.90% <= 5 milliseconds
99.58% <= 6 milliseconds
99.65% <= 7 milliseconds
99.73% <= 8 milliseconds
100.00% <= 8 milliseconds
850919.00 requests per second
====== GET ======
10000000 requests completed in 9.45 seconds
10 parallel clients
3 bytes payload
keep alive: 1
7.05% <= 1 milliseconds
13.16% <= 3 milliseconds
13.60% <= 4 milliseconds
74.49% <= 5 milliseconds
99.57% <= 6 milliseconds
99.99% <= 7 milliseconds
100.00% <= 7 milliseconds
1058201.12 requests per second
2.2 MKV TCP 通信模式压测【SET: 255 w/s GET: 505w/s 】
MKV 对于远程客户端访问,提供TCP途径,针对TCP模式进行压测。
redis-benchmark -p 6380 -t set,get -n 10000000 -P 1000 -c 10
压测结果如下:
====== SET ======
10000000 requests completed in 3.92 seconds
10 parallel clients
3 bytes payload
keep alive: 1
92.28% <= 1 milliseconds
99.52% <= 2 milliseconds
99.75% <= 3 milliseconds
99.88% <= 4 milliseconds
99.92% <= 5 milliseconds
99.98% <= 8 milliseconds
99.99% <= 13 milliseconds
100.00% <= 13 milliseconds
2551671.50 requests per second
====== GET ======
10000000 requests completed in 1.98 seconds
10 parallel clients
3 bytes payload
keep alive: 1
83.73% <= 1 milliseconds
98.90% <= 2 milliseconds
99.69% <= 3 milliseconds
99.86% <= 4 milliseconds
99.96% <= 5 milliseconds
100.00% <= 5 milliseconds
5058169.00 requests per second
2.3 MKV UNIX 通信模式压测【SET: 255 w/s GET: 516w/s 】
MKV也提供unix 通信模式,针对UNIX模式进行压测。
redis-benchmark -s /tmp/redis.socks -t set,get -n 10000000 -P 1000 -c 10
压测结果如下:
====== SET ======
10000000 requests completed in 3.91 seconds
10 parallel clients
3 bytes payload
keep alive: 1
92.39% <= 1 milliseconds
99.60% <= 2 milliseconds
99.89% <= 3 milliseconds
99.97% <= 4 milliseconds
100.00% <= 4 milliseconds
2554931.00 requests per second
====== GET ======
10000000 requests completed in 1.94 seconds
10 parallel clients
3 bytes payload
keep alive: 1
83.30% <= 1 milliseconds
99.00% <= 2 milliseconds
99.91% <= 3 milliseconds
99.97% <= 4 milliseconds
100.00% <= 4 milliseconds
5162622.50 requests per second
三. 模型试验-结论
从上述实际压测数据可以看出,利用多核性能,能够大大提高单机缓存吞吐性能。
SET 性能从 85w/s 提升到 255w/s
GET 性能从 105w/s 提升到 505w/s
备注:
目前版本的MKV组件,仅仅用来验证模型实验的猜想是否正确,目前还不具备很多kv的标准功能,还有一些研发道路要走。
评论已关闭