点击上方"蓝字"

关注我们,享更多干货!

MySQL使用内存上升90%!在运维过程中50%的几率,会碰到这样的问题。算是比较普遍的现象。

MySQL内存使用率过高,有诸多原因。普遍原因是使用不当,还有MySQL本身缺陷导致的。到底是哪方面的问题,那就需要一个一个进行排查。

下面介绍排查思路:

1.参数配置需要确认,内存是否设置合理

MySQL内存分为全局和线程级:

  • 全局内存(如:innodb_buffer_pool_size,key_buffer_size,innodb_log_buffer_size)。

  • 线程级内存:(如:thread,read,sort,join,tmp 等)只是在需要的时候才分配,并且在操作完毕之后就释放。

  • 线程级内存:线程缓存每个连接到MySQL服务器的线程都需要有自己的缓冲。默认分配thread_stack(256K,512k),空闲时这些内存是默认使用,除此之外还有网络缓存、表缓存等。大致评估会在1M~3M这样的情况。可通过pmap观察内存变化:

mysql> SELECT @@query_cache_size,@@key_buffer_size,@@innodb_buffer_pool_size ,@@innodb_log_buffer_size ,@@tmp_table_size ,@@read_buffer_size,@@sort_buffer_size,@@join_buffer_size ,@@read_rnd_buffer_size,@@binlog_cache_size,@@thread_stack,(SELECT COUNT(host) FROM  information_schema.processlist where command<>'Sleep')\G;
*************************** 1. row ***************************
@@query_cache_size:1048576
@@key_buffer_size:8388608
@@innodb_buffer_pool_size:268435456
@@innodb_log_buffer_size:8388608
@@tmp_table_size:16777216
@@read_buffer_size:131072
@@sort_buffer_size:1048576
@@join_buffer_size:1048576
@@read_rnd_buffer_size:2097152
@@binlog_cache_size:8388608
@@thread_stack:524288
(select count(host) from information_schema.processlist where command<>'Sleep'): 1

备注:query_cache_size 8.0版本已经废弃掉了。

2.存储过程&函数&触发器&视图

目前积累的使用经验中,存储过程&函数&触发器&视图 在MySQL场景下是不适合的。性能不好,又容易发现内存不释放的问题,所以建议尽量避免。

  • 存储过程&函数

MySQL 5.7
mysql> SELECT db,type,count(*)
FROM mysql.proc
WHERE db not in ('mysql','information_schema','performance_schema','sys')
GROUP BY db, type;
MySQL 8.0
mysql> SELECT  Routine_schema, Routine_type
FROM information_schema.Routines
WHERE  Routine_schema not in ('mysql','information_schema','performance_schema','sys')
GROUP BY Routine_schema, Routine_type;
  • 视图

mysql> SELECT  TABLE_SCHEMA , COUNT(TABLE_NAME)
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA not in ('mysql','information_schema','performance_schema','sys')
GROUP BY TABLE_SCHEMA ;
  • 触发器

mysql> SELECT TRIGGER_SCHEMA, count(*) FROM information_schema.triggers
WHERE  TRIGGER_SCHEMA not in ('mysql','information_schema','performance_schema','sys')
GROUP BY TRIGGER_SCHEMA;

上面通过MySQL配置参数和设计层面检查了是否有可能内存泄露的问题。下面看看怎样分析实际使用的内存情况。

3.系统库统计查询

  • 总内存使用
mysql> SELECT
SUM(CAST(replace(current_alloc,'MiB','')  as DECIMAL(10, 2))  )
FROM sys.memory_global_by_current_bytes
WHERE current_alloc like '%MiB%';
  • 分事件统计内存
mysql> SELECT event_name,
SUM(CAST(replace(current_alloc,'MiB','')  as DECIMAL(10, 2))  )
FROM sys.memory_global_by_current_bytes
WHERE current_alloc like '%MiB%' GROUP BY event_name  ORDER BY SUM(CAST(replace(current_alloc,'MiB','')  as DECIMAL(10, 2))  ) DESC ;mysql> SELECT event_name,sys.format_bytes(CURRENT_NUMBER_OF_BYTES_USED)
FROM performance_schema.memory_summary_global_by_event_name
ORDER BY  CURRENT_NUMBER_OF_BYTES_USED DESC
LIMIT 10;
  • 账号级别统计
mysql> SELECT user,event_name,current_number_of_bytes_used/1024/1024 as MB_CURRENTLY_USED
FROM performance_schema.memory_summary_by_account_by_event_name
WHERE host<>"localhost"
ORDER BY  current_number_of_bytes_used DESC LIMIT 10;

备注:有必要统计用户级别内存,因为很多环境对接了第三方插件,模拟从库,这些插件容易内存不释放。

  • 线程对应sql语句,内存使用统计
SELECT thread_id,event_name,sys.format_bytes(CURRENT_NUMBER_OF_BYTES_USED)
FROM performance_schema.memory_summary_by_thread_by_event_name
ORDER BY  CURRENT_NUMBER_OF_BYTES_USED DESC
LIMIT 20;
SELECT m.thread_id tid,m.user,esc.DIGEST_TEXT,m.current_allocated,m.total_allocated
FROM sys.memory_by_thread_by_current_bytes m,performance_schema.events_statements_current esc
WHERE m.`thread_id` = esc.THREAD_ID \G
  • 打开所有内存性能监控,会影响性能,需注意
#打开
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'memory/%';
#关闭
UPDATE performance_schema.setup_instruments SET ENABLED = 'NO' WHERE NAME LIKE 'memory/%';
#查看使用
SELECT * FROM performance_schema.memory_summary_global_by_event_name
WHERE EVENT_NAME LIKE 'memory/%'
ORDER BY CURRENT_NUMBER_OF_BYTES_USED DESC;
  • 系统表内存监控信息

select * from sys.x$memory_by_host_by_current_bytes;
select * from sys.x$memory_by_thread_by_current_bytes;
select * from sys.x$memory_by_user_by_current_bytes;
select * from sys.x$memory_global_by_current_bytes;
select * from sys.x$memory_global_total;
select * from performance_schema.memory_summary_by_account_by_event_name;
select * from performance_schema.memory_summary_by_host_by_event_name;
select * from performance_schema.memory_summary_by_thread_by_event_name;
select * from performance_schema.memory_summary_by_user_by_event_name;
select * from performance_schema.memory_summary_global_by_event_name;

备注:找到对应问题事件或线程后,可以进行排查,解决内存高的问题。

4.系统工具查看内存

1)top命令

显示系统中各个进程的资源占用状况。

  • Shift + m 键 查看内存排名实际使用内存情况,关注RES指标。

2)free命令

free-h 命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。

  • used列显示已经被使用的物理内存和交换空间。

  • buff/cache列显示被buffer和cache使用的物理内存大小。

  • available列显示还可以被应用程序使用的物理内存大小。

  • Swap行(第三行)是交换空间的使用情况。

3)ps命令

MySQL相关进程使用内存情况。

shell > ps eo user,pid,vsz,rss $(pgrep -f 'mysqld')
USER         PID    VSZ   RSS
root      215945  12960  2356
mysql     217246 1291540 241824
root      221056  12960  2428
mysql     374243 1336924 408752
4)pmap 命令

pmap是Linux调试及运维一个很好的工具,查看进程的内存映像信息。

用法1:执行一段时间记录数据变化,最少20个记录,下面22837是MySQL pid
while true; do pmap -d  22837  | tail -1; sleep 2; done
用法2:linux 命令pmap MySQL pid导出内存,下面22837是MySQL pid
pmap -X -p 22837 > /tmp/memmysql.txt

RSS就是这个process实际占用的物理内存。

Dirty: 脏页的字节数(包括共享和私有的)。

Mapping: 占用内存的文件、或[anon](分配的内存)、或[stack](堆栈)。

writeable/private:进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小。

1.首先使用/top/free/ps在系统级确定是否有内存泄露。如有,可以从top输出确定哪一个process。

2.pmap工具是能帮助确定process是否有memory leak。确定memory leak的原则:writeable/private (‘pmap –d’输出)如果在做重复的操作过程中一直保持稳定增长,那么一定有内存泄露。

总结

对于MySQL内存泄露来说:

  • 从参数设置和设计上尽量合理

  • 通过ps库进行排查

  • linux工具进一步确认

  • 官方bug里memory leak查找,是否存在修复的版本

以上排查里都没有找到原因,可以换下服务器或主从切换观察。也可以进行版本升级(代价不小)。

如能提供一个实际环境,也可以一步一步进行调试,抓取内存变化,确定是什么导致内存泄露的问题。之后提交bug,让官方提供修复。

关于作者

崔虎龙,云和恩墨MySQL技术顾问,长期服务于金融、游戏、物流等行业的数据中心,设计数据存储架构,并熟悉数据中心运营管理的流程及规范,自动化运维等。擅长MySQL、Redis、MongoDB数据库高可用设计和运维故障处理、备份恢复、升级迁移、性能优化。自学通过了MySQL OCP 5.6和MySQL OCP 5.7认证。2年多开发经验,10年数据库运维工作经验,其中专职做MySQL工作8年;曾经担任过项目经理、数据库经理、数据仓库架构师、MySQL技术专家、DBA等职务;涉及行业:金融(银行、理财)、物流、游戏、医疗、重工业等。

墨天轮原文链接:https://www.modb.pro/db/86827(复制链接至浏览器或点击文末阅读原文查看)

END

推荐阅读:267页!2020年度数据库技术年刊

推荐下载:2020数据技术嘉年华PPT下载

2020数据技术嘉年华近50个PPT下载、视频回放已上传墨天轮平台,可在“数据和云”公众号回复关键词“2020DTC”获得!

你知道吗?我们的视频号里已经发布了很多精彩的内容,快去看看吧!↓↓↓

点击下图查看更多 ↓

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看”

你的喜欢会被看到❤

关于MySQL内存泄露如何排查的一些思路相关推荐

  1. 一次堆外内存泄露的排查过程

    转载自  一次堆外内存泄露的排查过程 最近在做一个基于 websocket 的长连中间件,服务端使用实现了 socket.io 协议(基于websocket协议,提供长轮询降级能力) 的 netty- ...

  2. c mysql 内存泄露_c代码连接mysql数据库内存泄露的问题

    一直使用C代码连接mysql数据库,今天用valgrind检测,发现存在内存泄露的问题 代码如下 MYSQL*connection; connection=mysql_init(); connecti ...

  3. java查看内存泄露_Java内存泄露如何排查

    Java内存泄露是常常出现的问题,Java攀登网进行了该问题的整理,具体的如下所示: 1.2 内存泄露Memory Leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内 存泄露危害可以忽略 ...

  4. 我们有一个线上的项目,刚启动完就占用了超过 1.5G,一次大量 JVM Native 内存泄露的排查分析(64M 问题)

    我们有一个线上的项目,刚启动完就占用了使用 top 命令查看 RES 占用了超过 1.5G,这明显不合理,于是进行了一些分析找到了根本的原因,下面是完整的分析过程,希望对你有所帮助. 会涉及到下面这些 ...

  5. 震精!Spring Boot内存泄露,排查竟这么难!

    作者 | 纪兵 来源 | http://suo.im/5MABXL 背景 为了更好地实现对项目的管理,我们将组内一个项目迁移到MDP框架(基于Spring Boot),随后我们就发现系统会频繁报出Sw ...

  6. java 内存泄露对象排查_记录一次 java内存泄漏的排查

    1.问题:jar进程会随着时间由 30% 上涨到 70% 直到虚机报警.重启过后,还是会缓慢上涨: 进程数也在上涨: 2.在排查内存问题时,可能会使用的命令 1)查看 java 进程:jps -l 可 ...

  7. 震京!Spring Boot内存泄露,排查竟这么难!

    作者:纪兵 来源:tech.meituan.com/2019/01/03/spring-boot-native-memory-leak.html 背景 为了更好地实现对项目的管理,我们将组内一个项目迁 ...

  8. Spring Boot内存泄露,排查竟这么难!

    点击上方"阿拉奇学Java",选择"置顶或者星标"  每天早晨00点00分, 与你相约! 作者 | 纪兵来源 | http://suo.im/5MABXL 往日 ...

  9. 内存泄露从入门到精通三部曲之常见原因与用户实践

    2019独角兽企业重金招聘Python工程师标准>>> 内存泄露从入门到精通三部曲之常见原因与用户实践 腾讯Bugly特约作者: 姚潮生 常见原因 1.集合类 集合类如果仅仅有添加元 ...

最新文章

  1. 【browser】chinese chrome shows as english
  2. 安装setuptools的UnicodeDecodeError
  3. 彻底清除备份域服务器数据元的方法
  4. [POJ 3164]Command Network(最小树形图,朱刘算法)
  5. 开发黑名单功能demo_中台实践:通用化黑名单平台
  6. 20175333曹雅坤实验四《Android程序设计》实验报告
  7. Python 中文Key 报错问题
  8. 阿里成立智能搜索业务部;任天堂:共有30万账号被黑客入侵;TiDB 3.1.2 发布| 极客头条...
  9. leetcode大纲
  10. android gesture,Android Gesture 手势创建以及使用示例
  11. 怎么在wps里做计算机,解决方案:如何在wps中制作电子小报
  12. 小程序源码:全新独立后台月老办事处一元交友盲盒-多玩法安装简单
  13. 谷歌开源谷歌地球企业版源码
  14. hosts文件相关(hosts文件位置、hosts文件的一些用途、cmd命令修改hosts文件)
  15. “企业级零代码黑客马拉松大赛”决赛名单公布
  16. Dart Isolate
  17. 虚拟化是什么,虚拟化主要分为哪几种?
  18. Java岗面试题--Java基础(日积月累,每日三题)
  19. WordPress 文章点赞
  20. CSS z-index属性层重叠顺序

热门文章

  1. 不能断点调试python_为Python调试构建一个不间断的断点
  2. 安卓 dump 工具 影响_工具如何影响文化?
  3. bash 命令提示符_命令行上每天的Bash提示
  4. git blob_如何使用Git管理二进制Blob
  5. (3)Node.js APIS
  6. Bootstrap3 折叠插件的使用方法
  7. 视觉SLAM笔记(14) Eigen几何模块
  8. list mybatis批量保存_springboot2.x基础教程:集成mybatis最佳实践
  9. 如何将Excel表批量赋值到ArcGIS属性表
  10. JustOJ1500: 蛇行矩阵