1、背景
为了更好的给业务提供良好的缓存服务,同时提升主机资源利用率。Redis管理采用单台主机部署多个redis实例。通过linux系统级cgroups内核控制技术来隔离redis实例之间资源调用。保障实例之间运行稳定,隔离后无资源争用现象。
2、目标
采用
Cgroup控制隔离
redis进程资源,测试多种场景保障
redis服务运行稳定。
Redis多实例进程之间资源隔离无影响,能保证系统承载能力与稳定性。
3、测试环境与工具
3.1、环境信息
|
C PU |
内存 |
操作系统 |
REDIS 版本 |
Redis 架构 |
机器数 |
|
4 |
16G |
CENTOS7.3 |
6.2.1 |
Redis主从 |
3台 |
3.2、测试工具
|
Redis 性能工具 |
监控工具 |
测试形式 |
备注 |
|
redis-benchmark |
Top,sar,vmstat |
命令 |
|
4、配置与指标
4.1、cgroup配置
Redis-server进程CGROUP控制,将控制参数配置至启动 redis-server脚本中,需要通过CPUQuota与MemoryLimit参数来控制CPU与内存资源配额,具体的资源配额大小可以通过参数数值来改变,详细的配置如下:
|
如下是控制 redis-server 进程参数 /usr/lib/systemd/system/redis-server.service ############################################ [Unit] Description=Redis After=network.target [Service] Type=forking User=xj_paas Group=xj_paas UMask=0027 NotifyAccess=all TimeoutStartSec=600 ExecStart=/usr/local/bin/redis-server /app/redis/6101/redis_6101.conf ExecStop=/usr/local/bin/redis-cli -h 10.253.176.137 -p 6101 -a cmVkaXM= shutdown PrivateTmp=true CPUQuota=20% MemoryLimit=1024M [Install] WantedBy=multi-user.target.wants |
4.2 测试指标
测试过程中可以通过相关指标来观察redis服务的性能是否存在下降趋势,主机资源的资源是否在配额范围内没有出现超卖。
CPU 使用率:redis进程CPU占用率。
SET QPS :redis每秒SET请求数
GET QPS: redis 每秒GET请求数
INCR QPS: redis 每秒存储加1请求数
5、测试过程
5.1 测试场景1
redis单实例,在不做任何资源限制下进行压力测试,跑出的最优QPS值和CPU平均使用率。如下表所示,当客户端连接数为100和400时,CPU使用率均值都在85-88%,SET QPS、GET QPS和INCR QPS的值波动幅度不大,较为平均。
测试命令:
redis-benchmark -h 127.0.0.1 -p 6101 -t set,get,incr -c 100 -n 1000000 -q
redis-benchmark -h 127.0.0.1 -p 6101 -t set,get,incr -c 400 -n 1000000 -q
|
|
CPU |
内存 |
并发数 |
CPU 使用率 |
SET QPS |
GET QPS |
INCR QPS |
|
单实例场景 |
4 |
16G |
100 |
88% |
80541 |
93632 |
82481 |
|
400 |
86% |
66809 |
79421 |
74024 |
5.2、测试场景2
Redis单实例,使用CGROUP进行限制CPU性能资源,且分别限制CPU使用率最大值不能超过20%、40%、60%、80%下进行压力测试,跑出的最优QPS值和CPU平均使用率。结果如下表所示,连接数分别以100和400压测,可直观看到采用CGROUP限制资源后,CPU使用率已得到限制,且没有超过限制的上限,但QPS值也因CPU受到限制而降低,综合观察压测后得出的QPS值可知,连接数100和400的QPS值并没有太大的差别。
测试命令:
redis-benchmark -h 127.0.0.1 -p 6101 -t set,get,incr -c 100 -n 1000000 -q
redis-benchmark -h 127.0.0.1 -p 6101 -t set,get,incr -c 400 -n 1000000 -q
|
|
CPU |
内存 |
限制CPU |
并发数 |
CPU 使用率 |
SET QPS |
GET QPS |
INCR QPS |
|
单实例场景 |
4 |
16G |
20% |
100 |
19.60% |
11937 |
16883 |
12230 |
|
400 |
19.60% |
13431 |
16144 |
13553 | ||||
|
40% |
100 |
37.00% |
27948 |
44642 |
37707 | |||
|
400 |
37.00% |
26616 |
34364 |
28050 | ||||
|
60% |
100 |
59.60% |
49333 |
66172 |
48374 | |||
|
400 |
59.60% |
53453 |
68376 |
50380 | ||||
|
80% |
100 |
79% |
61625 |
83001 |
64004 | |||
|
400 |
79% |
64561 |
85106 |
68922 |
5.3、测试场景3
Redis多实例,在不做任何资源限制进行压力测试,跑出的最优QPS值和CPU平均使用率。如下图所示,当客户端连接数为100和400时,CPU使用率均值都在88-92%,且SET QPS、GET QPS和INCR QPS的值波动幅度不大,较为平均,也没有出现不同实例一高一低的QPS值;故可知,在不做任何资源限制双实例情况下,压力测试后的QPS值并不存在且不会出现多实例因争夺性能资源而导致QPS值降低。
测试命令:
redis-benchmark -h 127.0.0.1 -p 6101 -t set,get,incr -c 100 -n 1000000 -q
redis-benchmark -h 127.0.0.1 -p 6101 -t set,get,incr -c 100 -n 1000000 -q
redis-benchmark -h 127.0.0.1 -p 6101 -t set,get,incr -c 400 -n 1000000 -q
redis-benchmark -h 127.0.0.1 -p 6102 -t set,get,incr -c 400 -n 1000000 -q
|
|
CPU |
内存 |
实例 |
连接数 |
CPU 使用率 |
SET QPS |
GET QPS |
INCR QPS |
|
多实例场景 |
4 |
16G |
6101 |
100 |
92% |
102417 |
93066 |
105585 |
|
6102 |
92% |
95265 |
89919 |
98135 | ||||
|
6101 |
400 |
88% |
102103 |
94903 |
93905 | |||
|
6102 |
88% |
94544 |
94607 |
84609 |
5.4 测试场景4
Redis多实例,使用CGROUP进行限制CPU性能资源,且分别限制CPU使用率最大值不能超过20%、40%、60%、80%下进行压力测试,跑出的最优QPS值和CPU平均使用率。结果如下图所示,连接数分别以100和400压测,可以从数据看到,采用CGROUP限制资源后,CPU使用率已得到限制,且没有超过限制的上限,但QPS值也因CPU受到限制而降低,综合观察压测后得出的QPS值可知,连接数100和400的QPS值并没有太大的差别,且波动幅度不大,较为平均,测试中也没有出现不同实例一高一低的QPS值;故可知,在CGROUP资源限制下,双实例情景压力测试后的QPS值,也同样不存在且不会出现多实例因争夺性能资源而导致QPS值降低的情况。
测试命令:
redis-benchmark -h 127.0.0.1 -p 6101 -t set,get,incr -c 100 -n 1000000 -q
redis-benchmark -h 127.0.0.1 -p 6101 -t set,get,incr -c 100 -n 1000000 -q
redis-benchmark -h 127.0.0.1 -p 6101 -t set,get,incr -c 400 -n 1000000 -q
redis-benchmark -h 127.0.0.1 -p 6102 -t set,get,incr -c 400 -n 1000000 -q
|
|
CPU |
内存 |
实例 |
限制CPU |
并发数 |
CPU 使用率 |
SET QPS |
GET QPS |
INCR QPS |
|
多实例场景 |
4 |
16G |
6101 |
20% |
100 |
19.70% |
16108 |
14150 |
16524 |
|
6102 |
19.70% |
17698 |
14422 |
16681 | |||||
|
6101 |
400 |
19.30% |
15160 |
20084 |
11602 | ||||
|
6102 |
19.30% |
17217 |
21146 |
11833 | |||||
|
6101 |
40% |
100 |
39.70% |
53358 |
50015 |
49402 | |||
|
6102 |
39.70% |
50643 |
52826 |
50390 | |||||
|
6101 |
400 |
39.70% |
48647 |
52912 |
54635 | ||||
|
6102 |
39.70% |
45382 |
53154 |
54674 | |||||
|
6101 |
60% |
100 |
59.10% |
82135 |
79491 |
78302 | |||
|
6102 |
59.50% |
80314 |
80166 |
78517 | |||||
|
6101 |
400 |
58.20% |
79258 |
79662 |
83486 | ||||
|
6102 |
58.40% |
77561 |
80353 |
84788 | |||||
|
6101 |
80% |
100 |
70.20% |
87382 |
85521 |
87827 | |||
|
6102 |
70.20% |
84868 |
84846 |
88928 | |||||
|
6101 |
400 |
70.20% |
94135 |
94759 |
93423 | ||||
|
6102 |
70.20% |
91701 |
94589 |
|
6、测试总结
无论时reids单实例,还是redis多实例,采用操作系统CGROUP控制资源隔离后,在不超过虚拟机资源上限的情况下,实例的组件性能和数据读取、写入性能并不影响,且资源限制后,每个实例限制分配的资源也不会超过所配置的资源上限。经过此轮的多场景测试整体redis的 QPS值可以满足业务需求,可实现实例资源隔离和性能控制。