AWS MySQL CPU 100% 问题分析

本文探讨了MySQL CPU使用率高达100%的问题,并提供了详细的故障排除步骤,包括检查正在运行的SQL语句、分析锁等待、启用慢查询日志、使用TopSQL耗时分析、开启RDS增强监控及PerformanceInsights,帮助读者理解和解决数据库性能瓶颈。

问题描述

在自建的MySQL或者是使用RDS MySQL时,我们可能会遇到CPU 100%的问题,如何去troubleshooting

分析解决

对于数据CPU 100%的问题来说,一般都是慢SQL致的,我们可以从如下方面来排查:

1. 查看当前数据库正在运行的语句

SELECT
	trx_mysql_thread_id,
	trx_id,
	trx_state,
	trx_started,
	trx_query 
FROM
	INFORMATION_SCHEMA.INNODB_TRX\G

或者是

show full processlist

cpu消耗过大通常情况下都是有慢sql造成的,这里的慢sql包括全表扫描,扫描数据量过大,内存排序,磁盘排序,锁争用等待,等待磁盘io等。

重点关注SQL语句的执行状态:show processlist后出现大量的语句,Copying to tmp table,Copying to tmp table on disk,Sorting result,locked,Using filesort,都是有潜在有性能问题的SQL, 一般出现在结果集巨大,SQL不够优化导致大量的临时表导致的

2. 查看锁等待

查看锁情况:
SELECT
	r.trx_id AS waiting_trx_id,
	r.trx_mysql_thread_id AS waiting_thread,
	TIMESTAMPDIFF( SECOND, r.trx_wait_started, CURRENT_TIMESTAMP ) AS wait_time,
	r.trx_query AS waiting_query,
	l.lock_table AS waiting_table_lock,
	b.trx_id AS blocking_trx_id,
	b.trx_mysql_thread_id AS blocking_thread,
	SUBSTRING( p.HOST, 1, INSTR( p.HOST, ':' ) - 1 ) AS blocking_host,
	SUBSTRING( p.HOST, INSTR( p.HOST, ':' ) + 1 ) AS blocking_port,
IF
	( p.command = "Sleep", p.time, 0 ) AS idle_in_trx,
	b.trx_query AS blocking_query 
FROM
	INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w
	INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS b ON b.trx_id = w.blocking_trx_id
	INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS r ON r.trx_id = w.requesting_trx_id
	INNER JOIN INFORMATION_SCHEMA.INNODB_LOCKS AS l ON w.requested_lock_id = l.lock_id
	LEFT JOIN INFORMATION_SCHEMA.PROCESSLIST AS p ON p.id = b.trx_mysql_thread_id 
ORDER BY
	wait_time DESC \G

3. 查看slow log

如果没有配置的话,需要进行如下配置

还可以查看下慢日志,但是您当前没有开启,需要您先手动配置下:
需要配置的参数如下:

low_query_log:要创建慢速查询日志,请设置为 1。默认值为 0。

long_query_time:要防止在慢速查询日志中记录快速运行的查询,请指定需要记录的最短查询执行时间值,以秒为单位。默认值为 10 秒;最小值为 0。将 long_query_time 设置为 0.1 可防止记录任何运行时间少于 100 毫秒的查询。

log_queries_not_using_indexes=1:要将所有不使用索引的查询记录到慢速查询日志,请设置为 1。默认值为 0。将记录不使用索引的查询,即使它们的执行时间小于 long_query_time 参数的值。

log_output=FILE

然后在RDS点击,修改,将日志导出到cloudwatch。

请查阅AWS RDS Logs

4. 可以及时将show engine innodb status打印出来

show engine innodb status的输出非常强大,其中包含了

信号量等待信息
有关最新外键和死锁错误的数据信息
事务的锁等待信息
活跃事务持有的表锁、记录锁信息
等等...

5. Top SQL耗时分析

SELECT
	EVENT_ID,
	TRUNCATE ( TIMER_WAIT / 1000000000000, 6 ) AS Duration,
	SQL_TEXT 
FROM
	PERFORMANCE_SCHEMA.events_statements_history_long 
ORDER BY
	Duration DESC 
	LIMIT 5;
+----------+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EVENT_ID | Duration | SQL_TEXT                                                                                                                                                          |
+----------+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|     1436 | 0.033460 | SELECT EVENT_ID, TRUNCATE(TIMER_WAIT/1000000000000,6) as Duration, SQL_TEXT FROM performance_schema.events_statements_history_long order by Duration desc limit 5 |
|  4323480 | 0.003146 | update node set role = 'main', heartbeat = current_timestamp where id = 1960                                                                                  |
|  4445223 | 0.002929 | update node set role = 'main', heartbeat = current_timestamp where id = 1960                                                                                  |
|  4689042 | 0.002895 | update node set role = 'main', heartbeat = current_timestamp where id = 1960                                                                                  |
|  4380520 | 0.002753 | update node set role = 'main', heartbeat = current_timestamp where id = 1960                                                                                  |
+----------+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------

根据对应的top5耗时长的sql的event_id查看该sql具体耗时在哪个地方

SELECT
	event_name AS Stage,
	TRUNCATE ( TIMER_WAIT / 1000000000000, 6 ) AS Duration 
FROM
	PERFORMANCE_SCHEMA.events_stages_history_long 
WHERE
	NESTING_EVENT_ID = 1436;
+--------------------------------+----------+
| Stage                          | Duration |
+--------------------------------+----------+
| stage/sql/starting             | 0.000097 |
| stage/sql/checking permissions | 0.000014 |
| stage/sql/Opening tables       | 0.000019 |
| stage/sql/init                 | 0.000026 |
| stage/sql/System lock          | 0.000009 |
| stage/sql/optimizing           | 0.000006 |
| stage/sql/statistics           | 0.000014 |
| stage/sql/preparing            | 0.000012 |
| stage/sql/Sorting result       | 0.000007 |
| stage/sql/executing            | 0.000005 |
| stage/sql/Sending data         | 0.000009 |
| stage/sql/Creating sort index  | 0.028948 |
| stage/sql/end                  | 0.000005 |
| stage/sql/query end            | 0.000006 |
| stage/sql/closing tables       | 0.000008 |
| stage/sql/freeing items        | 0.000019 |
| stage/sql/cleaning up          | 0.000001 |
+--------------------------------+----------+

6.打开RDS 增强监控

Amazon RDS 为数据库实例运行的操作系统 (OS) 实时提供指标
请查阅AWS 增强监控

7. 打开performance insight

Performance Insights 在现有 Amazon RDS 监控功能的基础上进行了扩展,以便通过示意图展示您的数据库的性能并帮助您分析影响性能的任何问题。利用 Performance Insights 控制面板,您可以可视化数据库负载并按等待状态、SQL 语句、主机或用户来筛选负载。

请查询PI官方文档

<think>好的,用户的问题是关于在AWS云上配置MySQL数据库,针对50GB的数据量和最大100个连接数,需要多少CPU和内存资源。首先,我需要理解用户的具体需求。他们可能正在规划数据库的云资源配置,想要确保性能同时避免资源浪费。 接下来,我需要考虑影响MySQL资源占用的主要因素。数据量是50GB,这对内存来说不算太大,但InnoDB缓冲池的大小很关键。通常建议缓冲池设置为可用内存的60-70%,以便缓存常用数据,减少磁盘I/O。然后是连接数,100个并发的连接,每个连接都会占用一定的内存,尤其是会话级别的内存。此外,查询的复杂度、事务处理频率以及是否使用复制或分区等高级功能也会影响资源使用。 用户的配置选择也很重要,比如AWS提供的RDS实例类型。不同的实例类型在CPU和内存配比上不同。例如,通用型(如M5)和内存优化型(如R5)实例的区别。需要根据工作负载推荐合适的类型。对于50GB数据,如果缓冲池设置为足够大,比如16GB内存,那么选择内存优化型可能更合适,尤其是如果有很多复杂查询的话。 还要考虑存储类型。AWS的存储选项包括通用型SSD、预配置IOPS等,不同的存储性能会影响IO延迟,从而间接影响CPU使用率。但用户的问题主要集中在CPU和内存,所以可能需要提到存储对整体性能的影响,但重点还是在计算资源。 另外,用户可能没有提到的点包括是否启用了性能优化选项,比如Performance Insights或者慢查询日志,这些工具可以帮助监控和优化资源使用。例如引用[1]提到的Top SQL可以用来找出高CPU消耗的查询,进行优化。这可能减少资源需求。 CPU方面,处理复杂查询、高并发事务或大量写操作会增加CPU使用率。对于100个连接,如果大多数是简单查询,2-4个vCPU可能足够,但如果有复杂分析查询,可能需要更多。内存方面,除了缓冲池,每个连接的内存、临时表、排序操作等都需要内存。建议至少8-16GB内存,具体取决于工作负载。 需要综合这些因素给出建议,并提醒用户监控和调整的重要性。可能还需要建议他们从较小的实例开始,利用AWS的监控工具进行调整,比如CloudWatch和Performance Insights,如引用[1]提到的,找出高负载的查询进行优化。 最后,生成相关问题时,需要考虑用户可能的后续疑问,比如如何优化查询、监控资源使用情况、高可用性配置等,帮助他们全面了解数据库配置和优化。</think>针对AWS云上MySQL数据库(50GB数据量,最大100连接数)的资源配置问题,需要从工作负载类型、查询复杂度、事务频率等多维度分析。以下是具体建议: ### 一、核心资源配置建议 $$内存 = 缓冲池大小 + 连接内存 + 操作系统预留$$ $$CPU核数 = \frac{QPS \times 平均查询复杂度}{单核处理能力}$$ | 配置项 | 推荐值 | 计算依据 | |--------------|--------------|--------------------------------------------------------------------------| | **内存总量** | 8-16GB | 缓冲池(4-8GB) + 100连接(2-4GB) + OS预留(2GB)[^2] | | **vCPU核数** | 2-4核 | OLTP负载建议2核,分析型查询需4核 | | **存储类型** | gp3 SSD | 基础IOPS 3000,吞吐量125MB/s,满足常规负载 | ### 二、详细配置分析 1. **InnoDB缓冲池配置** - 计算公式:$$缓冲池大小 = 总内存 \times 70\%$$ - 50GB数据场景建议: - 热数据占比约20-30%(10-15GB) - 最小有效缓冲池应≥10GB,建议实例总内存≥16GB 2. **连接数内存消耗** - 每个连接消耗内存范围: $$连接内存 = 连接数 \times (排序缓冲区 + 连接缓冲区)$$ $$= 100 \times (2MB + 1MB) = 300MB$$ - 复杂查询场景可能增长到500MB-1GB 3. **CPU使用特征** - OLTP型负载(简单查询): $$CPU利用率 = \frac{事务数/秒 \times 指令数}{CPU时钟频率}$$ 2核可支持800-1200 QPS - 分析型负载需要4核应对复杂查询 ### 三、AWS实例选型建议 | 实例类型 | 规格示例 | 适用场景 | |-------------|---------------|------------------------------| | db.m6g.large | 2vCPU/8GB | 开发测试环境 | | db.r6g.xlarge| 4vCPU/32GB | 生产环境推荐配置[^4] | | db.t3.medium | 2vCPU/4GB | 仅适用于轻量级临时测试 | ### 四、性能优化建议 1. 使用Performance Insights监控Top SQL,识别高消耗查询[^1] 2. 配置参数组优化: ```ini innodb_buffer_pool_size = 12G max_connections = 120 thread_cache_size = 100 ``` 3. 启用查询缓存和慢查询日志
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值