本文会通过sysbench对ProxySQL进行基准测试,并与直连的性能进行对比。与此同时也对 Maxscale 和 Qihu360 Atlas 放在一起参考。 提示:压测前确保把query cache完全关掉。
1. proxysql vs 直连
1.1 select nontrx
./bin/sysbench --test=/root/sysbench2/sysbench/tests/db/oltp.lua --mysql-host=10.0.100.36 --mysql-port=6033 --mysql-user=myuser --mysql-password=mypass \
--mysql-db=db15 --oltp-tables-count=20 --oltp-table-size=5000000 --report-interval=20 --oltp-dist-type=uniform --rand-init=on --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select \
--oltp-read-only=on --oltp-skip-trx=on --max-time=120 --num-threads=2 run
num-threads依次加大 2 5 10 20 50 100 200 400
{% iframe http://www.tubiaoxiu.com/p.html?s=106165b0eeca215a&web_mode 900 700 %}
sysbench线程并发数达到10以下,性能损失在30%以上;达到20,性能损失减少到10%左右。看到proxysql承载的并发数越高,性能损失越少;最好的时候在50线程数,相比直连损失5%。
1.2 oltp dml
混合读写测试。proxysql结果图应该与上面相差无几,因为是主要好在计算 query digest 和规则匹配,与select无异,可参考下节的图示。
sysbench 压测命令:
./bin/sysbench --test=/root/sysbench2/sysbench/tests/db/oltp.lua --mysql-host=10.0.100.34 --mysql-port=3306 --mysql-user=myuser --mysql-password=mypass \
--mysql-db=db15 --oltp-tables-count=20 --oltp-table-size=5000000 --report-interval=20 --oltp-dist-type=uniform --rand-init=on --max-requests=0 --oltp-read-only=off --max-time=120 \
--num-threads=2 run
num-threads依次加大 2 5 10 16 20 50 100 200 400
分别对PrxoySQL, Maxscale, Atlas, 直连,四种情况做基准测试
2. proxysql vs maxscale vs atlas
作者自己也有指出,在客户端并发数不高的情况下,maxscale表现比proxysql要好。这里我也特意对maxscale和atlas一起做了个对比。配置基本是最小化的,没有很复杂的规则,只是中间转发。
- ProxySQL (v1.3.5): mysql-threads=4
- Atlas 360 (v2.2.1): event-threads=4
- maxscale (v1.4.5): threads=4
** 2.1 select nontrx **
oltp混合读写基准测试,没有复杂配置的情况下,ProxySQL与Maxscale神奇般的几乎重合,Qihu360的atlas要弱一些。
** 2.2 oltp dml **
原始数据:
3. rewrite vs non-rewrite
下面来测一下 query rewrite 对性能的影响,考虑到将来如果要分表,可以在ProxySQL这一层做,应用端无需改动表名。 为了达到效果,这里rewrite只是为表增加了个别名:
-- proxysql admin cli
update mysql_query_rules set match_pattern="(.*)(sbtest\d+)(.*)",replace_pattern="\1\2 as ttt \3" where rule_id >=61 and rule_id <=92;
load mysql query rules to run;
sysbench num-threads=20 的结果:
replace? | qps | response time avg(ms) |
---|---|---|
proxysql replace | 15734.49 | 17.79 |
proxysql no-replace | 16764.66 | 16.70 |
直连 | 18778.43 | 14.91 |
在20个并发线程下,有 rewrite 是 no-rewrite 性能的 93.9% 。测试线程数继续加大到 50,差别更小。
4. lots of rules
测试ProxySQL定义的 query rules 数量(并匹配但不apply),对性能的影响。
测试的规则时批量插入大量能匹配sysbench查询的规则,但 mysql_query_rules.apply=0 :
insert into mysql_query_rules(active,schemaname,apply,flagIN) values
(1,'db15',0,0),(1,'db15',0,0),(1,'db15',0,0),(1,'db15',0,0),(1,'db15',0,0), ...
# 2 100 200 400 800 1200 2000
这里偶然发现一个问题,flagIN=0的规则必须要在 !=0 的规则前面,否则flagOUT找不到下一个新链入口.(经作者回复是参数 mysql-query_processor_iterations
控制的)
下面的结果是 sysbench num-threads=20 的几轮数据:(由于结果接近,没作图)
matched rules | QPS | RT avg | CPU% | |
---|---|---|---|---|
2 | 16741.54 | 16.69 | 151 | |
100 | 16743.54 | 16.69 | 152 | |
200 | 16749.94 | 16.71 | 159 | |
400 | 16556.09 | 16.91 | 176 | |
800 | 16522.02 | 16.94 | 203 | |
1200 | 16477.70 | 16.99 | 220 | |
2000 | 16333.59 | 17.14 | 263 |
看到匹配到的规则随着增多,QPS变化不大,只是略微下降;平均响应时间增加在3%以内;倒是ProxySQL对CPU的负载增加比较明显,匹配的规则从 2 个增加到 2000,cpu使用增加了 74% 。
参考:
原文连接地址:http://xgknight.com/2017/04/20/mysql-proxysql-performance-test/