本帖最后由 LUK 于 2014-9-21 22:39 编辑

思路:

1 关注MYSQL三个方面的性能指标,分别为query数,transaction数,io请求数

2 在某个时间范围内(例如20秒),统计MYSQL中上面的三个指标的总量,以及每一秒的量 ,同时每隔一秒种打印一个当前的指标量,在最后再计算并打印时间段内总量及每秒量

3 在IO的统计公式如下:
Key_reads  * 2 +  Key_writes * 2 + Key_read_requests + Innodb_data_reads + Innodb_data_writes + Innodb_dblwr_writes + Innodb_log_writes (该公式最早从taobaodba.com这个网上传出,这里学习借鉴)

key_reads 和 key_writes都乘以2的原因是因为如果从磁盘中读或写索引块之后会再去磁盘读或写数据块,所以就会有至少两倍的IO请求.
事务数总量为 com_commit+com_rollback
query数通过 com_select获取

4 虽然统计的时间范围可以自己指定(例如20秒),但最终计算每秒的指标量时,是以脚本开始执行时间至脚本执行结束时mysql uptime的时间差来算的,因为脚本执行会消耗一定时间,这样,实际的时间会多于我们指定的时间
(结束时的量-开始时的量)/(结束时uptime-开始时uptime)

#!/bin/bash

#filename mysqlgather.sh
#param
#N seconds
#s print query 
#t print transaction 
#i print mysql io
# example
# ./mysqlgather.sh 20 s t i

--脚本的名字为mysqlgather.sh,执行例子为 ./mysqlgather.sh 20 s t i  
其中20为取样的时间范围,在这里假设20s,这个时间参数必须要输入,时间大小可以自己定
s 表示要统计query及query per second (可选参数)
t 表示要统计transaction及transaction per second (可选参数)
i 表示要统计mysql中的io请求数及io per second (可选参数)

s t i 三个参数可以只输入其中任意一个或多个,可以只统计三个指标中的一个或者两个

如果三个参数都写或者都不写,表示都要统计s t i

--selecom函数取query数量
#qps

selcom ()
{
      mysql -uroot -e "show global status where variable_name in ('com_select');" > select.out
      SELECT_NUM=`grep -i "com_select"  select.out | awk '{print $2}'`

echo "com_select: $SELECT_NUM"
}

--trans_num函数 统计transaction数量
#tps

trans_num ()
{
     mysql -uroot -e "show global status where variable_name in('com_commit','com_rollback');" > transactions.out

COMMIT_NUM=`grep -i "com_commit"  transactions.out | awk '{print $2}'`
     ROLLBACK_NUM=`grep -i "com_rollback"  transactions.out | awk '{print $2}'`

SUM_TRAN=$[ $COMMIT_NUM1 + $ROLLBACK_NUM1 ]
     echo "transations:$SUM_TRAN"
}

--ionum函数统计io读写请求数

#IO

ionum ()
{
mysql -uroot -e "show global status where variable_name in('Key_reads','Key_writes','Key_read_requests','Innodb_data_reads','Innodb_data_writes','Innodb_dblwr_writes','Innodb_log_writes');" > iops.out
KEYREAD=`grep -i "Key_reads"  iops.out | awk '{print $2}'`
KEYWRITE=`grep -i "Key_writes"  iops.out | awk '{print $2}'`
READREQ=`grep -i "Key_read_requests"  iops.out | awk '{print $2}'`
DATAREAD=`grep -i "Innodb_data_reads"  iops.out | awk '{print $2}'`
DATAWRITE=`grep -i "Innodb_data_writes"  iops.out | awk '{print $2}'`
DBLWR=`grep -i "Innodb_dblwr_writes"  iops.out | awk '{print $2}'`
LOGWRITE=`grep -i "Innodb_log_writes"  iops.out | awk '{print $2}'`

SUM_IO=$[ $KEYREAD * 2 + $KEYWRITE * 2 + $READREQ + $DATAREAD + $DATAWRITE + $DBLWR + $LOGWRITE ]
echo "io:$SUM_IO"
}

--up_time函数是统计MYSQL启动后的时间
#uptime
up_time ()
{
      mysql -uroot -e "show global status where variable_name in ('Uptime');" > uptime.out
     UP_TIME=`grep -i "Uptime"  uptime.out | awk '{print $2}'`
}

--下面的程序逻辑是先检查输入了哪些参数,再计算所想要统计的指标
NUM_PARM=$#

if [ $NUM_PARM = 1 ];then
PARM1=$1
up_time
UP_TIME1=$UP_TIME
selcom
SELECT_NUM1=$SELECT_NUM
trans_num
SUM_TRAN1=$SUM_TRAN
ionum
SUM_IO1=$SUM_IO

sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do 
selcom
trans_num
ionum
PARM1=$[ $PARM1 - 1]
sleep 1
done
SELECT_NUM2=$SELECT_NUM
SUM_TRAN2=$SUM_TRAN
SUM_IO2=$SUM_IO
up_time
UP_TIME2=$UP_TIME

--统计时间范围内的总量
SELECT_DIFF=$[ $SELECT_NUM2 - $SELECT_NUM1 ]
TRANS_DIFF=$[ $SUM_TRAN2 - $SUM_TRAN1 ]
IO_DIFF=$[ $SUM_IO2 - $SUM_IO1 ]

TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]

--统计每秒的量
SELECT_PERSECOND=$[ $SELECT_DIFF / $TIME_DIFF]
TRANS_PERSECOND=$[ $TRANS_DIFF / $TIME_DIFF]
IOREQ_PERSECOND=$[ $IO_DIFF / $TIME_DIFF]
echo -n "sel_s:$SELECT_PERSECOND; trans_s:$TRANS_PERSECOND; io_s:$IOREQ_PERSECOND"
elif [ $NUM_PARM = 2 ];then
PARM1=$1
PARM2=$2

case $PARM2 in 
"s")
up_time
UP_TIME1=$UP_TIME
selcom
SELECT_NUM1=$SELECT_NUM

sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do 
selcom
PARM1=$[ $PARM1 - 1]
sleep 1
done
SELECT_NUM2=$SELECT_NUM
up_time
UP_TIME2=$UP_TIME
SELECT_DIFF=$[ $SELECT_NUM2 - $SELECT_NUM1 ]
TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]
SELECT_PERSECOND=$[ $SELECT_DIFF / $TIME_DIFF]
echo -n "sel_s:$SELECT_PERSECOND;"

;;

"t")
PARM1=$1
up_time
UP_TIME1=$UP_TIME
trans_num
SUM_TRAN1=$SUM_TRAN
sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do 
trans_num
PARM1=$[ $PARM1 - 1]
sleep 1
done
SUM_TRAN2=$SUM_TRAN
up_time
UP_TIME2=$UP_TIME
TRANS_DIFF=$[ $SUM_TRAN2 - $SUM_TRAN1 ]
TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]
TRANS_PERSECOND=$[ $TRANS_DIFF / $TIME_DIFF]
echo -n " trans_s:$TRANS_PERSECOND; "

;;

"i")
PARM1=$1
up_time
UP_TIME1=$UP_TIME

ionum
SUM_IO1=$SUM_IO

sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do

ionum
PARM1=$[ $PARM1 - 1]
sleep 1
done

SUM_IO2=$SUM_IO
up_time
UP_TIME2=$UP_TIME
IO_DIFF=$[ $SUM_IO2 - $SUM_IO1 ]
TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]
IOREQ_PERSECOND=$[ $IO_DIFF / $TIME_DIFF]
echo -n " io_s:$IOREQ_PERSECOND"

;;

*)
exit;
esac

elif [ $NUM_PARM = 3 ];then
PARM1=$1
PARM2=$2
PARM3=$3

if [ $PARM2 = "s" ] || [ $PARM2 = "t" ] && [ $PARM3 = "s" ] || [ $PARM3 = "t" ]; then
PARM1=$1
up_time
UP_TIME1=$UP_TIME
selcom
SELECT_NUM1=$SELECT_NUM
trans_num
SUM_TRAN1=$SUM_TRAN
sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do 
selcom
trans_num
PARM1=$[ $PARM1 - 1]
sleep 1
done
SELECT_NUM2=$SELECT_NUM
SUM_TRAN2=$SUM_TRAN
up_time
UP_TIME2=$UP_TIME

SELECT_DIFF=$[ $SELECT_NUM2 - $SELECT_NUM1 ]
TRANS_DIFF=$[ $SUM_TRAN2 - $SUM_TRAN1 ]

TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]
SELECT_PERSECOND=$[ $SELECT_DIFF / $TIME_DIFF]
TRANS_PERSECOND=$[ $TRANS_DIFF / $TIME_DIFF]
echo -n "sel_s:$SELECT_PERSECOND; trans_s:$TRANS_PERSECOND;"

elif [ $PARM2 = "s" ] || [ $PARM2 = "i" ] && [ $PARM3 = "s" ] || [ $PARM3 = "i" ];

PARM1=$1
up_time
UP_TIME1=$UP_TIME
selcom
SELECT_NUM1=$SELECT_NUM
ionum
SUM_IO1=$SUM_IO

sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do 
selcom
ionum
PARM1=$[ $PARM1 - 1]
sleep 1
done
SELECT_NUM2=$SELECT_NUM
SUM_IO2=$SUM_IO
up_time
UP_TIME2=$UP_TIME

SELECT_DIFF=$[ $SELECT_NUM2 - $SELECT_NUM1 ]
IO_DIFF=$[ $SUM_IO2 - $SUM_IO1 ]

TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]
SELECT_PERSECOND=$[ $SELECT_DIFF / $TIME_DIFF]
IOREQ_PERSECOND=$[ $IO_DIFF / $TIME_DIFF]
echo -n "sel_s:$SELECT_PERSECOND;  io_s:$IOREQ_PERSECOND"
else
PARM1=$1
up_time
UP_TIME1=$UP_TIME
trans_num
SUM_TRAN1=$SUM_TRAN
ionum
SUM_IO1=$SUM_IO

sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do 
trans_num
ionum
PARM1=$[ $PARM1 - 1]
sleep 1
done
SUM_TRAN2=$SUM_TRAN
SUM_IO2=$SUM_IO
up_time
UP_TIME2=$UP_TIME
TRANS_DIFF=$[ $SUM_TRAN2 - $SUM_TRAN1 ]
IO_DIFF=$[ $SUM_IO2 - $SUM_IO1 ]

TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]
TRANS_PERSECOND=$[ $TRANS_DIFF / $TIME_DIFF]
IOREQ_PERSECOND=$[ $IO_DIFF / $TIME_DIFF]
echo -n " trans_s:$TRANS_PERSECOND; io_s:$IOREQ_PERSECOND"
fi
elif [ $NUM_PARM = 4 ];then
PARM1=$1
PARM2=$2
PARM3=$3
PARM4=$4
up_time
UP_TIME1=$UP_TIME
selcom
SELECT_NUM1=$SELECT_NUM
trans_num
SUM_TRAN1=$SUM_TRAN
ionum
SUM_IO1=$SUM_IO
sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do 
selcom
trans_num
ionum
PARM1=$[ $PARM1 - 1]
sleep 1
done
SELECT_NUM2=$SELECT_NUM
SUM_TRAN2=$SUM_TRAN
SUM_IO2=$SUM_IO
up_time
UP_TIME2=$UP_TIME

SELECT_DIFF=$[ $SELECT_NUM2 - $SELECT_NUM1 ]
TRANS_DIFF=$[ $SUM_TRAN2 - $SUM_TRAN1 ]
IO_DIFF=$[ $SUM_IO2 - $SUM_IO1 ]

TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]

SELECT_PERSECOND=$[ $SELECT_DIFF / $TIME_DIFF]
TRANS_PERSECOND=$[ $TRANS_DIFF / $TIME_DIFF]
IOREQ_PERSECOND=$[ $IO_DIFF / $TIME_DIFF]
echo -n "sel_s:$SELECT_PERSECOND; trans_s:$TRANS_PERSECOND; io_s:$IOREQ_PERSECOND"

else
echo "You have not input any parameter!";
exit;
fi

转载用sql语句计算出mysql数据库的qps,tps,iops性能指标的更多相关文章

  1. [转载]编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数

    [转载]编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数 转载自:https://blog.csdn.net/one_money/article/details/56921 ...

  2. Python将JSON格式数据转换为SQL语句以便导入MySQL数据库

    前文中我们把网络爬虫爬取的数据保存为JSON格式,但为了能够更方便地处理数据.我们希望把这些数据导入到MySQL数据库中.phpMyadmin能够把MySQL数据库中的数据导出为JSON格式文件,但却 ...

  3. sql语句计算出每个月的天数

    原文:sql语句计算出每个月的天数   从当前月-11个月开始,到当前月为止,用一个sql语句计算出每个月的天数. SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-LEVEL+1 ...

  4. 42.通过原生SQL语句进行操纵mysql数据库

    views.py文件中: from django.shortcuts import render # 导入connection模块 from django.db import connection d ...

  5. mysql数据库使用sql命令窗口查询的数据,改成sql语句导入到mysql数据库中

    1.查询语句为select * from t_table;导出的数据格式如下: 2.将数据文本备份,然后使用NOTEPAD++打开,然后只拷贝数据到新建txt中,然后进行如下替换: 1)将“ | ”分 ...

  6. sql语句备份/导入 mysql数据库或表命令

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq1355541448/article/details/30049851

  7. mysql性能监控qps,tps,iops

    qps 每秒处理的查询数tps 每秒处理的事务数IOPS,每秒磁盘进行的I/O操作次数 给个方法或者思路,用啥工具或者命令,如何看,值是多少属于正常范围之内呢? Information from we ...

  8. delphi连接sql server数据库,并根据sql语句查询出数据显示--初级

    需要用到四个组件,分别为: 1.ADOConnection1 设置Connectionstring属性(连接串),loginPrompt属性控制是否连接记住了密码: 2.ADOQuery1 设置Con ...

  9. SQL语句计算距离今天生日还差几天

    转载于:http://www.w3dev.cn/article/20110125/sql-compute-birthdate-now-days.aspx SQL语句计算距离生日还差几天原理很简单,将要 ...

随机推荐

  1. CSS Notes

    Margin vs. PaddingMargin is on the outside of block elements while padding is on the inside. Use mar ...

  2. Java 应该被记住的8位大人物

    这里列举了 8 个 Java 人物,他们创建了对 Java 社区贡献很大的框架.产品.工具和图书,也因此改变了 Java 的编码方法. 8. Tomcat 和 Ant 创办人 James Duncan ...

  3. Python 类的多态的运用

    #类的多态的运用 #汽车类 class Car(object): def move(self): print("move ...") #汽车商店类 class CarStore(o ...

  4. About darwin OS

    Darwin 是一种Unix-like操作系统,整合数种的技术,包含开 Darwin LOGO 放原始码的XNU核心,一种以微核心为基础的核心架构来实作Machkernel.操作系统的服务和userl ...

  5. JAVA平台在手机上广泛应用

    JAVA平台由于在手机上广泛应用,使得扩展名为jar的游戏成为目前手机游戏市场上最大的家族,直接传入手机直接安装即可. 众所周知,JAVA是一种跨平台的程序设计语言.由于其高可移植性.简单.可靠.安全 ...

  6. 为什么运行PHP就会出现404错误?

    2007-05-09 12:40Googfox | 分类:浏览器 | 浏览8146次 我在IIS中安装了Zend Core 2.0,IIS中用主机头值设置了许多80端口的网站,但是不管在这些网站中的哪 ...

  7. Android 4.4从图库选择图片,获取图片路径并裁剪

    转至 http://blog.csdn.net/tempersitu/article/details/20557383 最近在做一个从图库选择图片或拍照,然后裁剪的功能.本来是没问题的,一直在用 In ...

  8. C#.NET MVC 枚举转dictionary自动装载生成下拉框

      /// <summary> /// 枚举转SelectListItem /// </summary> public class Enum_Helper { /// < ...

  9. Xianfeng轻量级Java中间件平台:用户管理

    用户管理:简单地说,就是管理系统用户的账号信息.在典型的业务系统中,用户管理往往不包含用户隶属组织机构相关属性(比如部门.岗位等)的维护,而是由组织机构管理专门去维护.因此在用户管理的功能中,主要就维 ...

  10. 9款赏心悦目的HTML5/CSS3应用特效

    经过几天的收集,在html5tricks网站上又增加了不少HTML5的教程和应用,今天我把几款赏心悦目的HTML5/CSS3应用特效总结了一下,一共9款HTML5特效,分享给大家. 1.HTML5 W ...