MySQL性能监控全掌握,快来get关键指标及采集方法!

这篇具有很好参考价值的文章主要介绍了MySQL性能监控全掌握,快来get关键指标及采集方法!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据库中间件监控实战,MySQL中哪些指标比较关键以及如何采集这些指标了。帮助提早发现问题,提升数据库可用性。

MySQL性能监控全掌握,快来get关键指标及采集方法!

1 整体思路

监控哪类指标?

如何采集数据?

第10讲监控方法论如何落地?

这些就可以在MySQL中应用起来。MySQL是个服务,所以可借用Google四个黄金指标解决问题:

MySQL性能监控全掌握,快来get关键指标及采集方法!

1.1 延迟

应用程序会向MySQL发起SELECT、UPDATE等操作,处理这些请求花费多久很关键,甚至还想知道具体是哪个SQL最慢,这样就可以有针对性地调优。

1.1.1 采集延迟数据
在客户端埋点

上层业务程序在请求MySQL的时候,记录每个SQL请求耗时,把这些数据统一推给监控系统,监控系统就可以计算出平均延迟、95分位、99分位的延迟数据了。要埋点,对业务代码有侵入性。

Slow queries

MySQL提供慢查询数量的统计指标,通过如下命令拿到:

show global status like 'Slow_queries';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries  | 107   |
+---------------+-------+
1 row in set (0.000 sec)

这指标是Counter型,即单调递增,若想知道最近1min有多少慢查询,需要使用increase函数做二次计算。

慢查询标准

全局变量long_query_time,默认10s,可调整。每当查询时间超过 long_query_time 指定时间,Slow_queries 就会 +1。

获取 long_query_time 值:

SHOW VARIABLES LIKE 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+

通过 performance schema、sys schema 拿到统计数据。若performance schema的 events_statements_summary_by_digest 表,该表捕获很多关键信息,如延迟、错误量、查询量。

如下案例,SQL执行2次,平均执行时间325ms,表里的时间度量指标都是以皮秒为单位:

*************************** 1. row ***************************
                SCHEMA_NAME: employees
                     DIGEST: 0c6318da9de53353a3a1bacea70b4fce
                DIGEST_TEXT: SELECT * FROM `employees` WHERE `emp_no` > ?
                 COUNT_STAR: 2
             SUM_TIMER_WAIT: 650358383000
             MIN_TIMER_WAIT: 292045159000
             AVG_TIMER_WAIT: 325179191000
             MAX_TIMER_WAIT: 358313224000
              SUM_LOCK_TIME: 520000000
                 SUM_ERRORS: 0
               SUM_WARNINGS: 0
          SUM_ROWS_AFFECTED: 0
              SUM_ROWS_SENT: 520048
          SUM_ROWS_EXAMINED: 520048
...
          SUM_NO_INDEX_USED: 0
     SUM_NO_GOOD_INDEX_USED: 0
                 FIRST_SEEN: 2016-03-24 14:25:32
                  LAST_SEEN: 2016-03-24 14:25:55

针对即时查询、诊断问题,还可使用 sys schema。sys schema提供一种组织良好、易读的指标查询方式,查询更简单。如下方法找到最慢的SQL。这个数据在 statements_with_runtimes_in_95th_percentile 表中。

SELECT * FROM sys.statements_with_runtimes_in_95th_percentile;

更多例子查看 sys schema 文档。不过要注意的是,MySQL 5.7.7开始才包含sys schema,5.6 版本开始可手工安装。

1.2 流量

最熟的就是统计 SELECT、UPDATE、DELETE、INSERT 等语句执行数量。若流量太高,超过硬件承载能力,显然需监控、扩容。这些类型指标在 MySQL 全局变量中都能拿到:

show global status where Variable_name regexp 'Com_insert|Com_update|Com_delete|Com_select|Questions|Queries';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Com_delete              | 2091033   |
| Com_delete_multi        | 0         |
| Com_insert              | 8837007   |
| Com_insert_select       | 0         |
| Com_select              | 226099709 |
| Com_update              | 24218879  |
| Com_update_multi        | 0         |
| Empty_queries           | 25455182  |
| Qcache_queries_in_cache | 0         |
| Queries                 | 704921835 |
| Questions               | 461095549 |
| Slow_queries            | 107       |
+-------------------------+-----------+

这些指标都是 Counter 型。Com_ 是 Command 的前缀,即各类命令的执行次数。 整体吞吐量主要是看 Questions 指标,但Questions 很容易和它上面的Queries混淆。从例子里我们可以明显看出 Questions 的数量比 Queries 少。Questions 表示客户端发给 MySQL 的语句数量,而Queries还会包含在存储过程中执行的语句,以及 PREPARE 这种准备语句,所以监控整体吞吐一般是看 Questions。

流量方面的指标,一般我们会统计写数量(Com_insert + Com_update + Com_delete)、读数量(Com_select)、语句总量(Questions)。

错误

错误量这类指标有多个应用场景,比如客户端连接 MySQL 失败了,或者语句发给 MySQL,执行的时候失败了,都需要有失败计数。典型的采集手段有两种。

  1. 在客户端采集、埋点,不管MySQL问题 or 网络问题或中间负载均衡问题或DNS解析问题,只要连接失败,都能发现。但有代码侵入性。
  2. 从 MySQL 采集相关错误,如连接错误通过 Aborted_connects、Connection_errors_max_connections拿
show global status where Variable_name regexp 'Connection_errors_max_connections|Aborted_connects';
+-----------------------------------+--------+
| Variable_name                     | Value  |
+-----------------------------------+--------+
| Aborted_connects                  | 785546 |
| Connection_errors_max_connections | 0      |
+-----------------------------------+--------+

只要连接失败,不管啥原因,Aborted_connects 都 +1,而更常用的是 Connection_errors_max_connections ,表示超过了最大连接数,所以 MySQL 拒绝连接。MySQL默认最大连接数151,在现在这样硬件条件下,实在太小,因此出现这种情况的频率较高,要多关注,及时发现。

SHOW VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+

可通过如下命令调整最大连接数:

SET GLOBAL max_connections = 2048;

虽可通过命令临时调整最大连接数,但一旦重启话就失效。为永久修改该配置,需调整 my.cnf 加一行:

max_connections = 2048

events_statements_summary_by_digest 表也能拿到错误数量。

SELECT schema_name
     , SUM(sum_errors) err_count
  FROM performance_schema.events_statements_summary_by_digest
 WHERE schema_name IS NOT NULL
 GROUP BY schema_name;

+--------------------+-----------+
| schema_name        | err_count |
+--------------------+-----------+
| employees          |         8 |
| performance_schema |         1 |
| sys                |         3 |
+--------------------+-----------+

饱和度

MySQL用什么指标反映资源有多“满”?先关注 MySQL 所在机器 CPU、内存、硬盘I/O、网络流量这些基础指标。

MySQL本身也有一些指标反映饱和度,如连接数,当前连接数(Threads_connected)除以最大连接数(max_connections)可得 连接数使用率,需重点监控的饱和度指标。

InnoDB Buffer pool 相关指标:

  • Buffer pool 的使用率
  • Buffer pool 的内存命中率

Buffer pool内存专门用来缓存 Table、Index 相关数据,提升查询性能。

查看Buffer pool相关指标:

MariaDB [(none)]> show global status like '%buffer%';
+---------------------------------------+--------------------------------------------------+
| Variable_name                         | Value                                            |
+---------------------------------------+--------------------------------------------------+
| Innodb_buffer_pool_dump_status        |                                                  |
| Innodb_buffer_pool_load_status        | Buffer pool(s) load completed at 220825 11:11:13 |
| Innodb_buffer_pool_resize_status      |                                                  |
| Innodb_buffer_pool_load_incomplete    | OFF                                              |
| Innodb_buffer_pool_pages_data         | 5837                                             |
| Innodb_buffer_pool_bytes_data         | 95633408                                         |
| Innodb_buffer_pool_pages_dirty        | 32                                               |
| Innodb_buffer_pool_bytes_dirty        | 524288                                           |
| Innodb_buffer_pool_pages_flushed      | 134640371                                        |
| Innodb_buffer_pool_pages_free         | 1036                                             |
| Innodb_buffer_pool_pages_misc         | 1318                                             |
| Innodb_buffer_pool_pages_total        | 8191                                             |
| Innodb_buffer_pool_read_ahead_rnd     | 0                                                |
| Innodb_buffer_pool_read_ahead         | 93316                                            |
| Innodb_buffer_pool_read_ahead_evicted | 203                                              |
| Innodb_buffer_pool_read_requests      | 8667876784                                       |
| Innodb_buffer_pool_reads              | 236654                                           |
| Innodb_buffer_pool_wait_free          | 5                                                |
| Innodb_buffer_pool_write_requests     | 533520851                                        |
+---------------------------------------+--------------------------------------------------+

Innodb_buffer_pool_pages_total :InnoDB Buffer pool 页总量,页(page)是 Buffer pool 的一个分配单位,默认page size=16KiB,可通过 show variables like "innodb_page_size"看。

Innodb_buffer_pool_pages_free :剩余页数量,通过 total 和 free 可得 used,used/total=使用率。使用率高不是说有问题,因为InnoDB有 LRU 缓存清理机制,只要响应够快,高使用率也不是问题。

Innodb_buffer_pool_read_requestsInnodb_buffer_pool_reads :read_requests 表示向 Buffer pool 发起的查询总量,若Buffer pool缓存了相关数据直接返回,没有就得穿透内存去查询硬盘。

有多少请求满足不了,需查硬盘?得看 Innodb_buffer_pool_reads 指标统计数量。

reads指标 / read_requests = 穿透比例

比例越高,性能越差,可调整 Buffer pool 大小解决。

根据 Google 四个黄金指标方法论,梳理 MySQL 相关指标,这些指标大多可通过 global status 和 variables 拿到。performance schema、sys schema 相对难搞:

  • sys schema 需要较高版本才能支持
  • 这两个 schema 的数据不太适合放到 metrics 库

常见做法通过一些偏全局统计指标,如Slow_queries,先发现问题,再通过这俩 schema 的数据分析细节。

不同的采集器采集的指标,命名方式会有差别,不过大同小异,关键理解思路、原理。

利用 Categraf 配置采集,演示整个过程。

2 采集配置

Categraf 针对 MySQL 的采集插件配置,在 conf/input.mysql/mysql.toml 里。我准备了一个配置样例,你可以参考。

[[instances]]
address = "127.0.0.1:3306"
username = "root"
password = "1234"

extra_status_metrics = true
extra_innodb_metrics = true
gather_processlist_processes_by_state = false
gather_processlist_processes_by_user = false
gather_schema_size = false
gather_table_size = false
gather_system_table_size = false
gather_slave_status = true

# # timeout
# timeout_seconds = 3

# labels = { instance="n9e-dev-mysql" }

最关键的配置是 数据库连接地址和认证信息,具体采集哪些由一堆开关控制。建议把

  • extra_status_metrics
  • extra_innodb_metrics
  • gather_slave_status

置true,其他都不太需采集。labels推荐加instance标签,给这数据库取表意性更强名称,收到告警消息可一眼知道是哪个数据库问题。instances部分是数组,若要监控多个数据库,就配置多个 instances。

Categraf作为采集探针,采集 MySQL 时,有两种方案:

2.1 中心化探测

找一台机器作为探针机器,部署一个单独 Categraf,只采集 MySQL 相关指标,同时采集所有的 MySQL 实例,即这个 Categraf 的 mysql.toml 中有很多 instances 配置段。

2.1.1 适用
  • MySQL 实例数量较少
  • 云上 RDS 服务

相对不太方便做自动化,如新建一个MySQL,还需要到这个探针机器里配置相关的采集规则,麻烦。

2.2 分布式本地采集(推荐)

把 Categraf 部署到部署 MySQL 的那台机器上,让 Categraf 采集 127.0.0.1:3306 实例。

MySQL服务建议不要混部,一台宿主机就部署一个 MySQL,InnoDB Buffer pool设置大些,80%物理内存,性能杠杠。

DBA 管理 MySQL经常创建集群,通常沉淀一些自动化工具,在自动化工具里把部署 Categraf、配置 Categraf 的 mysql.toml 的逻辑都加上,一键搞定。监控只需读权限,建议为监控系统创建一个单独的数据库账号,统一账号、统一密码、统一授权,这样 mysql.toml 配置也一致。

采用这种部署方式一般就用机器名做标识,不太需单独instance标签。Categraf 内置一个 夜莺监控大盘,大盘变量使用机器名来做过滤。如用Grafana,去 Grafana 官网搜 Dashboard,大同小异。刚提到的那些关键指标最好都放Dashboard。

效果图:

MySQL性能监控全掌握,快来get关键指标及采集方法!

3 业务指标

MySQL指标采集核心原理:连上MySQL执行一些 SQL,查询性能数据。

Categraf 内置一些查询 SQL,能否自定义SQL查询一些业务指标?如查询一下业务系统的用户量,把用户量作为指标上报到监控系统。可使用 Categraf 的 MySQL 采集插件实现,查看 mysql.toml 里的默认配置:

[[instances.queries]]
# 作为 metric name 的前缀
mesurement = "users"
# 查询返回的结果,可能有多列是数值,指定哪些列作为指标上报
metric_fields = [ "total" ]
#  查询返回的结果,可能有多列是字符串,指定哪些列作为标签上报
label_fields = [ "service" ]
# 指定某一列的内容作为 metric name 的后缀
field_to_append = ""
# 语句执行超时时间
timeout = "3s"
# 查询语句,连续三个单引号,和Python的三个单引号语义类似,里边内容就不用转义
request = '''
select 'n9e' as service, count(*) as total from n9e_v5.users
'''

自定义SQL的配置,想查询哪个数据库实例,就在对应 [[instances]] 下面增加 [[instances.queries]] 。

MySQL 相关的监控实践,包括性能监控和业务监控,核心就是上面我们说的这些内容,下面我们做一个总结。

4 总结

Google 四个黄金指标方法论指导MySQL 监控数据采集,从延迟、流量、错误、饱和度分别讲解了具体指标是什么及如何获取。

采集器部署还有一种就是容器环境 Sidecar 模式。因为生产环境里 MySQL 一般很少放容器,所以没提。

由于 MySQL 存储很多业务数据,是业务指标重要来源,通过自定义 SQL可以获取很多业务指标,推荐试用这种监控方式。

MySQL性能监控全掌握,快来get关键指标及采集方法!

5 FAQ

MySQL的监控大盘已给出,一些关键指标也点出,告警规则怎么配置?常见的告警 PromQL 哪些?

对于MySQL监控大盘中的关键指标,我们可以根据业务需求设置相应的告警规则。一些常见的告警PromQL表达式如下:

  1. 监控服务器运行状态:如果服务器停止响应或CPU使用率超过阈值,则发出告警。

    up == 0 or (100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 90
    
  2. 监控MySQL数据库性能:例如,监听可用连接数是否已达到最大连接数并进行告警。

    mysql_global_status_threads_connected / mysql_global_variables_max_connections * 100 > 80
    
  3. 监控MySQL数据库存储空间:配置阈值,并在使用率超过预设值后触发告警。

    mysql_info_schema_data_length_bytes / mysql_info_schema_data_free_bytes * 100 > 80
    

除以上这些例子外,还可以根据具体业务情况自定义更多的告警规则。提示:为了实现更精细化的告警,建议对不同种类的监控数据,针对不同的告警级别进行区分,制定更加明确的告警策略。文章来源地址https://www.toymoban.com/news/detail-431504.html

到了这里,关于MySQL性能监控全掌握,快来get关键指标及采集方法!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 性能优化 - 前端性能监控和性能指标计算方式

    利用LightHouse进行合理的页面性能优化 这篇文章主要讲解了如何使用 Lighthouse 。 这里把相关图片再展示一下: 我们可以看到 Lighthouse 计算的时候,会根据这几个维度的指标来计算总分。那么本篇文章,就主要讲解下前端性能监控相关的重要指标含义和计算方式。 在介绍指标

    2024年02月15日
    浏览(57)
  • 开发者必读指南:必须知道的关键性能指标,提升代码性能

    在Web应用程序的开发过程中,性能是一个至关重要的问题。高性能的Web应用程序需要快速响应,并能够处理大量的并发请求。而为了评估Web应用程序的性能状况,我们需要关注一些关键的性能指标。本文将介绍一些常见的Web项目性能指标及其意义。 1)请求响应时间 请求响应

    2024年02月07日
    浏览(49)
  • Prometheus监控指标查询性能调优

    一、背景 在《SRE: Google运维解密》一书中作者指出,监控系统需要能够有效的支持白盒监控和黑盒监控。黑盒监控只在某个问题目前正在发生,并且造成了某个现象时才会发出紧急警报。“白盒监控则大量依赖对系统内部信息的检测,如系统日志、抓取提供指标信息的 HTTP 节

    2024年02月13日
    浏览(42)
  • Jmeter性能指标监控:CPU、内存、磁盘、网络

    jmeter版本:jmeter5.1.1 插件资源(可自己官网下载或从以下网盘中获取): 链接:https://pan.baidu.com/s/1vBr85BLuhhENrnWrFTDGhg 提取码:ywr4 获取插件的最简单方法是安装Plugins Manager,然后只需在Jmeter中单击复选框即可安装任何其他插件。 1)下载 jmeter-plugins-manager-1.3.jar文件 下载地址:

    2024年02月08日
    浏览(39)
  • 性能测试监控指标及分析调优指南

      一、哪些因素会成为系统的瓶颈   CPU: 如果存在大量的计算,他们会长时间不间断的占用CPU资源,导致其他资源无法争夺到CPU而响应缓慢,从而带来系统性能问题,例如频繁的FullGC,以及多线程造成的上下文频繁的切换,都会导致CPU繁忙,一般情况下CPU使用率75%比较合适

    2024年02月16日
    浏览(60)
  • SkyWalking_apm性能监控指标介绍

    什么是skywalking Skywalking概述: 一个优秀的项目,除了具有高拓展的架构、高性能的方案、高质量的代码之外,还应该在上线后具备多角度的监控功能。现在企业中的监控服务也有很多,Skywalking除了提供多维度、多粒度的监控之外,也提供了良好的图形化界面以及性能剖析、服

    2023年04月20日
    浏览(48)
  • 大厂性能测试监控指标及分析调优指南

    CPU: 如果存在大量的计算,他们会长时间不间断的占用CPU资源,导致其他资源无法争夺到CPU而响应缓慢,从而带来系统性能问题,例如频繁的FullGC,以及多线程造成的上下文频繁的切换,都会导致CPU繁忙,一般情况下CPU使用率75%比较合适。 内存: Java内存一般是通过jvm内存进

    2024年02月04日
    浏览(73)
  • 性能测试监控指标及分析调优 | 京东云技术团队

    1、CPU,如果存在大量的计算,他们会长时间不间断的占用CPU资源,导致其他资源无法争夺到CPU而响应缓慢,从而带来系统性能问题,例如频繁的FullGC,以及多线程造成的上下文频繁的切换,都会导致CPU繁忙,一般情况下CPU使用率75%比较合适。 2、内存,Java内存一般是通过jv

    2024年02月06日
    浏览(74)
  • 【大数据监控】Grafana、Spark、HDFS、YARN、Hbase指标性能监控安装部署详细文档

    Grafana 是一款开源的数据可视化工具,使用 Grafana 可以非常轻松的将数据转成图表(如下图)的展现形式来做到数据监控以及数据统计。 解压 配置 mapping 文件 修改spark的metrics.properties配置文件,让其推送metrics到Graphite_exporter namenode.yaml datanode.yaml 配置 hadoop-env.sh yarn.yaml 配置 ya

    2023年04月21日
    浏览(54)
  • 浅析企业云性能监控的关键作用

    企业云性能监控是一项关键的IT管理活动,它旨在实时追踪、分析和优化企业在云环境中的应用程序和系统性能。云性能监控涉及到监测各个层面的云服务,从基础设施到应用程序,以确保企业能够在云环境中实现高效、可靠和稳定的运行。以下是企业云性能监控的主要作用

    2024年01月16日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包