我有一个专用的 Web 服务器,通过 NFS 提供静态文件服务。该服务器有 32GB 的 RAM,但缓存内存从未超过 16GB。
我很确定 SO 可以分配更多,因为全天缓存内存保持固定在 16GB,但是当 logrotate 运行时,缓存内存会增加到 30GB。
我一直在使用 /proc/slabinfo (nfs_direct_cache nfs_read_data nfs_inode_cache) 中的几个值,但没有成功。
如果有任何关于此的提示或链接我将不胜感激。
提前致谢。
答案1
如果您谈论的是页面缓存,那么它会根据您访问的文件、您访问的文件内的数据量以及文件的活跃程度而增长。
在现代内核中,当文件被缓存时,它会立即被标记为非活动状态,直到再次使用。这并不意味着它会被从缓存中逐出,但在内存压力较高的系统(活动的匿名映射页面)中,它可能会被很快丢弃。
缓存大小也由内存压力决定。这基本上是缓存扫描次数与从“非活动”提升为“活动”和反之亦然的页面数之比。与从磁盘访问此数据需要多少磁盘寻道之比。因此,实际上如果扫描和维护缓存所需的时间比从磁盘访问某些数据所需的时间更长,则不要增加页面缓存大小。
可能是您没有通过文件访问产生足够的内存压力,因此使用更多页面缓存不会有任何好处。这意味着每天大约有 16G 的页面被访问,并且这个数字不会经常变化。
我猜想在 logrotate 中,如果您刚刚按顺序读取的文件(导致 30G)被取消链接,那么它使用的页面就不再需要存在了。这也许可以解释为什么页面缓存大小再次减小。
据我所知,这仅与 2.6.28 版后的内核有关,因为这些内核改变了内存管理算法。