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