点击关注“有赞coder”

获取更多技术干货哦~

作者:杨一

部门:DBA

来源:爱可生开源社区

一、前言响应时间(response time 简称 RT)是从系统接收请求开始到返回响应之间的时间跨度,是一项极其重要的性能指标。它可以从侧面反映系统的整体吞吐量,也是业务请求(比如 sql 请求)的性能好坏的判断依据。举个例子 A 要从杭州坐飞机到北京机场,经历如下:

从公司到萧山机场 40min

机场安检,候机,登机 40min

飞机飞行 耗时 100min

飞机落地,打的到望京 耗时40min

RT= 40 + 40 + 100 + 40 =220min

其中真正的 '执行' 时间就飞机飞行的时间(100min+40+40),其他安检、候机、堵车的都是等待时间。

RT = 等待时间 + 执行时间

假如到机场的过程中发生堵车,或者空中管制导致候机时间延长,整体的 RT 也会变长,但是飞机飞行时间是相对一定的。从技术的角度来看 SQL 的请求路径:

app (网络建立连接,data 传输) proxy (网络建立连接,data 传输) mysql(执行)

因为网络问题丢包,重传等导致数据传输时间增加,进而导致总体的 RT 时间增加 ,还有常见的案例 app 服务器 cpu 飙高导致程序执行的速度变慢,JAVA 程序 GC 等因素也会导致 RT 升高。所以说 SQL 慢,其实 RT 就会高。但是反过来 RT 高,不一定是 SQL 慢的原因。如果是开发同学遇到监控尤其是 trace 系统发现某个接口慢了,并不一定是 SQL 慢。

重点:不要把 trace 系统中的监控 rt 直接当做 db 的执行时间

参考案例:Strace 解决性能问题案例一则二、如何监控

前面说了 RT 的定义以及它所代表意义。接下来我们看看如何监控数据库的 RT ,现有的方式主要有两种。

2.1 tcprstat

tcprstat 是 Percona 基于 libpcap 研发的工具,是通过测量 TCP 的 request 和 response 所需的时间间隔,适用于一问一答式协议类型的处理。通常用来监测 MySQL 响应时间,或者说是请求在服务器端的处理时间,其输出结果包括了响应时间相关的统计值,用来诊断服务器端性能状况。

举个例子:

其输出结果包括了时间戳,以及响应时间的最大值、均值、方差等信息,输出信息可以通过 -f 参数进行定制,其中响应时间的单位为微妙。其中对我们比较重要的是:

count:此间隔内处理完成的请求数量。

avg:此间隔内所有完成的请求,响应的平均时间。

95_avg:此间隔内,95% 的请求量的平均响应时间,单位微妙,该值较能体现 MySQL Server 的查询平均响应时间。

如果我们只需要输出 count, 平均时间, 95_avg, 99_avg 则可以用如下命令。tcprstat -p 3312 -t 1 -n 0 -l ip_address -f '%T\t%n\t%a\t%95a\t%99a\n'

关于 -f 的参数解释如下,读者朋友可以根据需要来调整输出

如果执行 tcprstat 遇到如下问题:

# tcprstat -p 3312 -t 1 -n 5

pcap: SIOCGIFFLAGS: bonding_masters: No such device

可以通过指定本地 ip -l local_ip 来解决。2.2 MySQL 插件Percona Server 提供一个叫做响应时间区间的功能,将 sql 耗时在指定区间的请求次数和总共的执行时间记录到表里面。其中时间区间跨度由 query_response_time_range_base 控制。常用的区间范围为:(0, 0.000001], (0.000001, 0.000010],(0.000010,0.000100],(0.000100,0.001000],(0.001000, 0.010000], (0.010000,0.100000],(0.100000,1.000000],(1,10] 。从 MySQL 5.6 开始以插件形式安装:

INSTALL PLUGIN QUERY_RESPONSE_TIME_AUDIT SONAME 'query_response_time.so';

INSTALL PLUGIN QUERY_RESPONSE_TIME SONAME 'query_response_time.so';

INSTALL PLUGIN QUERY_RESPONSE_TIME_READ SONAME 'query_response_time.so';

INSTALL PLUGIN QUERY_RESPONSE_TIME_WRITE SONAME 'query_response_time.so';

然后通过 show plugins 命令检查插件是否安装成功。

> SHOW PLUGINS;

......

| QUERY_RESPONSE_TIME | ACTIVE | INFORMATION SCHEMA | query_response_time.so | GPL |

| QUERY_RESPONSE_TIME_AUDIT | ACTIVE | AUDIT | query_response_time.so | GPL |

| QUERY_RESPONSE_TIME_READ | ACTIVE | INFORMATION SCHEMA | query_response_time.so | GPL |

| QUERY_RESPONSE_TIME_WRITE | ACTIVE | INFORMATION SCHEMA | query_response_time.so | GPL |

+-----------------------------+----------+--------------------+------------------------+---------

安装完成之后 在 INFORMATION_SCHEMA生成三张表

QUERY_RESPONSE_TIME_WRITE 记录所有写请求的响应时间分布

QUERY_RESPONSE_TIME_READ 记录所有读请求的响应时间分布

QUERY_RESPONSE_TIME 可以认为是所有请求的响应时间分布。

查看 QUERY_RESPONSE_TIME 的内容

查询结果中 717 个 sql 请求耗时在 (0, 0.000001] 之间。47898 个 sql 请求的耗时在 (0.000001, 0.000010],总耗时 0.29 秒,其他以此类推。需要注意的是 count 和total是累计值,监控的时候需要取后值减前值除以采样的时间间隔。如何开启响应时间统计在命令行中执行

SET GLOBAL query_response_time_stats = 1 ;

在 my.cnf 中

query_response_time_stats = 1

重置(将数据清零)三张表的统计值

SET GLOBAL query_response_time_flush='ON';

常用的 sql

INFORMATION_SCHEMA [RW][TEST:qa_single_0:3312] 11:50:44

>SELECT c.count, c.time, (SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0) as query_count, (SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as b WHERE b.count != 0) as not_zero_region_count, (SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME) as region_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count > 0;

+-------+----------------+-------------+-----------------------+--------------+

| count | time | query_count | not_zero_region_count | region_count |

+-------+----------------+-------------+-----------------------+--------------+

| 1 | 0.000001 | 71370 | 7 | 14 |

| 86 | 0.000010 | 71370 | 7 | 14 |

| 47375 | 0.000100 | 71370 | 7 | 14 |

| 23404 | 0.001000 | 71370 | 7 | 14 |

| 423 | 0.010000 | 71370 | 7 | 14 |

| 79 | 0.100000 | 71370 | 7 | 14 |

| 2 | 1.000000 | 71370 | 7 | 14 |

+-------+----------------+-------------+-----------------------+--------------+

7 rows in set (0.00 sec)

通过监控脚本获取响应时间的数据在 grafna 展示的结果如下:

其他更详细的介绍可以去查阅 Percona 的官方文档。三、小结

本文总结介绍 RT 在技术体系中的含义,以及介绍两种监控 MySQL 响应时间的方法。如果有其他更好的方式方法,欢迎读者朋友一起讨论。

扩展阅读

  1. 深入浅出MySQL crash safe
  2. 一次大量删除导致 MySQL 慢查的分析
  3. 数据库连接池配置(案例及排查指南)
  4. 工作流引擎在有赞 DevOps 中的实践
  5. Kubernetes 在有赞的实践
  6. 有赞发号器多机房方案
  7. 哪些因素会导致 MySQL 慢查询
  8. 数据库连接配置策略和实践

Vol.305

mysql判断时间是否在某个区间_如何正确理解 RT 并监控 MySQL 的响应时间相关推荐

  1. mysql 判断日期是否在某范围内_判断时间是否在某个区间内

    private bool IsInTimeInterval(DateTime time, DateTime startTime, DateTime endTime) { //判断时间段开始时间是否小于 ...

  2. mysql当前时间往后推一周_一篇文章搞定Mysql日期时间函数

    前言 日期和时间函数部分也是我们日常工作中使用频率比较高的一部分.这一篇我们主要讲讲mysql里面的日期时间相关的函数,不同数据库之间基本相同,只会有个别函数的差异.大家掌握一个数据库的,其他的遇到不 ...

  3. mysql内连接运算量会增加多少_新年手打,40道经典MYSQL面试干货,速来收藏

    MySQL 面试题 1.MySQL 中有哪几种锁? 1.表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最 高,并发度最低. 2.行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发 ...

  4. 在mysql中创建表的命令行_如何在命令行创建一个MySQL数据库

    展开全部 第一步:安装MySQL客户端 当然你得确保MySQL客户端已经安装完毕.如果没有的话,可以按62616964757a686964616fe59b9ee7ad9431333339653663照 ...

  5. mysql 自增 不是主键_程序员经典面试题,MySQL自增主键为什么不连续

    在我们日常使用Mysql中,如果不是特殊的业务需要,一般我们都会使用自增主键,自增主键的好处可以在插入的时候尽量地减少页分割,增加Mysql的写入效率.我们有时候就会发现,自增主键并不是连续递增的,为 ...

  6. mysql把用户权限授予新用户_如何创建新用户和授予MySQL中的权限

    什么是红色表示 用户需要输入或定制的生产线将在红色在本教程! 其余的应该主要是复制和粘贴. 关于MySQL MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据. 它有多种选项来授予 ...

  7. mysql某字段值转成大写_获取字段值,并使用MySQL将其转换为大写

    让我们首先创建一个表-mysql> create table DemoTable1897 ( Name varchar(20) ); 使用插入命令在表中插入一些记录-mysql> inse ...

  8. mysql命令远程连接cmd命令行_如何从Windows命令提示符连接到mysql命令行

    如何从Windows命令提示符连接到mysql命令行 我正在尝试从Windows提示符下连接到mysql服务器命令行 我在cmd中写下一行,但出现错误. cd C:\MYSQL\bin\ 然后我执行 ...

  9. mysql查询时间类型c语言处理_资讯类app用户热度及资讯类型分析-Mysql进行数据预处理...

    本文是"资讯类app用户热度及资讯类型分析"一文中,Mysql进行数据预处理的部分.因为篇幅可能比较长,而且摘出来不会过于影响原文分析思路,所以这里单独进行介绍.(本文前四部分与正 ...

  10. js判断时间是早上还是下午_测血糖别在下午,测空腹血糖早上几点最准确?

    理想的血糖控制应该是全天候的,包括:空腹(餐前).餐后.体力活动和工作中.睡眠等时段.因血糖是经常波动的,但又不可能每天随时随地测血糖,建议隔半个月左右进行一次较全面的血糖检测,作为指导治疗和判断治疗 ...

最新文章

  1. [asp.net core]SignalR一个例子
  2. android从服务端获取json解析显示在客户端上面,Android服务端获取json解析显示在客户端上面.doc...
  3. Cissp-【第4章 通信与网络安全】-2021-3-14(476页-542页)
  4. CRITICAL_SECTION的详细说明
  5. struts-config.xml 中 action 与 forward 的重要属性
  6. SAP S/4HANA生产订单创建时使用的工厂数据是从什么地方带出来的 1
  7. aop java 接口_Spring AOP实现接口验签
  8. OpenJudge 8782 乘积最大——S.B.S
  9. Java 1.1.2 字符串之拼接
  10. 使用C#在应用程序间发送消息
  11. SQL tp3.2 批量更新 saveAll
  12. 仿listBox写了一个Control控件为item的列表集合
  13. 凸集、锥、凸锥、正常锥的辨析
  14. 天池客流预测–GBDT
  15. [有源滤波器]Sallen-key开关电容电路(二阶低通滤波器)
  16. android ndk adk 旧版本下载
  17. PowerApps中应用如何显示用户详细信息
  18. Swift游戏实战-跑酷熊猫 09 移除场景之外的平台
  19. 紧急通知,1秒下达给员工 | 巴别鸟 V5.0上线
  20. 简单的回显客户端/服务器应用

热门文章

  1. 17.Zend_View
  2. 56. magento 判断 https or http
  3. matlab 切比雪夫逼近,切比雪夫等波纹逼近.PDF
  4. Js显示Struts2中的内容之escape和escapeHtml
  5. 《学习之道》第六章补充
  6. nginx配置openssl证书
  7. bzoj1003[ZJOI2006]物流运输
  8. ShopNc实例化对象
  9. cocos2d-js 开发常用方法
  10. 浅析jQuery源码