mysql服务器OOM分析

77 阅读5分钟

1. 根据告警的数据库组,及IP信息,登录grafana查看对应的数库组

根据告警触发的时间,监控的【Mysql Memory Usage】指标有断崖式的突降,以及数据组的重启时间与其对应,则是 oom 导致数据库重启




2.查看内存高的原因

  1. 释放长连接

监控查看【MySQL Connections】指标,查询范围如一周。Threads Connected 长连接的平均值达到1000 以上,

Threads Running正在运行的活动连接数,只有10来个。活跃连接数(Threads Running)远远低于常驻空闲连接(Threads Connected),过多的空闲长连接会mysql内存使用量增高

建议业务owner对常驻空闲连接数进行释放,或合理调整 连接池 空闲超时等参数

  1. 慢SQL优化

监控查看【MySQL Slow Queries】指标,查询范围可拉一周,存在大量的慢查询。复杂的慢查询会使mysql内存使用增高

查询慢SQL:

点击【日志分析】,时间范围可选择一周。查看慢SQL数量

建议:让业务owner对其优化慢查,避免全表扫描、对大表排序、复杂连接查询等。

  1. mysql内存扩容

mysql内存长期处于高位,且一周内发生oom有好几次的现象

建议对 MySQL 进行申请 内存 扩容操作

  1. innodb_buffer_pool_size调整(DBA操作)

业务低峰期,减小innodb_buffer_pool_size参数值(牺牲一定innodb性能)

innodb_buffer_pool_size建议范围值:申请的mysql内存总和 * (0.6 ~ 0.75)




一、补充信息:数据的长连接与短连接

1、定义

图片.png

2、区别

特性长连接短连接
生命周期较长,通常与用户会话或应用程序生命周期一致较短,通常与单次操作一致
连接开销初始建立连接的开销较大,但后续操作开销较小每次建立和关闭连接的开销较大
资源占用占用数据库连接资源时间较长占用数据库连接资源时间较短
适用场景需要频繁与数据库交互的场景,如实时数据处理、长时间运行的后台服务需要偶尔与数据库交互的场景,如 Web 应用中的单次查询或更新
管理复杂性需要管理连接的健康状态和超时机制管理相对简单,每次操作后关闭连接
性能影响如果连接过多可能导致数据库资源耗尽如果频繁建立和关闭连接可能导致性能瓶颈

3、对数据库的影响

长连接

图片.png

短连接

图片.png

4、如何避免大量的长连接

图片.png

图片.png

5、总结

  • 长连接适合需要频繁与数据库交互的场景,但需要合理管理连接的生命周期,避免资源耗尽。
  • 短连接适合偶尔与数据库交互的场景,但需要注意连接开销对性能的影响。
  • 连接池是解决长连接和短连接问题的有效工具,通过合理配置连接池,可以有效提高数据库的性能和资源利用率。
  • 优化应用程序逻辑和监控分析也是避免大量长连接的重要手段。

长连接和短连接的使用,要遵循一个平衡原则。

长连接持续存在,会一直占用内存资源,不会在短时间内释放。

线程栈空间:每个连接都会分配一个线程栈,通常默认大小为 256KB。

连接缓冲区:MySQL 为每个连接分配缓冲区,用于存储查询和结果集。

临时表和排序缓冲区:如果查询涉及临时表或排序操作,每个连接还会分配额外的临时表空间和排序缓冲区。




二、补充信息:wait_timeout 和 interactive_timeout 参数与空闲连接的控制

图片.png

简单记忆:• 写代码 → 受 wait_timeout 控制• 敲命令行 → 受 interactive_timeout 控制

-- 动态生效(重启失效) 
SET GLOBAL wait_timeout = 600; 
-- 10 分钟 
SET GLOBAL interactive_timeout = 600; 
-- 仅对当前会话生效 
SET SESSION wait_timeout = 600;

图片.png




三、补充信息:mysql排查连接被长时间占用

1、确认连接状态

SHOW PROCESSLIST;

2、获取连接详细信息

SHOW ENGINE INNODB STATUS;

3、查找长时间执行的查询(获取慢查)

# SET GLOBAL slow_query_log = 'ON'; 
# 记录执行时间超过1秒的查询 
SET GLOBAL long_query_time = 1; 
# 慢日志存放路径 
SHOW VARIABLES LIKE 'slow_query_log_file';

4、使用性能模式

# 默认是开启,以下是手动开启 
SET GLOBAL performance_schema = 'ON'; 
# 
SELECT * FROM performance_schema.events_statements_history;

5、优化sql语句(一般是加索引)

6、关闭闲置连接(wait_timeout 和 interactive_timeout)

通过以上方式,我们可以有效地排查和解决MySQL连接被长时间占用的问题。监控、分析和优化是提高数据库性能的重要环节。定期检查连接状态、保持良好的编码习惯和数据库设计,能显著减少连接占用的问题。建议在生产环境中定期执行这些检查,以保持系统的高可用性和高性能。




四、补充信息:mysql长连接的监控

1、内置工具

图片.png

2、第三方外部工具

图片.png




五、补充信息:优化mysql长连接

图片.png

MySQL长连接在现代Web应用中扮演着重要的角色。通过监控和优化长连接,可以提高数据库的性能和稳定性。本文介绍了MySQL长连接的监控与优化策略,包括使用MySQL内置工具和外部监控工具,以及优化连接池、处理逻辑和服务器配置等策略。通过实施这些策略,可以确保MySQL长连接的高效和可靠。