本帖最后由 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. 微信小程序——时间戳的转换及调用

    开发微信小程序网盘功能模块的时候,需要获取到网盘文件夹创建的时间.如下图: 但是请求返回的数据是一段时间戳,如下图: 所以我们只能通过js把时间戳转换成时间格式. 在小程序官网的Demo的utils. ...

  2. css控制固定表头,兼容行列合并

    项目中设计的报表table设计的列数相对过多,当拖动下方的滚动条时无法对应表头所对应的列,因此在网上搜索了好一段日子,最后在网上找到了一些参考资料,然后总结归纳出兼容行列合并的固定表头demo. 多浏 ...

  3. Css格式化/压缩(代码)

    function $() { var elements = new Array(); for (var i = 0; i < arguments.length; i++) { var eleme ...

  4. 【吉比特】G-bits2018校园春季招聘技术类岗位笔试经验

    笔试公司:厦门吉比特网络技术股份有限公司 笔试岗位:游戏研发工程师 笔试时间:2018年3月30日19:00-20:30 笔试形式:牛客网在线做题 笔试回忆: 笔试总共时长1小时半,共52道题.其中选 ...

  5. discuz X论坛技术架构 MVC结构浅析

    摘自:http://yeyuan.iteye.com/blog/930727 PS:本人刚接触discuz论坛,php水平有限,当中的理解,如有不正确之处,欢迎指出 ----------------- ...

  6. Maven自动化部署

    在项目开发中,通常是部署过程包含以下步骤 检入代码在建项目全部进入SVN或源代码库中,并标记它. 从SVN下载完整的源代码. 构建应用程序. 生成输出要么WAR或EAR文件存储到一个共同的网络位置. ...

  7. TPshop隐藏index.php

    有些朋友提到关于TPshop 隐藏index.php 一问题, 可以修改 Application\Common\Conf\config.php 文件代码 'common', 'AUTH_CODE' = ...

  8. 嵌入式开发之hi3519---spi nor flash启动

    author:pkf qq:1327706646 1.官方hi3519默认是硬件3byte 地址模式,配置完ddr始终后,sdkv100.020是可以支持正常启动,用到低位16Mflash内存 2.如 ...

  9. Ubuntu 14.04 LTS 配置 Juno 版 Keystone

    keystone配置概况 采用包安装方式安装的keystone,重要的文件结构有如下: /etc/keystone/ - 包含keystone所有的配置信息 /var/log/keystone/ - ...

  10. hdu 2771(uva 12171) Sculpture bfs+离散化

    题意: 给出一些边平行于坐标轴的长方体,这些长方体可能相交.也可能相互嵌套.这些长方体形成了一个雕塑,求这个雕塑的整体积和表面积. 题解: 最easy想到直接进行bfs或者dfs统计,但此题的麻烦之处 ...