实例resize/重新启动后,RAM缓冲区使用率非常高

昨天下午,我们将其中一个Linode实例(CentOS 5.7,64位)从4GB实例调整为12GB。 紧接着重启之后,我注意到缓冲区的内存使用率非常高,比我在任何机器上所见过的都高。 即使在我使用率最高的服务器上,我也很less看到缓冲区使用量超过200MB。 在此服务器上,当前的缓冲区使用率比调整和重新启动之前高两个数量级

这是一个有移动前后数据的munin记忆图:

Munin Mempory图表

“munin”显示的数据被“free”的输出所证实:

[erik@host ~]$ free -m total used free shared buffers cached Mem: 11967 10146 1820 0 7374 1132 -/+ buffers/cache: 1639 10327 Swap: 255 0 255 

现在,我很清楚内核对caching的未使用内存的使用情况,但是我对缓冲区的理解是缓冲区不同。 它们被用来临时存储写入,直到它们被提交到磁盘。 这是一个正确的理解? 这个服务器有非常小的磁盘IO(这是一个Apache / PHP的networking服务器,数据库是在别处,所以只有实质IO是access_logs),因此,我希望缓冲区的使用率是相当低的。

以下是同一时间段的networkingstream量图:

在这里输入图像说明

正如你所看到的,调整前后的stream量并没有实质性的变化。

在重新启动期间,我知道有三件事改变了:

  1. 我们select了Linode在本周早些时候给出的另外4个内核,将总内核数量提升到了8。
  2. 我们在“最新的64位”内核上,现在是3.7.10-x86_64-linode30。 以前我们在3.0.18我相信。
  3. 我们从4GB的RAM到12GB。

在这些变化中,我的预感是这是新内核导致缓冲区使用增加的原因。 不幸的是,目前,我们不能把另一个宕机时间降级到一个较早的内核,尽pipe如果我不能理清这个缓冲区的使用情况,那么这可能最终是必要的。

那么,我有几个问题:

  1. 你们有没有运行3.7.10内核?如果是的话,你有没有看到类似的变化?
  2. 有哪些工具可用于检查内核缓冲区及其大小?
  3. 我认为,就像caching一样,当其他应用程序需要时,内核将释放这个内存。 它是否正确?

澄清这一点:

[缓冲区]用于临时存储写入,直到它们被提交到磁盘。 这是一个正确的理解?

不,那是不对的。

你似乎理解高速缓冲存储器的概念。 从磁盘读取文件时,文件作为caching保存在内存中。 如果一个应用程序需要再次访问这个文件,那么访问来自快速的RAM,而不是从磁盘再次访问文件,这很慢。

如果一个应用程序需要写入这个文件,那么这个写入是在RAM中的文件上执行的,速度很快,而内核将这些内存页面标记为“脏”。 就应用程序而言,写入是完整的,应用程序可以回到做任何事情。

内核在稍后处理将脏页面刷新到磁盘。 您可以使用sync命令强制刷新所有脏页面,否则您将看到刷新守护进程(pdflush或bdflush)不时被唤醒。

您可以随时使用cat /proc/meminfo | grep Dirty查看脏内存的数量 cat /proc/meminfo | grep Dirty

为了更正你的理解,Linux的清理页面caching(已被读取的文件)和脏页面caching(等待写入到磁盘的文件)都被视为“caching”。

如果进程请求更多的虚拟内存分配,则可以释放文件高速caching。 共享内存段和tmpfs也被报告为“caching”,但是这些不能像文件caching一样被释放。

通常“缓冲区”是运行进程的内存分配。 看看top -a或类似的东西,看看哪个进程占用了大部分RAM。