MySQL 使用的内存超过了它所能承受的范围?

MySQL 使用的内存超过了它所能承受的范围?
FROM: -- MYSQL PERFORMANCE TUNING PRIMER --
MySQL Version 5.6.24-72.2-log x86_64
...
MEMORY USAGE
Max Memory Ever Allocated : 70.35 G
Configured Max Per-thread Buffers : 972 M
Configured Max Global Buffers : 70.04 G
Configured Max Memory Limit : 70.99 G
Physical Memory : 125.88 G
Max memory limit seem to be within acceptable norms
...

TOP 报告称:

3642 mysql     20   0  146g 120g 6300 R 48.1 95.8 125131:57 mysqld

如果根据调整器,MySQL 的使用量绝不会超过 70.99 G。我还能检查 MySQL 进程正在做什么来使用超过两倍的内存吗?

答案1

你混淆了三种完全不同的测量方法:

  1. MySQL 要求分配多少内存。这就是您要配置的 71GB。

  2. MySQL 使用了多少虚拟内存。这是 146GB。您没有理由关心这个,虚拟内存实际上是免费的。(例如,内存映射文件将增加虚拟内存消耗。)

  3. 操作系统决定为 MySQL 分配多少物理内存。这是 120GB。如果没有内存压力,操作系统通常会为程序分配比它们要求的更多的物理 RAM,并认为这可以减少分页量。当没有内存压力时,物理内存使用量上升到接近虚拟内存使用量的情况并不罕见。

操作系统可以努力回收物理内存,但是由于以下三个原因它并没有这么做:

  1. 这样做是浪费精力,因为没有必要这么做。

  2. 这样做会增加 MySQL 遇到的页面错误,因为如果它访问任何虚拟页面而它们没有映射到物理内存,就会导致页面错误。

  3. 这样做并不会使得以后使用该内存做其他事情变得更容易,因为操作系统必须付出努力将其从空闲状态转换为已使用状态。

如果系统内存不足,操作系统将被迫回收物理内存。您应该会看到物理 RAM 使用率下降到您配置的水平左右,但页面错误的数量可能会有所增加。

因此,您观察到的一切都并不表明存在任何问题。

相关内容