如何分析MySQL服务器的性能
- 2024-07-01 21:05:00
- 丁国栋
- 原创 97
MySQL数据库服务器是典型的高负载应用,对CPU、内存、磁盘IO都有非常高的要求,即CPU密集型(计算密集型)、IO密集型。同时由于MySQL经常是独立部署在一个主机上,无论是客户端访问还是复制都需要较好的网络质量,因此MySQL对网络的要求也是较高的,建议带宽不低于1Gbps。
通常部署MySQL时要求:
- 尽量不使用容器部署,而是直接部署到主机上(物理主机、虚拟主机)
- 部署在Linux系统上,不部署在Windows系统,并非是Windows不好,而是Linux更熟悉、方便、简单、易于维护和分析等
- 单独部署MySQL服务,即部署了MySQL服务的主机不再部署其他高负载应用
- 配置充足的CPU,主频越高越好、核心越多越好
- 配置充足的内存,内存越大越好
- 配置高性能的磁盘,使用更快的固态硬盘,不能使用机械硬盘,虚拟机磁盘尽量使用裸设备(裸设备映射)直接访问物理存储子系统
- 优化MySQL数据库配置参数
- 使用读写分离、分库分表、缓存、优化查询、添加索引等
注:读写分离最好不依赖第三方组件(创建新的端口监听器),应用自身能实现是最好的,即代码本身支持读写分离。
如果应用性能卡顿时数据库负载特别高如何分析其性能和优化呢?
- 查看数据库服务器的CPU负载情况,使用top命令观察1分钟、5分钟、15分钟负载情况,观察负载和趋势,通常负载的数值不超过CPU的核心数(
nproc
)为宜 - 查看内存情况,使用top、vmstat命令查看交换空间是否还有空余,是否还有可用内存,bufer/cache 是否还有空余,通常交换空间使用率为0%为宜
- 查看磁盘IO使用情况,使用vmstat、iotop、iostat等命令观察读速率和写速率
- 登录到MySQL数据库,使用高权限用户登录到MySQL,使用
show full processlist;
命令查看当前进程,观察是否有长时间执行SQL语句和表锁语句 - 使用
show status like 'Thread%';
查询线程使用情况,Threads_connected 已连接的客户端数量,Threads_cached 可用的线程数,Threads_created 已经创建的线程数,Threads_running正在执行的线程数 show status like 'Questions';
查询数据库启用以来执行的总查询数SHOW GLOBAL STATUS LIKE 'Innodb_data_reads';
SHOW GLOBAL STATUS LIKE 'Innodb_data_writes';
查询InnoDB引擎的读写数据SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_bytes_data';
查询MySQL InnoDB引擎内存使用情况show status like 'Max_used_connections';
查询最高连接打开数
注:如何得出系统负载趋势,在没有监控的情况下,可以通过观察Linux系统的1分钟、5分钟、15分钟负载情况,如果三个数值依次升高,说明负载在增加,如果数值依次降低说明负载在下降;
发表评论