sys.memory_global_total 值不准
Posted 渔夫数据库笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sys.memory_global_total 值不准相关的知识,希望对你有一定的参考价值。
1.版本
1)操作系统
cat /proc/version
Linux version 3.10.0-1127.13.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) )
2)mysql数据库版本
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.19 |
+-----------+
1 row in set (0.00 sec)
2.问题描述
2.1 发现问题
数据库服务器报可用内存空间不足200M
1) free -m 查看服务整体内存使用情况
free -m
total used free shared buff/cache available
Mem: 7819 5526 170 10 2122 1983
Swap: 8191 2488 5703
1)通过ps_mem.py 查看各进程具体内存消耗
python ps_mem.py
Private + Shared = RAM used Program
.......
.......
.......
15.8 MiB + 131.0 KiB = 15.9 MiB node_exporter
32.3 MiB + 941.0 KiB = 33.2 MiB python2.7
178.5 MiB + 124.5 KiB = 178.7 MiB filebeat
4.9 GiB + 732.0 KiB = 4.9 GiB mysqld
---------------------------------
5.2 GiB
#省略了大部分内存空间占用较小的进程
#报警时没有记录内存信息,这些信息都是恢复后的信息,但是对于我们分析问题没有响应。我们看到服务器上占用内存最多的为 mysqld进程,占用了 4.9GB
3)通过 sys.memory_global_total 统计mysql内存使用情况
mysql> select * from sys.memory_global_total;
+-----------------+
| total_allocated |
+-----------------+
| 4.21 GiB |
+-----------------+
1 row in set (1.39 sec)
#我们看到通过 sys.memory_global_total 表我们统计到数据库只使用了 4.21GB的内存。为什么会小于4.9GB?
3.分析问题
sys.memory_global_total 统计值不准有三个原因
1)没有在实例启动时就开启所有的内存监控项
MySQL 8.0 之前版本默认只开启了performance_schema相关内存时间监控项。其他内存监控项默认都未启用,如需启用需要在配置文件中显示指定,可以通过如下方案启动所有内存监控项:
在配置文件中添加 performance-schema-instrument='memory/%=ON' 重启实例
2)只启用了部分内存监控项
确认是否开启了所有的内存监控项
select * from performance_schema.setup_instruments where name like '%memory%' and enabled!='YES';
3)有部分原本就没有进行统计监控
即使我们在数据库启动时就开启了所有的内存监控项,我们通过 sys.memory_global_total 统计到的数据库使用内存量和操作系统层面还是很存在差异。这是因为 mysql 并没有监控所有libiary 的内存分配,也没有监控实例把libiary导入到内存产生的内存使用量
相关连接:
https://dev.mysql.com/doc/refman/8.0/en/memory-use.html
https://bugs.mysql.com/bug.php?id=84174
以上是关于sys.memory_global_total 值不准的主要内容,如果未能解决你的问题,请参考以下文章