在我们工作中的测试,一般情况下,分为功能测试与性能测试,当我们进行性能测试,如对闪存卡进行性能测试,对DELL服务器、HP服务器服务器进行测试,首先肯定是在线下通过压力工具如mysqlslap、sysbench、tpcc等进行压力测试,然后拿到线上进行长期的测试,但是有时候,我们线下测试很好,但是拿到线上去,有的服务可能会表现很好,但是有的确很差,这样又得下线,极大的影响了我们的实施成本与实施成本,所以就想出在线下测试后,我们模拟线上环境进行一次伪线上压力测试,这样最终的我们的测试结果就会更精准了。
我的思路是:通过一定方法得到线上的查询语句,利用http://www.percona.com/doc/percona-toolkit/的工具。
pt-log-player对与主库同步的非线上从库(确保我们的测试是在有读有写的情况)进行压力测试,已查看最大所能达到的QPS,这样经过一对比我们就能得出一个伪线上的测试结果了。
我实施的步骤如下:
1、 想办法得到查询语句
这有两个方法:
(1)利用tcpdump抓包得到
具体语句如下:
A、tcpdump -s 65535 -x -nn -q -tttt -i any -c 100000 port3805 >tcp.txt
B、把抓到的包分解成slow log格式
pt-query-digest--type tcpdump
--no-report --print --watch-server10.73.18.100:3872 tcp.txt >slow.txt
(2)利用SET GLOBAL long_query_time = .000001;把所有的查询都录入到慢日志里,不过这种方式的情况话,在标准Mysql版本中,没有thread id,而percona却有,而我们的切分都是通过thread id来切分的,所以我们必须强制添加thread id
如下:
未添加thread id的
# Time: 111028 21:43:05
# User@Host: elink[elink] @ [10.69.14.40]
# Query_time: 1.090582 Lock_time: 0.000066 Rows_sent: 10 Rows_examined: 10
SET timestamp=1319809385;
SELECT * FROM ****;
所以在标准版本,我们需要通过脚本去生成,
添加过thread id的slow log如下
- # Time: 111027 17:47:31.596770
- # User@Host: fans_r[fans_r] @ 10.75.14.59 []
- # Thread_id: 70328550
- # Query_time: 0.000000 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
- use fans;
复制代码
往slow log添加thread id的脚本见最后
2、利用pt-log-player按Thread_id把慢日志分解成多个可以执行的文件,这样我们能多线程的执行这些分解出来的语句了
pt-log-player
--split Thread_id
--session-files 16 --base-dir ./sessionsslow.txt
3、执行语句
pt-log-player--play ./sessions --base-dir ./results --only-select
h=***,u=***,p=****,P=***,D=****
而pt-log-player会最大限度的去执行语句,这样我们就能得到一个很大的压力,如果压力还不够,我们可以在多台前端机器执行pt-log-player –play,最终mysql会达到一个最大的QPS。这样我们就能对比出到底适合不适合线上运行。
除了做测试外,这种伪测试还能给我们的一个最大帮助就是,评估一个端口的承受能力,譬如:我们能把测试出来的QPS与线上目前的QPS比,在与将来需要承受的压力比,我们就知道需要扩容多少台从库以解决压力问题了。
往slow log添加thread id的脚本如下(务必把slow log拷贝其他目录,然后对拷贝的slow log进行操作,请不要操作线上使用的slow log)