找回密码
 会员注册
查看: 9|回复: 0

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

[复制链接]

5

主题

0

回帖

16

积分

新手上路

积分
16
发表于 2024-10-7 14:39:11 | 显示全部楼层 |阅读模式
点击关注“有赞coder”获取更多技术干货哦~作者:杨一部门:DBA来源:爱可生开源社区一、前言响应时间(response time 简称 RT)是从系统接收请求开始到返回响应之间的时间跨度,是一项极其重要的性能指标。它可以从侧面反映系统的整体吞吐量,也是业务请求(比如 sql 请求)的性能好坏的判断依据。举个例子 A 要从杭州坐飞机到北京机场,经历如下:从公司到萧山机场 40min机场安检,候机,登机 40min飞机飞行 耗时 100min飞机落地,打的到望京 耗时40minRT= 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 tcprstattcprstat?是 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 5pcap: 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';常用的 sqlINFORMATION_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 响应时间的方法。如果有其他更好的方式方法,欢迎读者朋友一起讨论。扩展阅读深入浅出MySQL crash safe一次大量删除导致 MySQL 慢查的分析数据库连接池配置(案例及排查指南)工作流引擎在有赞 DevOps 中的实践Kubernetes 在有赞的实践有赞发号器多机房方案哪些因素会导致 MySQL 慢查询数据库连接配置策略和实践Vol.305
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 23:05 , Processed in 1.007132 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表