性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优

10.1数据库运行机制

数据库--本质就是一个软件系统,这个系统的功能:数据管理【增删改查】

整体结构:

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第1张图片

从整体结构角度来看

得出两项优化方案:配置更好的内存;用更好的磁盘硬件,比如:SSD

注意点:内存并不是保存所有数据,只是说mysql在操作数据的时候,需要先加载到内存

压测数据库性能:用jmeter进行压测

纯粹的测试人员只能做数据库的基准测试:增删改查基本操作,涉及关联

性能指标、测试报告、瓶颈分析--和应用程序压测一样

10.2数据库监控体系

10.2.1服务器本上的监控

linux服务器监控,所有参与到性能测试的服务都要监控

10.2.2Mysql独立的监控指标

部署运行数据运行信息的采集脚本服务

在prometheus官网,下载mysqld_exporter

下载地址:https://prometheus.io/download/#mysqld_exporter

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第2张图片

将文件放到mysql服务器的文件夹中,解压

tar  -zxvf  mysqld_exporter-0.14.0.linux-amd64.tar.gz

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第3张图片

运行:

配置要监控的数据库信息:

export DATA_SOURCE_NAME=’root:zhaoWEILI1314520@@(192.168.1.7:3306)/’

其中:root为数据库用户名

zhaoWEILI1314520@为密码,后面加@(数据库ip地址:3306)/

建议:单独创建账户,用于获取mysql的运行信息

运行mysql_export服务:

前台运行:   ./mysqld_exporter

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第4张图片

后台运行 nohup ./mysqld_exporter >mysql_exporter.log 2>&1 &

默认9104网络单口用于查询数据库采集信息,给Prometheus调用

设置防火墙开放9104端口策略

firewall-cmd  --add-port=9104/tcp --permanent

firewall-cmd - -reload

测试是否配置成功,在浏览器输入数据库地址加端口号9104

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第5张图片

在grafana服务器上,配置Prometheus采集任务,修改配置文件

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第6张图片

Prometheus和数据库服务/采集服务器网络要通畅

修改之后,后台启动Prometheus任务

nohup

/prometheus/prometheus-2.41.0.linux-amd64/prometheus --config.file=prometheus.yml >prometheus.log 2>&1 &

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第7张图片

配置grafana监控看板,在grafana下载mysql插件 

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第8张图片

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第9张图片

导入监控看板,bug修复 

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第10张图片

 #修改了json模板文件内Buffer Pool Size of Total RAM这个展示的数据查询表达式

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第11张图片

"expr": "(label_replace(mysql_global_variables_innodb_buffer_pool_size{instance=

\"$host\"}, \"nodename\", \"$1\", \"instance\", \"(.*):.*\") * 100) / on

(nodename) (label_replace(node_memory_MemTotal_bytes, \"nodename\", \"$1\", \"instance\",

没有修改的话,这里是没有数据的

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第12张图片

注意:这个内容的展示,有一个前提:你的把mysql所在的服务linux监控起来,这样才能看到数据。因为这个地方是用到mysql自身的内存/机器内存,计算出来的

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第13张图片

10.3数据库事务机制

10.3.1ACID描述

ACID模型是一组数据库设计原则,对于事务型应用程序非常重要。

Atomicit原子性:事务通常有多个语句组成。原子性保证将每个事务是为一个“单元”,该事务要么完全成功,要么完全失败

Consistency一致性:事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态

lsolation隔离性:通常数据库会有多个事务同时执行,隔离可确保事务的并发执行不会相互干扰。

Durability持久性:持久性保证一旦事务被提交,即使在系统故障(例如,停电或崩溃)的情况下,事务也要保持提交状态

10.3.2事务

一件事可能有多个步骤组成

一个或者多个SQL的执行

明确开始和结束

begin:开始事务

commit:提交事务

rollback:回滚事务

注意事项:性能测试后,要检查数据的正确性

高并发系统--系统BUG,对于数据的处理出现问题

结合业务场景和开发去确定

10.4数据库锁机制

查看锁等待信息

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第14张图片

表锁:当事务真正该使用一张表的时候,数据库会给这个表加一把锁

另外一个事务需要对这个表进行操作(删除并、修改版),不好意思,此时--等待其它事务释放锁

行锁:某一行,某部分的数据被锁住

10.5数据库调优思路汇总

10.5.1发现瓶颈

资源不够用:CPU、网络资源、磁盘资源、内存

响应时间--慢查询日志:该日志记录执行时间超过阈值的sql语句

注意:慢查询日志并不仅仅只记录select,update这种数据修改的SQL语句执行过长也会被记录

配置:slow_query_log 是否启用

slow_query_log_file日志文件

Long_query_time 以慢SQL的阈值(根据业务系统而定)

log_queries_not_using_indexes:是否记录未使用索引的SQL。(建议开启)

性能测试期间,可以临时开启查看是否开启:show variables like “%slow_query_log”;性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第15张图片

 OFF为关闭ON为开启,开启: set global slow_query_log=1

 性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第16张图片

开启:set  global long_query_time =0.001

在数据库服务器上打开查看这个文件:tail  -f  /var/lib/mysql/localhost-slow.log

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第17张图片

超过这个时间的,都会被记录,这里设置了0.001s,理论所有的sql语句都会被记录

日志说明:

 

10.5.2连接数据库

程序性能跟不上,数据库CPU占用很高、或者CPU占用很低

每一个网络连接-执行SQL,数据库都会有对应线程来处理,创建的连接过多,cpu占用高

连接池:应用程序,基本都会采用数据库连接池

类似线程池,但是有点不一样:因为数据库对外是通过网络进行操作

网络连接涉及到连接创建、销毁--如果每一次操作数据都是重新创建连接,程序的性能下降

应用程序和数据库的关系大多数情况下是绑定,数据库操作很频繁。

所以:能不能把数据网络连接进行复用???--可以的,连接池

创建多个网络连接,不中断

过多:导致数据压力变大,处理变慢

过少:程序响应时间会变慢,因为需要消耗大量的时间去等待数据库连接的释放

综合之前将tomcat/web服务器线程概念去理解

如何发现程序是因为书库等待而导致的响应过慢?

需要调整参数进行--配置测试

如果开发愿意配合,从应用程序角度去做数据库操作的监控

比如Druid连接池技术

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第18张图片

10.5.3数据库内存

Innodb_buffer_pool_size  服务器内存80%

sql语句:show variables like "%pool%"

性能测试瓶颈分析与系统调优(10)mysql数据库性能瓶颈分析调优_第19张图片

数据库一般都是独立部署运行

服务器的内存,基本上80%都会给数据库

10.5.4 sql语句

查询-调优分析

尽量用到索引:

对应筛选条件,没建立索引,那就不会用到索引

数据量比较小,创建了索引不一定会用到索引,数据库本身有优化机制

执行计划:如何检测SQL语言用到索引

数据库功能:查看执行计划

EXPLAIN