本帖最后由 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. MFC中UpdateData()函数的使用

    UpdateData(true); 用窗体上控件中的内容来更新和控件相关连的变量的值(只能更新value类型的变量) 例如:你在你的窗体中有一个Edit控件,为这个控件关联了CString类型的变量m ...

  2. php curl_multi系列函数实现多线程抓取网页

    最近几天在做一个多搜索引擎关键字排名查询工具,用于及时方便的了解关键词在各大搜索引擎的排名. 在抓取360搜索的时候,发现360搜索每页只支持显示10个搜索结果,如果想获取100个搜索结果数据,就得搜 ...

  3. [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 数据在mysq和hdfs之间的相互转换

    P573 从mysql导入数据到hdfs 第一步:在mysql中创建待导入的数据 1.创建数据库并允许所有用户访问该数据库 mysql -h 192.168.200.250 -u root -p CR ...

  4. CentOS执行ping命令报错 name or service not know

    在虚拟机上安装的CentOS,但是当执行ping命令的时候,提示name or service not known 解决方法如下: 1. 添加DNS服务器 vi /etc/resolv.conf 1 ...

  5. Ogre 编辑器三(自动生成与更新Ogre对象编辑界面)

    最开始设计这个编辑器时,其中一个要求就是能在运行过程中,通过UI来更新各对象,这样我们就能明确每个Ogre对象更新其属性影响的渲染效果.比如点光源,方向光源,聚光灯各属性与效果,深度测试开启与关闭,深 ...

  6. Opengl绘制我们的小屋(一)球体,立方体绘制

    这个系列我想用来运用opengl红皮书的前八章节的内容,来打造一个室内小屋. 这一章主要是定义几个基本的结构.并给出球体与立方体的画法,先让我们来定义一些基本的结构.一个是包含点,法向量,纹理贴图向量 ...

  7. Linux操作_grep/egrep工具的使用

    一.grep命令介绍 命令格式:grep [-cinvABC] ‘word’ filename,常用选项如下: -c:表示打印符合要求的行数. -i:表示忽略大小写. -n:表示输出符合要求的行及其行 ...

  8. Java数组排序和插入

    如何排序数组并插入元素? 以下示例显示如何使用sort()方法和用户定义的insertElement()方法来完成此任务. package com.yiibai; import java.util.* ...

  9. Spring JDBC配置数据源

    在本系列教程中,使用的的是MySQL数据库,并创建一个数据库实例:test,在这个数据库实例:test中创建一个表student.如果您使用任何其他数据库,则可以相应地更改DDL和SQL查询,这问题不 ...

  10. CI框架 -- 驱动器

    驱动器目录及文件结构 下面是驱动器目录和文件结构布局的简单例子: /application/libraries/Driver_name Driver_name.php //驱动器名称 drivers ...