1、什么叫OOM

全名称为:Out Of Memory

内存溢出已经是软件开发历史上存在了近40年的“⽼⼤难”问题。在操作系统上运⾏各种软件时,软件所需申请的内存远远超出了物理内存所承受的⼤⼩,就叫内存溢出。
内存溢出产⽣原因多种多样,当内存严重不⾜时,就很容易出现OOM

 

2、产生OOM原因

主要原因就是内存不足,其中performance_schema 功能在带给我们更多性能监控手段的同时,也占用了太多的内存

 

3、OOM优化

优化一:innodb_buffer_pool_size 设置为最小128M,建议设置内存的75%-80%

innodb_buffer_pool_size 是MySQL内存占用的大户,首先拿它开刀,设置为最小的128M。

优化二:关闭performance_schema
mysql> SHOW VARIABLES LIKE 'performance_schema';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| performance_schema | ON    |
+--------------------+-------+
1 row in set (0.03 sec)

performance_schema 8.0版本默认设置为 ON,建议关闭,即关闭performance_schema 中的各项性能监控

关闭之后,MySQL 8.0 运行一周多时间,没有发生 OOM。performance_schema 功能在带给我们更多性能监控手段的同时,也占用了太多的内存,看来它是引起 MySQL OOM 的主要原因。

MySQL Bug 列表中有一个关于 performance_schema 的 Bug,它会占用大量内存,导致 MySQL 进程 OOM,所以如果内存不大,可以考虑将其关闭,或者升级到最新的 MySQL 版本。

优化三:调低各种buffer,cache参数

各种buffer, cache 参数,根据实际情况进行更改,只要不经常OOM,能稳定运行就好。

比如:

  • innodb_log_buffer_size
  • innodb_sort_buffer_size
  • join_buffer_size
  • key_buffer_size
  • myisam_sort_buffer_size
  • sort_buffer_size
  • binlog_cache_size
优化四:优化SQL

低效的 SQL ,尤其是执行计划中带 filesort 的 SQL,在高并发下,会占用大量的内存。可以通过添加索引,优化表结构,优化 SQL 语句,优化业务逻辑等等,减少慢 SQL 的产生,进而减少内存的占用

 

Do everything well