如何正确理解 RT 并监控 MySQL 的响应时间

标签: 正确 理解 rt | 发表时间:2020-06-13 14:05 | 作者:杨一
出处:https://www.infoq.cn

一、前言

响应时间(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 响应时间的方法。如果有其他更好的方式方法,欢迎读者朋友一起讨论。

本文转载自公众号有赞coder(ID:youzan_coder)。

原文链接

https://mp.weixin.qq.com/s?__biz=MzAxOTY5MDMxNA==&mid=2455760851&idx=1&sn=9b3e3fc9e294864967b16ccfbf81abf4&chksm=8c6869f6bb1fe0e0551835aa299c90481e1c14fa0cf9d512044e01e358b737058cb1d075962a&scene=27#wechat_redirect

相关 [正确 理解 rt] 推荐:

如何正确理解 RT 并监控 MySQL 的响应时间

- - InfoQ推荐
响应时间(response time 简称 RT)是从系统接收请求开始到返回响应之间的时间跨度,是一项极其重要的性能指标. 它可以从侧面反映系统的整体吞吐量,也是业务请求(比如 sql 请求)的性能好坏的判断依据. 举个例子 A 要从杭州坐飞机到北京机场,经历如下:. 从公司到萧山机场 40min 机场安检,候机,登机 40min 飞机飞行 耗时 100min 飞机落地,打的到望京 耗时40min RT= 40 + 40 + 100 + 40 =220min.

正确理解ThreadLocal

- - Java - 编程语言 - ITeye博客
转自: http://www.iteye.com/topic/103804. 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的. 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本.

Surface RT全方位评测

- - 创意科技 - 果壳网
Surface是微软推出的第一款平板设备,也是微软全新操作系统Windows 8的硬件寄托之一,所以我们对这款设备的评测容不得一点点的马虎. 微软在今年六月洛杉矶的发布会上推出了这款标新立异的产品,它融合笔记本电脑和平板为一身,不仅是市场上从未出现过的设备,也是微软试水个人电脑市场的第一步. Surface RT的出现让原本已经热闹非凡的平板市场又增添了一员.

华硕不再生产Windows RT平板

- - Solidot
华硕电周五表示,由于销售疲软,该公司不再生产Windows RT平板电脑. 华硕首席执行长沈振来表示,这不仅是华硕一家公司的意见,整个行业对Windows RT的不成功也有同感. 沈振来说,由于Windows RT缺乏向后兼容性,华硕将生产只使用英特尔芯片的Windows 8设备. 华硕第二季度财报对Windows RT平板业务进行了减记,此前微软的Surface平板电脑业务减记高达9亿美元,上市至今仅售出一百多万部.

正确理解javascript的this关键字

- BeerBubble - 三水清
javascript有this关键字,this跟javascript的执行上下文密切相关,很多前端开发工程师至今对this关键字还是模棱两可,本文将结合代码讲解下javascript的this关键字. 定义了一个person对象,对象中包含了name、gender属性,还包括了一个getName的方法,其作用是输出person对象的name.

喜忧参半 Windows Surface RT平板国外评测总结

- - 爱活网最新资讯
毫无疑问,对于现在的微软来说,Surface平板电脑是极为重要的产品,它不但要肩负起狙击谷歌和苹果的重任,也是微软大统一平台战略的重要组成部分,还是Windows 8众多合作伙伴的引路灯,它的成败直接关系着Windows 8/Windows RT在移动领域的前景. 由于时差的关系,国外不少媒体已经抢先拿到了Surface平板电脑,它真能像微软广告中那样表现完美吗.

宏碁:目前生产Windows RT平板电脑没有意义

- - 博客园_新闻
北京时间 5 月 5 日消息,据国外媒体报道,宏碁要等到今年下半年新版 Windows RT 发布后才决定是否生产运行 Windows RT 的平板电脑. 宏碁总裁翁建仁(Jim Wong)周五在新产品发布会上说,“Windows RT 平板电脑计划仍然在进行中. ”宏碁原计划第二季度发布一款 Windows RT 平板电脑,但现在决定推迟发布时间.

国外媒体唱衰:Windows RT必死的7大理由

- - 业界
2012年,微软杀手锏产品当属基于ARM处理器的Windows RT平板系统,而非Windows 8系统. 但前者自发布以来,就受到了相当程度的争议. 前者相比Windows 8的定位、宣传和功能并无明显区别,在Windows 8的阴影下,Windows RT处境将为尴尬. 起初,微软是指望Windows RT能从苹果iPad手中抢夺市场份额,但结果事与愿违.

谈正确理解 CAP 理论[转自网络]

- - 互联网 - ITeye博客
转载自:http://www.douban.com/group/topic/11765014/. CAP 理论在搞分布式的程序员中已经是路人皆知了. 但是 CAP 理论就好比是相对论,虽然所有的人都知道,但是却没有多少人真正理解. 要真正理解 CAP 理论必须要读懂它的形式化描述. 形式化描述中最重要的莫过于对 Consistency, Availability, Partition-tolerance 的准确定义.