为什么 MySQL 突然将其“实际”内存使用量移至交换区并释放差额?图片已附上

为什么 MySQL 突然将其“实际”内存使用量移至交换区并释放差额?图片已附上

毫无理由(没有大查询、没有大 CPU 负载、没有任何变化)Ubuntu 10.04 上的 Mysql 5.1 突然释放了大约 20% 的池内存并将其移至交换。现在我的交换内存使用率一直保持在约 30% 左右……(除非它降低并重新调整)

但为什么会这样呢?根据 top,mysql VIRT 和 RES 保持不变 @ 12.5g 11g 。那么为什么内存会这样移动呢?

这是在 16GB 系统上,其中保留 12GB 作为 Innodb_buffer_pool 。

mysql服务大约3个月没有重启过。在此处输入图片描述

答案1

MySQL 不负责管理服务器上的交换;这是内核内存管理子系统的工作。控制此特定行为的内核可调参数称为“swappiness”,您可以在此处阅读更多相关信息:

http://kerneltrap.org/node/3000

基本上,如果应用程序请求一定量的内存,而服务器的内存已满,则它会让应用程序等待,直到有足够的空闲内存内容被调出,这会导致应用程序出现延迟。因为我们不希望出现这种延迟,所以内核会尝试始终保持一定量的内存可用。通过在服务器即将耗尽内存时抢先在后台执行此操作,它可以确保立即满足服务器上任何新的内存请求,从而加快速度,而不会明显影响任何正在运行的应用程序。无论如何,这只是理论上的。

有时您不希望出现这种情况,尤其是当服务器上的所有物理内存都应该被某些应用程序(例如 MySQL)用作缓存时。在这些情况下,您需要将 vm.swappiness sysctl 降低到 0。

答案2

如果长时间没有访问内容,系统会将其从 RAM 中移出。这样可腾出更多物理内存来保存可能影响性能的内容。

一次移动如此多信息的原因可能是交换行为从未被触发过(或者很长时间没有触发过),因此积累了大量系统能够跟踪的旧信息。弹出任何触发的内容都会弹出所有这些内容。(系统的页面年龄跟踪非常粗糙,因为跟踪粒度会大大增加软页面错误的成本。)

很可能所有这些数据都不会被使用。它们会一直保存在磁盘上,直到系统重新启动。因此,系统现在用来保存将要使用的数据的额外可用内存实际上是空闲的。

相关内容