Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >实例:面对未知环境的MySQL性能问题,如何诊断

实例:面对未知环境的MySQL性能问题,如何诊断

作者头像
IT大咖说
发布于 2018-10-08 05:55:12
发布于 2018-10-08 05:55:12
1.1K0
举报
文章被收录于专栏:IT大咖说IT大咖说

内容来源:2018 年 5 月 20 日,爱可生技术服务总监洪斌在“PHPCon China 2018 技术峰会”进行《MySQL性能诊断方法与实践》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发布。

阅读字数:2852 | 8分钟阅读

摘要

本次演讲将介绍性能诊断方法论,以及观测工具在MySQL性能分析过程中的运用,并通过实际案例展示面对未知环境的性能问题,该如何诊断。

获取嘉宾演讲视频及PPT,扫一扫下方二维码即可。

性能诊断的方法

几个定律

Little’s law是一个证明排队论的定律,我们可以将计算系统宏观的建模成排队系统,系统中有这样一个公式——请求量等于到达率乘响应时间。业界一般讨论的性能指标有KPS、吞吐量、响应时间等,其中关键的是响应时间(延时)的指标和变化以及对吞吐量的影响。

Amdahl’s Law是为了证明并行计算对性能扩展所能带来的影响。上图中的绿线就是Amdahl所计算的并发和吞吐量之间的关系,从图中可以看出整个曲线最终会趋近于一个常数,这表示后续无论系统资源和并发如何增长吞吐量都是恒定。不过真实的情况并不会这样,由此引出第三个定律——Universal Scalability Law,它指出随着资源和并发的增加性能会不升而降,图中通过红色线条表示,当到达某一时候后性能会急剧下降。因此我们在实际工作中会设法找到最优点,而不是通过不断的增加资源和并发来提升性能。

这些基础理论帮我们界定出了性能的边界,对如何提升性能有更深入的认识。

通用方法

USE方法包含三部分使用率、饱和率、错误。任何资源都可以理解为一个队列系统,这个系统中也会有使用率、饱和率,当队列饱和无法处理请求的时候会进入错误阶段,分为逻辑错误和压力过大造成的错误。

基于USE方法在进行性能分析时首先会查看系统所处阶段,比如资源没有饱和的情况下,就不用再去新增资源,而是应该找寻其他影响性能的因素;出现错误的时候,可能是因为压力过大。通过这样的方法我们在资源层面分析性能问题时就有了清晰的脉络。

火焰图方法是用来分析应用程序在CPU和非CPU两个方面的消耗时间,通过on-cpu和off-cpu的绘图方式能够直观的看出每个调用栈在不同阶段耗费的时间。

正常情况下性能无法通过单一指标来衡量,需要用到基线,也就是历史数据,这样才能判断出性能变化的好坏。

MySQL体系结构

MySQL整体上分为两大部分Connectors和Server。下方的Server端又被分为计算层和存储层,计算层负责所有连接的处理,包括SQL解析、SQL执行计算以及SQL优化等。MySQL的Server层的优点在于拥有抽象接口能够对接各种存储引擎,只要该引擎符合接口规范。

解决MySQL问题时要分析故障点具体在哪一层,针对不同层面选择不同的优化方式 。

快速诊断

当系统出现问题但还不能定位具体原因的时候,需要进行系统级的快速判断,这里列出一些常规的执行流程。

首先使用top命令判断主机负载以及cpu消耗情况。之后通过USE方法查看是否存在错误,比如oom-killer或tcp drop等。接下来是虚拟内存的情况,主要检查r、free、si、so、us、sy、id、wa、st列。然后检查进程的cpu使用率,多核利用情况;内存使用情况;网络吞吐量;tcp连接情况等。

MySQL诊断工具

对于数据库来说不仅要从系统层面找问题,还要从自身内部来分析。首先当然就是查看日志,不同的日志能够提供不同的信息,错误日志中有服务挂了或重启后的详细的信息和记录,slow日志中记录了超过一定阈值的查询和SQL请求,general日志一般不会开启,只有在故障重现的时候才会用到。

除了日志外还可以通过命令查看MySQL内部的状态信息,使用show procersslist就能看到当前MySQL的任务分布情况和线程处理状态。存储引擎的状态也要检测,通过show engine InnoDB status命令获取,主要关注点在事务状态和事务队列上。还可以使用Explain查看执行计算,对SQL进一步优化。最后是performance schema,它提供了更详细的内部状态,并且能通过SQL的方式出查询出来。

在出现实际问题后,诊断步骤大致如下。首先是结合快速诊断检查系统全局资源负载,然后检查MySQL错误日志和当前MySQL在做什么,接着查看InnoDB的事务情况,最后要检查下MySQL的复制状态。

InnoDB

InnoDB是MySQL中很重要的一个部分,开发者在使用的时候有几点需要注意。InnoDB表必须要有主键或唯一索引,组件应使用较小数据类型且有序,其次是要避免大事务(运行时间长或变更记录多)。

上图列出的是一些比较重要的参数。在并发有一定量的情况下,开发者一般都会将max_connection设置的比较大,不过这个值过大是会产生负面影响的。首先我们要理解并发和并行是完全不同的两个概念,就拿银行网点来说,并发可以理解为当前有多少顾客在存取款,并行则是有多少柜台在处理业务。由于并行量固定,所以当并发过多之后就要排队。正因为有这种情况,max_connection才不会设置的过大,通常来说不会超过1千。

Innodb_buffer_pool_size的配置同样也不是越多越好,这取决于数据量,一般建议设置在50-60之间,后续如果不够会再增加。Innodb_flush_neighbors是关于IO刷盘的参数,主要用在有机械硬盘的场景下,如果用的是SSD可以将它设置为0。Innodb_log_file_size的大小取决于当前是否在频繁刷新log日志,设置过大会影响启动效率,因此建议设为1-2G。

数据库的优化最重要的还是在于SQL优化,实现更好的物理设计包括表设计、索引设计、数据分布等等。

Note

优化的核心实际上是如何“少做事”,做的越多越复杂就意味着效率的降低,在优化之前要设法简化流程。另外切勿盲目追求最优配置模板,存在这样一个原则——在不知道参数含义的情况下不要随意改动它,只有在明确知道该参数能够解决问题的时候才去调整。还有就是避免过早优化,在遇到问题的时候在做优化。

观测工具用法

BPF是一个包过滤系统,用来解决抓包的性能问题,在tcp上的网络调试方面用的较多。Tcpdump和linux底层对接的就是BPF,在内核中BPF有一个虚拟机,能够接收一定的指令,这些指令可以提高抓包的性能。在3.18版本的时候,linux对BPF进行了扩展,从原来的抓包场景扩展到了更广的范围。

目前BPF的应用还不算太多,主要是因为它对内核的版本要求较高,liunx内核要在4.4以上。一般我们也不会直接使用BPF,而是使用社区中的Bcc(BPF工具集),它结合BPF的能力做了很多命令行式的工具,更方便使用。如果要用在Mysql上还需要进行编译。

Bcc提供的工具基本上能够覆盖系统的各个层面,具体介绍可以在项目的Github上查看。

以上为今天的分享内容,谢谢大家!

IT大咖说 | 关于版权

本文由“IT大咖说(ID:itdakashuo)”原创,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!

感谢您对IT大咖说的热心支持!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT大咖说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL性能监控全掌握,快来get关键指标及采集方法!
数据库中间件监控实战,MySQL中哪些指标比较关键以及如何采集这些指标了。帮助提早发现问题,提升数据库可用性。
JavaEdge
2023/05/03
3K0
MySQL性能监控全掌握,快来get关键指标及采集方法!
面试官问我:平常如何对你的Java程序进行调优?
Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。尤其是在“糙快猛”的互联网开发模式大行其道的今天,随着系统访问量的日益增加和代码的臃肿,各种性能问题开始纷至沓来。
美的让人心动
2019/07/18
6580
MySQL - 扩展性 1 概述:人多未必力量大
我们应该接触过或者听说过数据库的性能瓶颈问题。对于一个单机应用而言,提升数据库性能的最快路径就是氪金 - 买更高性能的数据库服务器,只要钱到位,性能不是问题。
北国风光
2019/04/25
6840
MySQL - 扩展性 1 概述:人多未必力量大
平常你是怎么对Java服务进行调优的
Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。尤其是在“糙快猛”的互联网开发模式大行其道的今天,随着系统访问量的日益增加和代码的臃肿,各种性能问题开始纷至沓来。
用户4283147
2022/10/27
4110
平常你是怎么对Java服务进行调优的
系统架构性能问题诊断及优化思路,纯干货!
今天谈下业务系统性能问题分析诊断和性能优化方面的内容。这篇文章重点还是谈已经上线的业务系统后续出现性能问题后的问题诊断和优化重点。
架构之家
2022/09/01
4100
系统架构性能问题诊断及优化思路,纯干货!
MySQL(一)|性能分析方法、SQL性能优化和MySQL内部配置优化
我曾经在公司处理过很多次Mysql性能上的问题,利用一些Linux常用的命令来查看Mysql对服务器的CUP和I/O使用情况,通过慢查询日志找出有待优化的sql,通过show processlist查看正在执行的sql的情况以及及时kill死锁的sql,通过EXPLAIN分析需要优化的sql语句。当然也对Mysql内部配置做了一些调整。 最近也在看《高性能MySQL》这本Mysql的经典书籍,很早的时候我就想写一个系列来介绍我在使用Mysql遇到的一些问题。无意中发现一篇博客写的内容和我想写的基本差不
黄小怪
2018/05/21
3.1K0
性能测试诊断的方法有哪些?
集中式系统把业务处理逻辑程序与数据展示成熟都放在一个程序包中,整个包运行在中间件上(Tomcat,jetty,JBoss等),数据存储在DB(mysql,Oracle等)可能还会用到redis之类的缓存。
漫谈测试
2025/01/21
1380
性能测试诊断的方法有哪些?
常见的性能效率失效模式及原因
在动态测试过程中可以发现许多不同的性能效率失效模式,以下是一些常见故障(包括系统崩溃)的示例及其典型原因。
漫谈测试
2024/10/20
1470
常见的性能效率失效模式及原因
如何进行性能瓶颈分析
分析性能瓶颈需要了解系统部署架构,知道瓶颈可能会发生在哪些节点上,并熟悉查看各个节点指标数据的方法。
穿过生命散发芬芳
2025/02/03
1150
Java并发的四大定律
每一个进入 Java 并发世界的人,都会不可避免地面临一系列问题:线程安全、并发控制、锁,以及共享资源。这些概念复杂又抽象,往往让人无从下手。幸运的是,业界早已总结出一些法则,这些法则为我们处理并发问题提供了方向。今天,我们来聊聊 Java 并发的四大定律,帮助你更轻松地掌握并发编程。
井九
2024/10/12
930
【修正版】QPS、TPS、RT、并发数、吞吐量理解和性能优化深入思考
在了解qps、tps、rt、并发数之前,首先我们应该明确一个系统的吞吐量到底代表什么含义,一般来说,系统吞吐量指的是系统的抗压、负载能力,代表一个系统每秒钟能承受的最大用户访问量。
艾小仙
2021/01/11
2.5K0
带你理解 QPS、TPS、RT、并发数、吞吐量...
在了解qps、tps、rt、并发数之前,首先我们应该明确一个系统的吞吐量到底代表什么含义,一般来说,系统吞吐量指的是系统的抗压、负载能力,代表一个系统每秒钟能承受的最大用户访问量。
Java3y
2020/08/28
6.1K0
带你理解 QPS、TPS、RT、并发数、吞吐量...
Java并发编程实战系列11之性能与可伸缩性Performance and Scalability
线程可以充分发挥系统的处理能力,提高资源利用率。同时现有的线程可以提升系统响应性。 但是在安全性与极限性能上,我们首先需要保证的是安全性。 11.1 对性能的思考 提升性能=用更少的资源做更多的事情(太对了,这才是问题的本质)。 资源包括:CPU时钟周期,内存,网络带宽,I/O带宽,数据请求,磁盘空间等。 资源密集型说的就是对上述维度敏感的应用。 与单线程相比,多线程总会一起一些额外的性能开销: 线程协调with coordinating between threads (locking, signali
JavaEdge
2018/04/28
8440
性能测试的关注点及诊断思路
做任何事情都要讲究方法策略,性能测试的诊断自然也需要一些常规的方法。就像我们身体不舒服,去医院就诊,大多数医生要依赖化验报告来帮助诊断,性能测试进行诊断时候也需要一些测试报告数据,性能监控的有主机监控,应用的监控,中间件的监控,数据库监控等。
漫谈测试
2025/01/17
960
性能测试的关注点及诊断思路
Linux 性能诊断:负载评估
从load avgerage等总括性的数据着手,参考CPU使用率和I/O等待时间等具体的数字,从而自顶向下快速排查各进程状态。
RiboseYim
2018/01/12
2.3K0
Linux 性能诊断:负载评估
分分钟解决 MySQL 查询速度慢与性能差
1.慢查询:很难在短时间内过滤出需要的数据 查询字区分度低 -> 要在大数据量的表中筛选出来其中一部分数据会产生大量的磁盘 io -> 降低磁盘效率
用户1655470
2019/03/06
1.5K0
分分钟解决 MySQL 查询速度慢与性能差
Java 应用性能调优实践
Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。尤其是在“糙快猛”的互联网开发模式大行其道的今天,随着系统访问量的日益增加和代码的臃肿,各种性能问题开始纷至沓来。
用户1516716
2019/06/17
5870
MySQL性能调优 – 你必须了解的15个重要变量
1.DEFAULT_STORAGE_ENGINE 如果你已经在用MySQL 5.6或者5.7,并且你的数据表都是InnoDB,那么表示你已经设置好了。如果没有,确保把你的表转换为InnoDB并且设置default_storage_engine为InnoDB。 为什么?简而言之,因为InnoDB是MySQL(包括Percona Server和MariaDB)最好的存储引擎 – 它支持事务,高并发,有着非常好的性能表现(当配置正确时)。 2.INNODB_BUFFER_POOL_SIZE 这个是InnoDB最
老七Linux
2018/05/31
4.1K0
性能测试中关注的指标
关键业务的考核指标,重点关注业务价值评价的标准指标,电商类的下单量、支付量等,股票交易类关注买入、卖出以及账户中资金和持有股票的资金的关系等指标。这部分最好是和团队内BA一起确定,建立一套基于业务价值的监控指标。
Criss@陈磊
2024/06/27
2390
性能测试中关注的指标
mysql基础知识(8)
查询日志(General Query Log):记录MySQL服务器接收到的所有客户端连接和SQL查询信息。通常用于分析和审计。
恒辉信达
2024/11/20
970
推荐阅读
相关推荐
MySQL性能监控全掌握,快来get关键指标及采集方法!
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档