内存统计与监控,你知多少?
内容提要
本文讨论了Linux系统中的内存统计命令和相关概念,介绍了free命令查看系统内存信息的方法,以及Page Cache、Buffer Cache和Swap等统计项。还解释了VSS、RSS、PSS等进程级别的内存统计指标,并提到了top命令中的内存使用统计信息。
延伸解读
理解内存统计的近似性
文章指出,内核并没有绝对精确地统计所有内存使用量,例如通过alloc_pages接口申请的内存不一定被统计在内。因此,free命令中的available以及/proc/meminfo中的MemAvailable都是内核估计的近似值,并非精确的可用内存大小。读者在依赖这些指标进行容量规划或性能分析时,应意识到其局限性,避免过度解读。
Page Cache与Buffer Cache的演变
文章提到,Linux 2.4.10内核之前存在Buffer Cache和Page Cache两种磁盘缓存,之后Buffer Cache概念被取消,其数据被并入Page Cache,其中与buffer_head关联的页称为Buffer Pages,在内存统计中用buffers指标单独统计。这解释了为什么现代系统中buffers和cached同时存在,以及它们的历史渊源。
进程内存指标的选择与陷阱
文章详细解释了VSS、RSS、PSS、USS的区别,并指出RSS包含了共享库占用的内存,直接累加所有进程的RSS会导致共享内存重复计算。而PSS将共享库大小按比例分摊给各进程,累加后更准确。此外,/proc/{pid}/smaps提供了更细粒度的分段统计,最新内核还引入了smaps_rollup支持分类统计。读者在监控进程内存时,应根据场景选择合适的指标。
共享内存统计的特殊性
文章指出,共享内存在内核中基于tmpfs实现,虽然属于File-backed Pages,但被链接到Inactive(anon)和Active(anon)链表,且不计入AnonPages,而是计入Cached和Mapped。因此,Inactive(anon)+Active(anon)不等于AnonPages,Active(file)+Inactive(file)也不等于Mapped。理解这些差异有助于正确解读/proc/meminfo中的各项数值。
Q&A
如何使用free命令查看Linux系统的内存信息?
使用free命令可以查看系统的总内存、已使用内存、未使用内存等信息,输出包括total、used、free、shared、buffers、cached和available等项。
什么是Page Cache和Buffer Cache,它们的作用是什么?
Page Cache用于缓存文件内容,Buffer Cache用于缓存磁盘文件系统读取的块。自Linux 2.4.10后,Buffer Cache的概念被合并到Page Cache中。
VSS、RSS、PSS和USS分别代表什么?
VSS是虚拟内存大小,RSS是实际使用的物理内存,PSS是按进程数均摊的物理内存,USS是进程独自占用的物理内存。
如何通过top命令查看内存使用情况?
top命令提供内存使用的统计信息,包括VIRT(虚拟内存大小)、RES(驻留内存大小)、SHR(共享内存大小)等。
什么是/proc/meminfo文件,它包含哪些信息?
/proc/meminfo文件提供系统内存的详细统计信息,包括MemTotal、MemFree和MemAvailable等项,帮助用户了解内存使用情况。
Linux系统中的Swap是如何工作的?
Swap用于在内存不足时将匿名内存页写入硬盘的交换区,以释放内存。Swap包括SwapTotal(总大小)和SwapFree(可用大小)等统计项。