设为首页 收藏本站
查看: 914|回复: 0

[经验分享] 用mysqlslap对MySQL进行压力测试

[复制链接]

尚未签到

发表于 2018-9-27 11:59:24 | 显示全部楼层 |阅读模式
MySQL5.1地的确提供了好多有力的工具来帮助我们DBA进行数据库管理。  现在看一下这个压力测试工具mysqlslap.
  关于他的选项手册上以及--help介绍的很详细。
  我解释一下一些常用的选项。
  这里要注意的几个选项:
  --concurrency代表并发数量,多个可以用逗号隔开,当然你也可以用自己的分隔符隔开,这个时候要用到--delimiter开关。
  --engines代表要测试的引擎,可以有多个,用分隔符隔开。
  --iterations代表要运行这些测试多少次。
  --auto-generate-sql 代表用系统自己生成的SQL脚本来测试。
  --auto-generate-sql-load-type 代表要测试的是读还是写还是两者混合的(read,write,update,mixed)
  --number-of-queries 代表总共要运行多少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算。比如倒数第二个结果2=200/100。
  --debug-info 代表要额外输出CPU以及内存的相关信息。
  --number-int-cols 代表示例表中的INTEGER类型的属性有几个。
  --number-char-cols 意思同上。
  --create-schema 代表自己定义的模式(在MySQL中也就是库)。
  --query 代表自己的SQL脚本。
  --only-print 如果只想打印看看SQL语句是什么,可以用这个选项。
  现在来看一些我测试的例子。
  1、用自带的SQL脚本来测试。
  MySQL版本为5.1.23
  [root@localhost ~]# mysqlslap --defaults-file=/usr/local/mysql-maria/my.cnf --concurrency=50,100,200 --iterations=1 --number-int-cols=4 --number-char-cols=35 --auto-generate-sql --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed --engine=myisam,innodb --number-of-queries=200 --debug-info -uroot -p1 -S/tmp/mysql_3310.sock
  Benchmark
  Running for engine myisam
  Average number of seconds to run all queries: 0.063 seconds
  Minimum number of seconds to run all queries: 0.063 seconds
  Maximum number of seconds to run all queries: 0.063 seconds
  Number of clients running queries: 50
  Average number of queries per client: 4
  Benchmark
  Running for engine myisam
  Average number of seconds to run all queries: 0.070 seconds
  Minimum number of seconds to run all queries: 0.070 seconds
  Maximum number of seconds to run all queries: 0.070 seconds
  Number of clients running queries: 100
  Average number of queries per client: 2
  Benchmark
  Running for engine myisam
  Average number of seconds to run all queries: 0.092 seconds
  Minimum number of seconds to run all queries: 0.092 seconds
  Maximum number of seconds to run all queries: 0.092 seconds
  Number of clients running queries: 200
  Average number of queries per client: 1
  Benchmark
  Running for engine innodb
  Average number of seconds to run all queries: 0.115 seconds
  Minimum number of seconds to run all queries: 0.115 seconds
  Maximum number of seconds to run all queries: 0.115 seconds
  Number of clients running queries: 50
  Average number of queries per client: 4
  Benchmark
  Running for engine innodb
  Average number of seconds to run all queries: 0.134 seconds
  Minimum number of seconds to run all queries: 0.134 seconds
  Maximum number of seconds to run all queries: 0.134 seconds
  Number of clients running queries: 100
  Average number of queries per client: 2
  Benchmark
  Running for engine innodb
  Average number of seconds to run all queries: 0.192 seconds
  Minimum number of seconds to run all queries: 0.192 seconds
  Maximum number of seconds to run all queries: 0.192 seconds
  Number of clients running queries: 200
  Average number of queries per client: 1
  User time 0.06, System time 0.15

  Maximum resident set>  Non-physical pagefaults 5803, Physical pagefaults 0, Swaps 0
  Blocks in 0 out 0, Messages in 0 out 0, Signals 0
  Voluntary context switches 8173, Involuntary context switches 528
  我来解释一下结果的含义。
  拿每个引擎最后一个Benchmark示例。
  对于INNODB引擎,200个客户端同时运行这些SQL语句平均要花0.192秒。相应的MYISAM为0.092秒。
  2、用我们自己定义的SQL 脚本来测试。
  这些数据在另外一个MySQL实例上。版本为5.0.45
  先看一下这两个表的相关数据。
  1)、总记录数。
  mysql> select table_rows as rows from information_schema.tables where table_schema='t_girl' and table_name='article';
  +--------+
  | rows   |
  +--------+
  | 296693 |
  +--------+
  1 row in set (0.01 sec)
  mysql> select table_rows as rows from information_schema.tables where table_schema='t_girl' and table_name='category';
  +------+
  | rows |
  +------+
  | 113  |
  +------+
  1 row in set (0.00 sec)
  2)、总列数。
  mysql> select count(*) as column_total from information_schema.columns where table_schema = 't_girl' and table_name = 'article';
  +--------------+
  | column_total |
  +--------------+
  | 32           |
  +--------------+
  1 row in set (0.01 sec)
  mysql> select count(*) as column_total from information_schema.columns where table_schema = 't_girl' and table_name = 'category';
  +--------------+
  | column_total |
  +--------------+
  | 9            |
  +--------------+
  1 row in set (0.01 sec)
  3)、调用的存储过程
  DELIMITER $$
  DROP PROCEDURE IF EXISTS `t_girl`.`sp_get_article`$$
  CREATE DEFINER=`root`@`%` PROCEDURE `sp_get_article`(IN f_category_id int,
  IN f_page_size int, IN f_page_no int
  )
  BEGIN
  set @stmt = 'select a.* from article as a inner join ';
  set @stmt = concat(@stmt,'(select a.aid from article as a ');
  if f_category_id != 0 then
  set @stmt = concat(@stmt,' inner join (select cid from category where cid = ',f_category_id,' or parent_id = ',f_category_id,') as b on a.category_id = b.cid');
  end if;
  if f_page_size >0 && f_page_no > 0 then
  set @stmt = concat(@stmt,' limit ',(f_page_no-1)*f_page_size,',',f_page_size);
  end if;
  set @stmt = concat(@stmt,') as b on (a.aid = b.aid)');
  prepare s1 from @stmt;
  execute s1;
  deallocate prepare s1;
  set @stmt = NULL;
  END$$
  DELIMITER ;
  4)、我们用mysqlslap来测试
  以下得这个例子代表用mysqlslap来测试并发数为25,50,100的调用存储过程,并且总共调用5000次。
  [root@localhost ~]# mysqlslap --defaults-file=/usr/local/mysql-maria/my.cnf --concurrency=25,50,100 --iterations=1 --query='call t_girl.sp_get_article(2,10,1);' --number-of-queries=5000 --debug-info -uroot -p -S/tmp/mysql50.sock
  Enter password:
  Benchmark
  Average number of seconds to run all queries: 3.507 seconds
  Minimum number of seconds to run all queries: 3.507 seconds
  Maximum number of seconds to run all queries: 3.507 seconds
  Number of clients running queries: 25
  Average number of queries per client: 200
  平均每个并发运行200个查询用了3.507秒。
  Benchmark
  Average number of seconds to run all queries: 3.742 seconds
  Minimum number of seconds to run all queries: 3.742 seconds
  Maximum number of seconds to run all queries: 3.742 seconds
  Number of clients running queries: 50
  Average number of queries per client: 100
  Benchmark
  Average number of seconds to run all queries: 3.697 seconds
  Minimum number of seconds to run all queries: 3.697 seconds
  Maximum number of seconds to run all queries: 3.697 seconds
  Number of clients running queries: 100
  Average number of queries per client: 50
  User time 0.87, System time 0.33

  Maximum resident set>  Non-physical pagefaults 1877, Physical pagefaults 0, Swaps 0
  Blocks in 0 out 0, Messages in 0 out 0, Signals 0
  Voluntary context switches 27218, Involuntary context switches 3100
  看一下SHOW PROCESSLIST 结果
  mysql> show processlist;
  +------+------+--------------------+--------------------+---------+-------+--------------------+------------------------------------------------------------------------------------------------------+

  |>  +------+------+--------------------+--------------------+---------+-------+--------------------+------------------------------------------------------------------------------------------------------+
  …………
  | 3177 | root | %                  | t_girl             | Query   |     0 | NULL               | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  | 3178 | root | %                  | t_girl             | Query   |     0 | NULL               | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  | 3179 | root | %                  | t_girl             | Query   |     0 | NULL               | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  | 3181 | root | %                  | t_girl             | Query   |     0 | NULL               | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  | 3180 | root | %                  | t_girl             | Query   |     0 | NULL               | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  | 3182 | root | %                  | t_girl             | Query   |     0 | NULL               | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  | 3183 | root | %                  | t_girl             | Query   |     0 | NULL               | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  | 3187 | root | %                  | t_girl             | Query   |     0 | removing tmp table | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  | 3186 | root | %                  | t_girl             | Query   |     0 | NULL               | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  | 3194 | root | %                  | t_girl             | Query   |     0 | NULL               | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  | 3203 | root | %                  | t_girl             | Query   |     0 | NULL               | deallocate prepare s1                                                                                |
  …………
  | 3221 | root | %                  | t_girl             | Query   |     0 | NULL               | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  | 3222 | root | %                  | t_girl             | Query   |     0 | NULL               | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  | 3223 | root | %                  | t_girl             | Query   |     0 | NULL               | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  | 3224 | root | %                  | t_girl             | Query   |     0 | removing tmp table | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  | 3225 | root | %                  | t_girl             | Query   |     0 | NULL               | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  | 3226 | root | %                  | t_girl             | Query   |     0 | NULL               | select a.* from article as a inner join (select a.aid from article as a  inner join (select cid from |
  +------+------+--------------------+--------------------+---------+-------+--------------------+------------------------------------------------------------------------------------------------------+
  55 rows in set (0.00 sec)
  上面的测试语句其实也可以这样写
[root@localhost ~]# mysqlslap --defaults-file=/usr/local/mysql-maria/my.cnf --concurrency=25,50,100 --iterations=1 --create-schema='t_girl' --query='call sp_get_article(2,10,1);' --number-of-queries=5000 --debug-info -uroot -p -S/tmp/mysql50.sock  小总结一下。
  mysqlslap对于模拟多个用户同时对MySQL发起“进攻”提供了方便。同时详细的提供了“高负荷***MySQL”的详细数据报告。
  而且如果你想对于多个引擎的性能。这个工具再好不过了。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-602790-1-1.html 上篇帖子: Qt MySQL数据库编程 下篇帖子: mysql高可用MHA架构搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表