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

Posted by LB on Wed, Feb 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 】

1redis-benchmark -p 6379  -t get -n 5000000  -P 1000 -c 10 

压测结果如下:

 1====== SET ======
 2  10000000 requests completed in 11.75 seconds
 3  10 parallel clients
 4  3 bytes payload
 5  keep alive: 1
 6
 70.00% <= 1 milliseconds
 80.03% <= 2 milliseconds
 90.82% <= 3 milliseconds
1029.82% <= 4 milliseconds
1130.90% <= 5 milliseconds
1299.58% <= 6 milliseconds
1399.65% <= 7 milliseconds
1499.73% <= 8 milliseconds
15100.00% <= 8 milliseconds
16850919.00 requests per second
17
18====== GET ======
19  10000000 requests completed in 9.45 seconds
20  10 parallel clients
21  3 bytes payload
22  keep alive: 1
23
247.05% <= 1 milliseconds
2513.16% <= 3 milliseconds
2613.60% <= 4 milliseconds
2774.49% <= 5 milliseconds
2899.57% <= 6 milliseconds
2999.99% <= 7 milliseconds
30100.00% <= 7 milliseconds
311058201.12 requests per second

2.2 MKV TCP 通信模式压测【SET: 255 w/s GET: 505w/s 】

MKV 对于远程客户端访问,提供TCP途径,针对TCP模式进行压测。

1redis-benchmark -p 6380  -t set,get -n 10000000  -P 1000 -c 10 

压测结果如下:

 1====== SET ======
 2  10000000 requests completed in 3.92 seconds
 3  10 parallel clients
 4  3 bytes payload
 5  keep alive: 1
 6
 792.28% <= 1 milliseconds
 899.52% <= 2 milliseconds
 999.75% <= 3 milliseconds
1099.88% <= 4 milliseconds
1199.92% <= 5 milliseconds
1299.98% <= 8 milliseconds
1399.99% <= 13 milliseconds
14100.00% <= 13 milliseconds
152551671.50 requests per second
16
17====== GET ======
18  10000000 requests completed in 1.98 seconds
19  10 parallel clients
20  3 bytes payload
21  keep alive: 1
22
2383.73% <= 1 milliseconds
2498.90% <= 2 milliseconds
2599.69% <= 3 milliseconds
2699.86% <= 4 milliseconds
2799.96% <= 5 milliseconds
28100.00% <= 5 milliseconds
295058169.00 requests per second

2.3 MKV UNIX 通信模式压测【SET: 255 w/s GET: 516w/s 】

MKV也提供unix 通信模式,针对UNIX模式进行压测。

1redis-benchmark -s /tmp/redis.socks  -t set,get -n 10000000  -P 1000 -c 10

压测结果如下:

 1====== SET ======
 2  10000000 requests completed in 3.91 seconds
 3  10 parallel clients
 4  3 bytes payload
 5  keep alive: 1
 6
 792.39% <= 1 milliseconds
 899.60% <= 2 milliseconds
 999.89% <= 3 milliseconds
1099.97% <= 4 milliseconds
11100.00% <= 4 milliseconds
122554931.00 requests per second
13
14====== GET ======
15  10000000 requests completed in 1.94 seconds
16  10 parallel clients
17  3 bytes payload
18  keep alive: 1
19
2083.30% <= 1 milliseconds
2199.00% <= 2 milliseconds
2299.91% <= 3 milliseconds
2399.97% <= 4 milliseconds
24100.00% <= 4 milliseconds
255162622.50 requests per second

三. 模型试验-结论

从上述实际压测数据可以看出,利用多核性能,能够大大提高单机缓存吞吐性能。

SET 性能从 85w/s 提升到 255w/s

GET 性能从 105w/s 提升到 505w/s

备注:

目前版本的MKV组件,仅仅用来验证模型实验的猜想是否正确,目前还不具备很多kv的标准功能,还有一些研发道路要走。