Linux内存中的Cache真的能被回收么?
这篇讲的是Linux系统中一个经典但常被误解的问题:那些被buffer和cache占用的内存,到底能不能在需要时被释放。文章从`free`命令的输出切入,指出了三种不同层次的理解,并重点剖析了第二种——即很多人认为buffer/cache内存“随时可释放”的认知其实并不完全准确。 作者清晰解释了page cache和buffer cache的核心区别:前者主要用于缓存文件读写,后者用于块设备I/O缓存。Linux内核确实会在内存压力大时回收这些缓存,但这个过程并非没有代价——回收前必须确保缓存数据与磁盘文件一致,往往会导致瞬间的IO飙升。 文章的真正价值在于通过一个具体的tmpfs实验揭示了回收的边界。当把大量数据存入基于内存的tmpfs文件系统时,这部分内存会体现在`cached`指标里,`free`命令也提示有很多“可用”内存。然而,当尝试手动执行`echo 3 > /proc/sys/vm/drop_caches`进行回收时,这部分内存却无法被释放,因为它本质就是系统分配给tmpfs的物理内存,不属于可回收的缓存范畴。 因此,结论很明确:并非所有在`free`命令中显示为“cached”的内存都能被回收。像tmpfs这类“内存就是存储”的场景,占用的空间是“实实在在”的已使用内存,这与加速文件访问的磁盘缓存有本质区别。理解这一点,对于准确评估系统内存压力至关重要。