下面为脚本内容,注释挺详细,我想就无需多说了。
#!/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(一主一从和一主两从)进行的压测结果