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

“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量并没有实质性的变化。
在重新启动期间,我知道有三件事改变了:
在这些变化中,我的预感是这是新内核导致缓冲区使用增加的原因。 不幸的是,目前,我们不能把另一个宕机时间降级到一个较早的内核,尽pipe如果我不能理清这个缓冲区的使用情况,那么这可能最终是必要的。
那么,我有几个问题:
澄清这一点:
[缓冲区]用于临时存储写入,直到它们被提交到磁盘。 这是一个正确的理解?
不,那是不对的。
你似乎理解高速缓冲存储器的概念。 从磁盘读取文件时,文件作为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。