![MySQL 使用的内存超过了它所能承受的范围?](https://linux22.com/image/669079/MySQL%20%E4%BD%BF%E7%94%A8%E7%9A%84%E5%86%85%E5%AD%98%E8%B6%85%E8%BF%87%E4%BA%86%E5%AE%83%E6%89%80%E8%83%BD%E6%89%BF%E5%8F%97%E7%9A%84%E8%8C%83%E5%9B%B4%EF%BC%9F.png)
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
你混淆了三种完全不同的测量方法:
MySQL 要求分配多少内存。这就是您要配置的 71GB。
MySQL 使用了多少虚拟内存。这是 146GB。您没有理由关心这个,虚拟内存实际上是免费的。(例如,内存映射文件将增加虚拟内存消耗。)
操作系统决定为 MySQL 分配多少物理内存。这是 120GB。如果没有内存压力,操作系统通常会为程序分配比它们要求的更多的物理 RAM,并认为这可以减少分页量。当没有内存压力时,物理内存使用量上升到接近虚拟内存使用量的情况并不罕见。
操作系统可以努力回收物理内存,但是由于以下三个原因它并没有这么做:
这样做是浪费精力,因为没有必要这么做。
这样做会增加 MySQL 遇到的页面错误,因为如果它访问任何虚拟页面而它们没有映射到物理内存,就会导致页面错误。
这样做并不会使得以后使用该内存做其他事情变得更容易,因为操作系统必须付出努力将其从空闲状态转换为已使用状态。
如果系统内存不足,操作系统将被迫回收物理内存。您应该会看到物理 RAM 使用率下降到您配置的水平左右,但页面错误的数量可能会有所增加。
因此,您观察到的一切都并不表明存在任何问题。