解析MySQL生产环境CPU使用率过高的排查与解决方案

引言

在生产环境中,MySQL作为一个关键的数据库组件,其性能对整个系统的稳定性至关重要。然而,有时候我们可能会遇到MySQL CPU使用率过高的问题,这可能导致系统性能下降,应用页面访问减慢,甚至影响到用户体验。本文将详细介绍如何排查和解决MySQL CPU过高的问题,帮助您迅速恢复正常的数据库性能。

首先我们要明白什么是CPU使用率:

CPU使用率是指在单位时间内CPU处于非空闲状态的时间比,反映了CPU的繁忙程度。某个进程的CPU使用率就是这个进程在一段时间内占用的CPU时间占总的时间的百分比。比如在双核CPU某个开启多线程的进程1s内占用了CPU0 0.6s, CPU1 0.9s, 那么它的占用率是150%。这里不深入阐述,网上文章很多。

CPU占用过高原因分析

CPU 占用过高常见原因:

  • 服务器硬件问题
  • 内存溢出
  • 高并发业务中业务设计不合理导致
    • 数据库对象设计不合理
    • 表索引设计不合理
    • 数据库锁导致,如行锁冲突、行锁等待、锁超时、死锁等
    • 系统架构没有缓存中间件
    • 读写分离配置不合理
    • 未合理升级改造为集群环境
    • MySQL 系统参数设置不合理
    • 问题 SQL 导致

SQL 问题导致 CPU 使用率过高是最常见的现象,比如 group by、order by、join 等,这些很大程度影响 SQL 执行效率,从而占用大量的系统资源。

说了这么多常见原因,其实总结一句话来说就是现有系统的现有配置下的现有环境提供不了所需要的数据查询、分析、执行能力,针对这个问题,首先我们要发现问题的所在,就是说我们要准确的定位问题,然后针对问题进行优化,再考虑其他升级改造的事情。

检查MySQL运行情况
在这里插入图片描述
可以看到CPU使用率非常高,内存使用较低,可以排除不是内存影响的。而且内存资源还有很大空间。

因此要解决问题,可以从两方面入手:

  • 优化Mysql参数配置,发挥服务器硬件性能,通过合适的参数配置提升Mysql性能(以空间换时间,见效快,成本高)
  • 找到问题原因,优化问题sql、添加合理的索引、引入缓存等

方案一:MySQL配置参数优化

查看服务器资源

查看服务器内存:

[java@localhost ~]$ grep MemTotal /proc/meminfo 
MemTotal:       266419264 kB   	// 约256G

查看服务器CPU个数:

[java@localhost ~]$ lscpu
架构:                           aarch64
CPU 运行模式:                   64-bit
字节序:                         Little Endian
CPU:                             64
在线 CPU 列表:                  0-63
每个核的线程数:                 1
每个座的核数:                   32
座:                             2
NUMA 节点:                      2
厂商 ID:                        HiSilicon
型号:                           0
型号名称:                       Kunpeng-920
步进:                           0x1
Frequency boost:                 disabled
CPU 最大 MHz:                   2600.0000
CPU 最小 MHz:                   200.0000
BogoMIPS:                       200.00
L1d 缓存:                       4 MiB
L1i 缓存:                       4 MiB
L2 缓存:                        32 MiB
L3 缓存:                        64 MiB
NUMA 节点0 CPU:                 0-31
NUMA 节点1 CPU:                 32-63
Vulnerability Itlb multihit:     Not affected
Vulnerability L1tf:              Not affected
Vulnerability Mds:               Not affected
Vulnerability Meltdown:          Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:        Mitigation; __user pointer sanitization
Vulnerability Spectre v2:        Not affected
Vulnerability Srbds:             Not affected
Vulnerability Tsx async abort:   Not affected
标记:                           fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma dcpop asimddp asimdfhm ssbs

可以看到服务器有两个物理CPU,每个物理CPU有32个内核数,即总共64个逻辑CPU数。
一般情况下,逻辑cpu=物理CPU个数×每颗核数

观察MySQL状态

MySQL的运行状态是我们排查性能问题的第一步。通过查看全局状态变量,我们可以获取系统的整体运行情况。以下是一些关键的状态变量和信息:

  1. Threads_running 和 Threads_connected
SHOW GLOBAL STATUS LIKE 'Threads_running';
SHOW GLOBAL STATUS LIKE 'Threads_connected';

Threads_running 表示当前正在执行的线程数量。
Threads_connected 表示当前已连接到MySQL的线程数量。
如果 Threads_running 较高,而 Threads_connected 较低,可能表明存在某些长时间运行的查询,或者可能是由于连接池配置不当导致连接被频繁创建和销毁。

  1. InnoDB 相关状态
SHOW ENGINE INNODB STATUS;

查看InnoDB引擎状态,关注以下信息:

Innodb_row_lock_current_waits:表示当前正在等待的行锁数量。
Innodb_deadlocks:显示发生的死锁次数。
高的行锁等待和死锁次数可能表明业务逻辑或查询需要优化,或者存在并发访问冲突。

  1. Key_reads 和 Key_writes
SHOW GLOBAL STATUS LIKE 'Key_reads';
SHOW GLOBAL STATUS LIKE 'Key_writes';

Key_reads:表示从磁盘读取索引块的次数。
Key_writes:表示向磁盘写入索引块的次数。
高的 Key_reads 可能暗示着索引未能完全放入内存中,需要调整 key_buffer_size 参数。而频繁的 Key_writes 可能表明索引的写入操作较为频繁,需要考虑索引的优化。

  1. Created_tmp_disk_tables
SHOW GLOBAL STATUS LIKE 'Created_tmp_disk_tables';

表示在磁盘上创建的临时表的数量。过多的磁盘临时表可能表明某些查询需要优化,或者 tmp_table_size 参数设置过小。

  1. Uptime
SHOW STATUS LIKE 'Uptime';

表示MySQL服务的运行时间。如果CPU问题突然发生,检查这个值,看是否与问题的时间点相关。

  1. 其他关键状态变量

浏览MySQL官方文档以获取更多有关全局状态变量的信息,根据具体情况添加监控和分析。

通过这些状态变量,我们可以初步了解MySQL的整体运行情况,从而有针对性地继续深入排查问题。在分析状态时,可以使用各种监控工具,如pt-mysql-summary或MySQL Enterprise Monitor,以更方便地查看和理解MySQL的状态信息。

Mysql参数设置

数据库属于IO密集型的应用程序,其主职责就是数据的管理及存储工作。而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个 IO是在毫秒级别,二者相差3个数量级。所以,要优化数据库,首先第一步需要优化的就是IO,尽可能将磁盘IO转化为内存IO。

SELECT version(); // 版本:8.0.30// 索引块的缓冲区大小,增加它可得到更好处理的索引
show global variables like 'key_buffer_size';  // 默认值:8Mset global key_buffer_size=1024*1024*64show global variables like 'max_allowed_packet'; // 默认值:64Mshow global variables like 'table_open_cache'; // 默认值:4000set global table_open_cache=16000// sort_buffer_size是MySql执行排序使用的缓冲大小
show global variables like 'sort_buffer_size'; // 默认值:256KBset global sort_buffer_size=1024*1024*16show global variables like 'net_buffer_length'; // 默认值:16KB//read_buffer_size 是MySql读入缓冲区大小。
show global variables like 'read_buffer_size'; // 默认值:128KBset global read_buffer_size=1024*1024*8// tmp_table_size是MySql的heap (堆积)表缓冲大小
show global variables like 'tmp_table_size'; // 默认值:16Mset global tmp_table_size=1024*1024*128// read_rnd_buffer_size 是MySql的随机读缓冲区大小
show global variables like 'read_rnd_buffer_size'; // 默认值:256KBset global read_rnd_buffer_size=1024*1024*4// thread_cache_size可以重新利用保存在缓存中线程的数量     
show global variables like 'thread_cache_size'; // 默认值:8set global thread_cache_size=64// MySql的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,
// 当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySql会为每个连接提供连接缓冲区,就会开销越多的内存
show global variables like 'max_connections'; // 最多连接数, 默认:151set global max_connections=5000;show global variables like 'max_connect_errors'; // 默认值:100set global max_connect_errors=1000;show global variables like 'open_files_limit'; // 默认值:1Mshow global variables like 'innodb_data_file_path';    // InnoDB
// 对InnoDB表性能影响最大的一个参数。InnoDB缓冲池用于缓存数据和索引,对于读取频繁的表,适当调整缓冲池大小可以显著提升性能。// innodb_buffer_pool_size设置为系统中Mysql可用内存的70%左右。这确保了大部分数据和索引都可以在内存中缓存,减少磁盘I/O操作。
show global variables like 'innodb_buffer_pool_size'; // 默认值:128Mset global innodb_buffer_pool_size=1024*1024*1024*32 //32G//InnoDB事务日志文件大小show global variables like 'innodb_log_file_size';// InnoDB存储引擎的事务日志所使用的缓冲区
show global variables like 'innodb_log_buffer_size';  // 默认值:16Mset global innodb_log_buffer_size=1024*1024*128show global variables like 'sync_binlog';set global sync_binlog=1000

可根据自己服务器性能动态调整,但重启后会失效,最好同时修改my.cnf配置文件:

通过参数调优后的MySQL状态:
在这里插入图片描述

参数参考:

  • MySQL性能优化之参数配置

  • mysql配置参数调优

方案二:SQL问题分析定位解决

MySQL的查询分析是排查性能问题的关键步骤。通过检查慢查询日志和使用性能分析工具,我们可以找到潜在的性能瓶颈。

  1. 启用慢查询日志
    首先,确保MySQL的慢查询日志功能已启用。在MySQL配置文件中添加以下配置:
slow_query_log = 1
slow_query_log_file = /usr/local/mysql/slowlog/slow-query.log
long_query_time = 1

slow_query_log 启用慢查询日志。
slow_query_log_file 设置慢查询日志文件路径。
long_query_time 定义慢查询的时间阈值(单位:秒),这里设置为1秒。

或者使用MySQL客户端:

 
-- 启动慢查询日志
set global slow_query_log='ON';-- 设置慢查询存储文件地址
set global slow_query_log_file='/usr/local/mysql/slowlog/slow-query.log';-- 设置储存sql条件,sql 执行时间高于0.001秒存入日志文件
set global long_query_time=0.001;-- 开启 记录没有使用索引查询语句
set global log-queries-not-using-indexes = on
  1. 分析慢查询日志
    使用以下命令查看慢查询日志中的内容:
tail -f /usr/local/mysql/slowlog/slow-query.log

或者使用MySQL客户端:

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';

通过检查慢查询日志,识别执行时间长的查询。注意关注查询的执行计划,以便理解MySQL是如何处理这些查询的。

  1. 使用慢查询分析工具
    使用工具如pt-query-digest来分析慢查询日志:
pt-query-digest /path/to/slow-query.log

该工具能够生成详细的报告,包括执行时间最长的查询、查询频率、索引使用情况等信息。通过这些信息,您可以确定哪些查询需要优化,以提高其性能。

  1. Explain命令
    对于特定的查询,使用EXPLAIN命令来查看其执行计划:
EXPLAIN SELECT * FROM your_table WHERE your_condition;

EXPLAIN命令将显示MySQL执行查询时的执行计划,包括使用的索引、访问表的方式等。通过分析执行计划,您可以了解查询的性能瓶颈,并进行相应的优化。

  1. 优化查询
    根据慢查询日志和执行计划的分析结果,对性能较差的查询进行优化。可能的优化方式包括:
  • 优化查询语句,避免全表扫描。
  • 优化 SQL,降低 SQL 复杂度,降低 MySQL 执行成本。
  • 确保查询涉及的列都有合适的索引。
  • 考虑分表、分区表等策略,以减少单表的数据量。

通过以上步骤,您将能够更好地理解哪些查询对系统性能有负面影响,并有针对性地进行优化,提高整体性能。

结论

通过以上步骤,您应该能够定位和解决MySQL CPU使用率过高的问题。请注意,每个生产环境都是独特的,可能需要根据实际情况进行适当调整。保持监控和定期优化是确保MySQL性能稳定的关键。希望这篇文章对您解决MySQL性能问题提供了帮助。如果有任何问题或建议,请随时留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/650835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件包管理:在CentOS 7中部署Tengine

目录 下载: 方法一: 方法二: 部署: 实验操作 下载: 方法一: 1、打开浏览器搜索tengine并点击官网 2、选择需要安装的版本并复制链接链接 标题栏处可以更改为中文界面 下滑选择版本单击下载 在远程连…

Python字符串:基础要点与实践应用

文章目录 一、Python字符串1.介绍2.与C语言字符串比较2.1 相同点2.2 不同点 3.创建Python字符串3.1 使用单引号3.2 使用双引号3.3 使用三引号 二、访问字符串中的值1.索引方式2.截取方式 三、Python 转义字符1.续行符\(在行尾时)2.反斜杠符号\\3.单引号\4.双引号\"5.响铃\…

使用Docker部署MySQL并结合内网穿透实现远程访问本地数据库

文章目录 前言1 .安装Docker2. 使用Docker拉取MySQL镜像3. 创建并启动MySQL容器4. 本地连接测试4.1 安装MySQL图形化界面工具4.2 使用MySQL Workbench连接测试 5. 公网远程访问本地MySQL5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主…

搭建nginx图片服务器

(1)将图片存储于/home/data/images目录; (2)配置nginx.conf user nginx; worker_processes 4;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connections 10000; }ht…

Vue3中ElementPlus组件二次封装,实现原组件属性、插槽、事件监听、方法的透传

本文以el-input组件为例,其它组件类似用法。 一、解决数据绑定问题 封装组件的第一步,要解决的就是数据绑定的问题,由于prop数据流是单向传递的,数据只能从父流向子,子想改父只能通过提交emit事件通知父修改。 父&a…

移动Web——平面转换-旋转

1、平面转换-旋转 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style…

在使用springboot框架式的的script无法通过${}来获取值

今天使用springboot框架做项目&#xff0c;想着来实现一下搜索的下拉框回显功能&#xff0c;然后就一直在报错误&#xff0c;关键是报的错误牛头不对马嘴&#xff0c;检查了一下后端代码&#xff0c;发现没什么问题&#xff0c;就把目光聚焦了.jsp页面的代码 <script type&…

主流影视网站8合一H5源码

目前影视接口完好&#xff0c;可正常观看影视。 上传即可使用 包括了 百度视频风格 PP视频风格 咪咕爱看风格 爱奇艺风格 腾讯视频风格 优酷视频风格 搜狐视频风格 B站风格 8种主流影视网站&#xff0c;喜欢那个用那个

【STM32】STM32学习笔记-Unix时间戳(41)

00. 目录 文章目录 00. 目录01. Unix时间戳02. UTC/GMT03. 时间戳转换04. C 标准库 <time.h>05. 时间相关函数示例5.1 time函数5.2 gmtime函数5.3 localtime函数5.4 mktime函数5.5 ctime函数5.6 asctime函数5.7 strftime函数 06. 预留07. 附录 01. Unix时间戳 •Unix 时…

2024-macOS系统或Kail系统重——破解ZIP压缩的文件密码

2024-macOS系统或Kail系统重——破解ZIP压缩的文件密码 1. 你们有遇见这样子的情况么&#xff1a; 别人给你发的zip或者下载的zip文件&#xff0c;没有密码打不开么网上都是win系统的&#xff0c;都是没有macOS系统的&#xff0c;所以比较烦恼 2. 所以我就想到了代码&#x…

gradle简单入门

安装 需要有Java环境 下载地址&#xff1a;https://gradle.org/releases/ 8.5版本仅有二进制文件&#xff1a;https://gradle.org/next-steps/?version8.5&formatbin 8.5版本包含文档和源码及二进制文件&#xff1a;https://gradle.org/next-steps/?version8.5&f…

无线路由探索

实验大纲 第一部分&#xff1a; 探索无线网络 步骤 1&#xff1a; 探索拓扑 步骤 2&#xff1a; 验证连接 第二部分&#xff1a; Wi-Fi 连接添加到董事会议室 步骤 1&#xff1a; 安装新的 LAP-PT 设备以覆盖新的董事会议室 步骤 2&#xff1a; 检验连接 第三部分&#…

Git初识

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 在学习Git之前我们先引入一…

C/C++ - 面向对象编程

面向对象 面向过程编程&#xff1a; 数据和函数分离&#xff1a;在C语言中&#xff0c;数据和函数是分开定义和操作的。数据是通过全局变量或传递给函数的参数来传递的&#xff0c;函数则独立于数据。函数为主导&#xff1a;C语言以函数为主导&#xff0c;程序的执行流程由函数…

外卖跑腿系统开发:构建高效、安全的服务平台

在当今快节奏的生活中&#xff0c;外卖跑腿系统的开发已成为技术领域的一个重要课题。本文将介绍如何使用一些常见的编程语言和技术框架&#xff0c;构建一个高效、安全的外卖跑腿系统。 1. 技术选择 在开始开发之前&#xff0c;我们需要选择适合的技术栈。常用的技术包括&a…

DDT数据驱动测试

简单介绍 ​ DDT&#xff08;Date Driver Test&#xff09;&#xff0c;所谓数据驱动测试&#xff0c; 简单来说就是由数据的改变从而驱动自动化测试的执行&#xff0c;最终引起测试结果的改变。通过使用数据驱动测试的方法&#xff0c;可以在需要验证多组数据测试场景中&…

详细分析Java的树形工具类(含注释)

目录 前言1. 基本框架2. 实战应用 前言 对应的每个子孙属于该父亲&#xff0c;这其实是数据结构的基础知识&#xff0c;那怎么划分怎么归属呢 对应的基本知识推荐如下&#xff1a; 【数据结构】树和二叉树详细分析&#xff08;全&#xff09;【数据结构】B树和B树的笔记详细…

数据结构与算法教程,数据结构C语言版教程!(第六部分、数据结构树,树存储结构详解)二

第六部分、数据结构树&#xff0c;树存储结构详解 数据结构的树存储结构&#xff0c;常用于存储逻辑关系为 "一对多" 的数据。 树存储结构中&#xff0c;最常用的还是二叉树&#xff0c;本章就二叉树的存储结构、二叉树的前序、中序、后序以及层次遍历、线索二叉树、…

Docker部署思维导图工具SimpleMindMap并实现公网远程访问

文章目录 1. Docker一键部署思维导图2. 本地访问测试3. Linux安装Cpolar4. 配置公网地址5. 远程访问思维导图6. 固定Cpolar公网地址7. 固定地址访问 SimpleMindMap 是一个可私有部署的web思维导图工具。它提供了丰富的功能和特性&#xff0c;包含插件化架构、多种结构类型&…

【Unicode】Character ‘ENQUIRY‘ (U+0005)

询问 result.append("\u0005");Unicode Character ‘ENQUIRY’ (U0005)