基础信息
- Redis版本
5.0.6
- 网络信息
- 服务器信息 | 角色 | IP | 操作系统 | CPU | 内存 | 磁盘空间 | 顺序读 | 顺序写 | | —- | —- | —- | —- | —- | —- | —- | —- | | redis1 | 10.241.90.2 | CentOS Linux release 7.6.1810 | 4 | 8 | 300G | 238MB/s | 137MB/s | | redis2 | 10.241.90.22 | CentOS Linux release 7.6.1810 | 4 | 8 | 300G | 142MB/s | 126MB/s | | redis3 | 10.241.40.2 | CentOS Linux release 7.6.1810 | 4 | 8 | 300G | 267MB/s | 136MB/s | | 写 | 10.241.40.4 | CentOS Linux release 7.6.1810 | 4 | 8 | 36G | 261 MB/s | 193MB/s | | 读 | 10.241.90.34 | CentOS Linux release 7.6.1810 | 4 | 4 | 36G | 268 MB/s | 188MB/s |
1.读写测试命令如下:
顺序写:
time dd if=/dev/zero of=/data/ddtest bs=1k count=10000000 conv=fdatasync
顺序读:
time dd if=/data/ddtest of=/dev/null bs=1k count=10000000 status=progress
测试场景1
- 背景
在对单个key读写情况下,客户端数量对读写性能的影响 - 案例1
- 发压命令
#写命令
redis-benchmark -h 10.241.90.2 -p 7100 -t set -c 10 -n 1000000 -a Bonree@365 --cluster
#读命令
redis-benchmark -h 10.241.90.2 -p 7100 -t get -c 10 -n 1000000 -a Bonree@365 --cluster
- 发压命令
测试结果
| | ip | 写入TPS | 读取TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | reids1 | 10.241.90.2 | 17892.29 | 16792.05 | 26.52 | 3.82 | 0.5 | 962.4K | 585.5K | | redis2 | 10.241.90.22 | 17892.29 | 16792.05 | 34.16 | 3.51 | 0.5 | 1.2M | 722.4K | | redis3 | 110.241.40.2 | 17892.29 | 16792.05 | 35.33 | 3.62 | 0.7 | 904.4K | 546.3K | | 写入 | 10.241.40.4 | | | 58.99 | 9.18 | 0 | 858.4K | 1.5M | | 读取 | 10.241.90.34 | | | 60.16 | 9.81 | | 1.1M | 1.5M |问题列表
无- 案例总结
设置客户端数量10,写入TPS为17892.29,读取TPS为16792.05,redis服务端内存占用3%,客户端CPU占用率60%,io无明显消耗。- 案例2
- 发压命令
#写命令
redis-benchmark -h 10.241.90.2 -p 7100 -t set -c 100 -n 1000000 -a Bonree@365 --cluster
#读命令
redis-benchmark -h 10.241.90.2 -p 7100 -t get -c 100 -n 1000000 -a Bonree@365 --cluster
测试结果
| | ip | 写入TPS | 读取TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | reids1 | 10.241.90.2 | 98376.78 | 97465 | 49.37 | 3.84 | 0.2 | 4.7M | 2.9M | | reids2 | 10.241.90.22 | 98376.78 | 97465 | 47.16 | 3.58 | 0.40 | 4.7M | 2.9M | | reids3 | 110.241.40.2 | 98376.78 | 97465 | 50.25 | 3.79 | 0.7 | 4.0M | 2.4M | | 写入 | 10.241.40.4 | | | 97.21 | 9.18 | 0 | 5.6M | 9.9M | | 读取 | 10.241.90.34 | | | 97.95 | 9.86 | 0 | 6.0M | 8.7M |问题列表
无- 案例总结
设置客户端数量100,写入TPS为98376.78,读取TPS为97465,redis服务端内存占用3%,客户端CPU占用率97%,io无明显消耗。- 案例3
- 发压命令
#写命令
redis-benchmark -h 10.241.90.2 -p 7100 -t set -c 1000 -n 1000000 -a Bonree@365 --cluster
#读命令
redis-benchmark -h 10.241.90.2 -p 7100 -t get -c 1000 -n 1000000 -a Bonree@365 --cluster
测试结果
| | ip | 写入TPS | 读取TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | reids1 | 10.241.90.2 | 85295.12 | 80327 | 50.13 | 3.98 | 0.20 | 4.9M | 3.0M | | reids2 | 10.241.90.22 | 85295.12 | 80327 | 50.64 | 3.69 | 0.50 | 3.6M | 2.2M | | reids3 | 110.241.40.2 | 85295.12 | 80327 | 50.13 | 3.79 | 0.7 | 5.9M | 3.8M | | 写入 | 10.241.40.4 | | | 97.21 | 9.22 | 0 | 5.4M | 9.5M | | 读取 | 10.241.90.34 | | | 98.94 | 9.89 | 0 | 5.2M | 7.9M |问题列表
无- 案例总结
设置客户端数量100,写入TPS为85295.12,读取TPS为80327,redis服务端内存占用3%,客户端CPU占用率97%,io无明显消耗。- 测试结论
- 案例总结
| 案例 | 客户端数量 | 写TPS | 读TPS | 服务端内存 | 客户端CPU | 服务端IO | | —- | —- | —- | —- | —- | —- | —- | | 1 | 10 | 17892.29 | 16792.05 | 3% | 60% | 0 | | 2 | 100 | 98376.78 | 97465 | 3% | 97% | 0 | | 3 | 1000 | 85295.12 | 80327 | 3% | 97% | 0 |
查看所有key
127.0.0.1:7100> keys *
1) "key:{06S}:__rand_int__"
- 案例分析
通过案例1,案例2,案例3对比可以看到,客户端增加,读写TPS会增加,服务端内存没有太大变化,客户端CPU增加,服务端IO没有明显变化,当客户端CPU到达峰值是,增加服务端数量,读写TPS也不会增加。反而由于客户端抢占CPU资源引起读写TPS降低。服务端每个master实例只保存了一个key。 - 案例结果
1、服务端内存消耗由服务端保存key的数量和大小决定
2、单纯读写redis key不会产生IO性能消耗,因为redis key是保存在内存中
3、当服务端资源充足的情况下,发压客户端资源也决定读写的性能
测试场景2
- 背景
- 案例1
- 发压命令
#写命
#-c 客户端大小
#-n 请求数
#-d 以字节的形式指定set/get值的数据大小
#-r 使用随机key
redis-benchmark -t set -h 10.241.90.2 -p 7100 -c 1000 -n 1000000 -r 1000000 -d 45600 -a Bonree@365 --cluster
- 发压命令
测试结果
图一:服务端内存消耗情况
图二:数据库中key的数量
图三:key的过期时间127.0.0.1:7100> ttl key:{06S}:000000485090
(integer) -1
图四:关键参数问题列表
- 案例总结
1、从图一内存消耗情况可以看出,当持续往redis中写入key时,redis服务端内存会持续增加,然后会在2G内存上下波动。
2、从图一和图二可以看出,当内存快到达redis设置的2G阈值时,会通过删除key来释放内存
3、从图三和图四可以看出,由于内存策略设置的allkeys-lru(根据 lru 算法,在所有键空间中,移除(最近最少)最久未被使用的key),虽然key没有设置过期时间,但是最久未被使用的key也会被删除- 案例2
- 前提条件
将内存淘汰策略调整为volatile-lfu
- 发压命令
#写命
#-c 客户端大小
#-n 请求数
#-d 以字节的形式指定set/get值的数据大小
#-r 使用随机key
redis-benchmark -t set -h 10.241.90.2 -p 7100 -c 1000 -n 1000000 -r 1000000 -d 45600 -a Bonree@365 --cluster
- 测试结果
图一:服务端内存消耗情况
图二:数据库中key的数量
图三:写入key
图四:读取key
- 问题列表
- 案例总结
1、从图一和图二可以看出,当内存到达redis设置的2G阈值时,又没有key被淘汰的情况下,无法再插入新的key,key的数量不会变化
2、从图三可以看出,当redis内存不足时,再写入key的时候会报内存溢出
3、从图四可以看出,当redis内存不足时,还是可以读取已经存在的key