为什么MySQL突然将它的“真实”内存使用交换和释放差异? img附上

没有很好的理由(没有大的查询,没有大的CPU负载,没有任何改变)Ubuntu 10.04上的Mysql 5.1突然释放了大约20%的内存并将其移动到交换中。 现在我的交换内存使用率是一个常量~30%..(除非它降低和重新调整自己)

但为什么这样做呢? 根据顶部,MySQL VIRT和RES保持不变@ 12.5克11克。 那为什么记忆会这样呢?

这是一个16GB的系统,预留了12GB的Innodb_buffer_pool。

mysql服务在3个月左右没有重启。 在这里输入图像说明

MySQL不负责pipe理服务器上的交换; 这是内核内存pipe理子系统的工作。 支配这种特定行为的内核可调参数被称为“swappiness”,您可以在这里阅读更多关于它的内容:

http://kerneltrap.org/node/3000

基本上,如果应用程序请求一定量的内存,并且服务器的内存已满,则会使应用程序等待,直到有足够的空闲内存内容可以分页出去,这会在应用程序中造成延迟。 因为我们不想要这个延迟,所以内核会尽量保持一定的内存空间。 在服务器接近耗尽内存的时候,通过这种方式抢占性地在后台执行此操作,可以确保服务器上任何新的内存请求都能够立即实现,从而加快速度,而不会明显影响任何正在运行的应用程序。 无论如何,这就是理论。

有时你不希望这样做,特别是如果服务器上的所有物理内存应该被某些应用程序(例如MySQL)用作caching。 在这种情况下,您需要将vm.swappiness sysctl降至0。

如果系统在很长的一段时间内没有被访问,那么系统会将内容移出内存。 这使更多的物理内存可用来容纳可能影响性能的东西。

这么多信息一下子移动的原因可能是换出行为从来没有被触发过(或者没有很长一段时间),所以积累了大量的信息,这些信息和系统能够跟踪的一样大。 popup所有触发的东西。 (系统的页面时间跟踪非常粗糙,因为跟踪粒度带来了软页面错误的大量增加的成本。)

可能几乎所有这些都是永远不会被使用的数据。 它将设置在磁盘上,直到系统重新启动。 因此,系统现在必须保存的数据将被使用的额外空闲内存是有效的。