为什么Linux在快要快用完时清除内存缓存?


14

这是运行CentOS的VPS上具有512MB RAM和nginx / php-fpm / mysqld为每天成千上万的访客提供内容(主要是静态的)的VPS的内存图。

每周记忆图

(x轴上的天数)

如您所见,它在缓存和缓冲区区域中非常跳跃。内存缓存将以不规则的时间间隔清除(排除负责的cron作业)。通常但不总是将其清除到不再增长的程度。有时它几乎全部清除,而其他时候只有一半清除。

我试图了解这些清除背后的逻辑。我希望文件数据被缓存的时间更长,并且清除内存缓存后不会看到任何其他程序使用比通常更多的内存。

这是正常的行为,还是我缺少了什么?

更新:内存升级似乎已经稳定了图表。仍然有少量下降,但没有比升级之前重要的地方。

内存升级后


这是OpenVZ / Virtuozzo容器还是真实的VM(例如XEN或KVM)?
jordanm 2012年

1
无法解释它们是什么,但是我有一个显示相同行为的VPS。 dl.dropbox.com/u/1578899/memory-week.png
EightBitTony 2012年

@jordanm这是一个基于Xen的虚拟机。
redburn 2012年

@EightBitTony感谢您的分享。您的看上去更“自然”,但我确实清楚地看到了内存缓存中丢弃的类似(但也许更可预测)的模式。
redburn 2012年

我确实想知道Munin 2是否以足够不同的方式绘制/收集数据以导致某些差异(您的平滑曲线),但即使是我的,它也在周期的中间而不是每天都有下降。当然,这很奇怪。
AugustBitTony 2012年

Answers:


3

可能有很多事情。可能您正在运行的程序之一偶尔会短暂占用大量RAM。如果在x轴上确实是几周,则应该以更高的分辨率(例如,每分钟甚至每秒一次)进行采样,以获取有关导致缓存丢失的最新信息。 ps并且top在该时间期间输出(包括负载平均值)将是有用的。


是的,我想我们可以推断出,内存使用非常短而突然的突发(大约在一分钟之内发生),而Munin并没有发现它可能会转储缓存,这当然是因为持久存在而发现的。
AugustBitTony 2012年

标头有点令人困惑,因为它实际上显示的是一周的数据,因此,这些是x天的天数,而不是几周。至于轮询频率:Munin每5分钟获取一次数据,我认为频率不能改变。我只运行nginx,mysql,php-fpm和munin-node。可能与mysql缓存有关吗?
redburn 2012年

我先按内存使用量排序(按内存使用量排序),然后每5秒将其输出写入一个文件,然后我对该文件进行了分析,发现在缓存内存突然下降时,没有进程显示任何异常行为。除非一个进程可以使用这么多的内存并且仍能逃脱那5秒的窗口,否则我不相信这可能是原因。但是,如果没有进程运行amok,那会是什么?
redburn 2012年

这个线程是有点陈旧,但有关方法快速观察:多少进程有助于系统内存缓存将不(容易)被以反映顶部,因为一个非常活跃的过程中可能会发生重叠的东西到缓存中非常迅速地没有自己分配的内存增加了很多。例如,以小块读取非常大的文件以进行传输-尽管该进程可能永远不会使用分配的几个MB ,但那几个MB将不断更改并在高速缓存中累积引用。因此,要在顶部输出中查看的内容将是CPU时间的突然累积。
goldilocks 2012年

:您可能也有兴趣在这个cognitivedissonance.ca/cogware/plog
金发姑娘

2

一个可能的原因是文件不断增长,例如日志,在达到给定大小时被删除,压缩或发送到其他地方。

无论哪种情况,一旦删除原始文件,它的缓存大小(如果操作系统中没有内存压力,可能是整个大小)都会从缓存中释放出来。


一个有趣的想法,但是最活跃的日志文件在轮换之前很少超过25MB的文件大小,并且缓存/缓冲区的使用量往往会下降约200MB。
redburn 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.