0.5的MySQL自动化压测及分析方案(2)

下面为脚本内容,注释挺详细,我想就无需多说了。

#!/bin/sh #定义记录测试结果的mysql的连接相关参数,本例我在测试机上记录测试结果 m_user='test' m_passwd='test' m_port='3307' m_host='127.0.0.1' #定义测试线程 threds_num='4 8 16 32 48 64 96 128 160' #测试函数 sb_test() {   #定义测试方式相关变量   tables_count=16    #测试表的数量   if [ "$2" == "read-only" ];then read_only='on';else read_only='off';fi    #根据脚本参数确定是否read-only   echo -e "\n---------------\n测试$3, $2模式\n---------------"   for i in 1 2 3;do    #开始测试,每种条件测3次,分析时取平均值     echo     for sb_threds in $threds_num;do    #按照指定的sysbench线程测试       printf "  %-10s %s\n" $sb_threds线程 第$i次运行...             #result 作为每次最小测试单元的结果,根据sysbench测试结果各参数的出现顺序,以request_read、request_write、request_total、request_per_second、total_time、95_pct_time为顺序插入表中。下条命令中,egerp之后的操作是为了对sysbench的输出做筛选和格式化,以便插入数据库       result=$(sysbench --test=/usr/share/doc/sysbench/tests/db/oltp.lua --mysql-user=$5 --mysql-password=$6 --mysql-port=$4 --mysql-host=$3 \                --oltp-tables-count=$tables_count --num-threads=$sb_threds run --oltp-skip-trx=on --oltp-read-only=$read_only  |  \                egrep -w "read|write|read/write|total\ time:|approx"|awk '{printf $0}'|tr -s [:space:]| \                sed -e 's/approx\.\ 95//g' -e 's/sec\.//g' -e 's/[a-zA-Z:\(\)/]//g'|sed "s/[^ ]\+/'&',/g"|sed 's/,$//g')           #测试完成后立刻记录系统一分钟负载值,可近似认为测试过程中的负载抽样       load=$(ssh -p1022 $3 "uptime|awk -F: '{print \$NF}'|awk -F, '{print \$1}'")       #创建记录测试信息的表       mysql -u$m_user -p$m_passwd -P$m_port -h$m_host <<EOF 2> /dev/null       CREATE TABLE IF NOT EXISTS test.sysbench_test (         server_name varchar(15) NOT NULL COMMENT '被测DB name',         test_type varchar(15) NOT NULL COMMENT 'read-only,read-write,insert等',         sb_threads int(11) NOT NULL DEFAULT '0' COMMENT 'sysbench 测试线程',         server_load decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '以当前线程测试完后立刻记录一分钟负载值',         request_total int(11) NOT NULL DEFAULT '0',         request_read int(11) NOT NULL DEFAULT '0',         request_write int(11) NOT NULL DEFAULT '0',         request_per_second decimal(12,2) NOT NULL DEFAULT '0.00',         total_time decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '单位秒',         95_pct_time decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '单位毫秒'       ) ENGINE=InnoDB DEFAULT CHARSET=utf8; EOF       #本次测试结果写入数据库       mysql -u$m_user -p$m_passwd -P$m_port -h$m_host <<EOF 2> /dev/null       INSERT INTO test.sysbench_test (server_name,test_type,sb_threads,server_load,request_read,request_write,request_total,request_per_second,total_time,95_pct_time)        VALUES ('$3','$2','$sb_threds','$load',$result); EOF           if [ $? -ne 0 ];then           echo "\n----------$sb_threds线程测试,第$i次插入数据库时失败----------"           exit -2       fi       sleep 60    #让库歇一会,也让一分钟负载能够恢复到测试前的值     done       done } #结果分析函数 sb_analyse() {   mysql -u$m_user -p$m_passwd -h$m_host -P$m_port  <<EOF   SELECT      server_name,     test_type,     sb_threads,     convert(avg(server_load),decimal(12,2)) as server_load,     convert(avg(request_total),decimal(12,0)) as request_total,     convert(avg(request_read),decimal(12,0)) as request_read,     convert(avg(request_write),decimal(12,0)) as request_write,     convert(avg(request_per_second),decimal(12,2)) as request_per_second,     convert(avg(total_time),decimal(12,2)) as total_time,     convert(avg(95_pct_time),decimal(12,2)) as 95_pct_time   FROM test.sysbench_test where sb_threads in ($(echo $threds_num|sed -e 's/[^ ]\+/&,/g' -e 's/,$//g')) group by server_name,test_type,sb_threads EOF } #脚本使用说明/参数判断(这里我小偷懒了一下,对输入只做了些基本的判断) if [ $# -eq 0 ];then   echo -e "\n---------------------------------------"   echo -e "测试:请在脚本后跟上 test  test_type  mysql_host  mysql_port  mysql_user  mysql_password 6个参数 !"   echo -e "    test_type: read-only 或 read-write, 表示测试模式"   echo -e "    其余4参数表示待测试MySQL连接相关信息,密码若包含特殊字符,将其置于单引号内"   echo -e "---------------------------------------"   echo -e "分析:请在脚本后跟上 analyse"   echo -e "---------------------------------------\n"   exit -1 elif [ "$1" == "test" ] & [ $# -eq 6 ];then   sb_test $1 $2 $3 $4 $5 $6 elif [ "$1" == "analyse" ] & [ $# -eq 1 ];then   sb_analyse else   echo -e "参数不正确,请检查" fi ### by ljk 2016/3/1

结果分析

sh /root/shells/mysql_oltp_test.sh analyse

将打印出的结果复制到记事本,然后作为数据源导入到excel中,即可按需作图啦(暂时没能引用gnuplot直接将结果绘制成图,再次小遗憾一下!)

分享一下我对单台mysql和atlas(一主一从和一主两从)进行的压测结果

0.5的MySQL自动化压测及分析方案

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7c98ec2425b6f8a18ad50af019a5071b.html