MKV-高性能分布式内存KV-开篇

@李彪  February 19, 2020

一. 背景描述

目前缓存环境中,使用较多的是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的标准功能,还有一些研发道路要走。


评论已关闭