1. 问题现象与初步排查
那天凌晨3点,监控系统突然发出刺耳的警报声——线上服务器的PageCache使用量在短短5分钟内从2GB飙升至16GB,直接吃掉了80%的物理内存。作为值班工程师,我第一反应是检查常规内存泄漏工具,但smem和top显示的用户态进程内存都正常。这种"隐形"的内存占用往往意味着内核层面的问题。
通过free -h命令确认了现象:
code复制 total used free shared buff/cache available
Mem: 32G 5.2G 512M 1.3G 26G 24G
Swap: 0B 0B 0B
buff/cache列显示26G内存被占用,而cat /proc/meminfo进一步确认是PageCache激增:
code复制Cached: 27234412 kB
SwapCached: 0 kB
2. PageCache机制深度解析
2.1 Linux的缓存设计哲学
Linux内核采用"空闲内存就是浪费内存"的设计理念,会主动将空闲内存用于磁盘缓存(PageCache)和缓冲区(Buffer Cache)。当应用程序需要更多内存时,内核会智能地释放这些缓存。这种机制能极大提升IO性能,但也可能引发我们遇到的异常情况。
PageCache本质上是对磁盘块的缓存,以4KB页为单位管理。其核心优势在于:
- 减少直接磁盘IO(机械硬盘寻道时间约10ms vs 内存访问约100ns)
- 实现预读(readahead)优化顺序读取
- 延迟写入(writeback)合并多次写操作
2.2 问题发生的技术背景
当进程通过write()系统调用写入文件时,数据流实际经历了:
- 拷贝到用户空间缓冲区
- 通过页故障(page fault)映射到内核PageCache
- 由pdflush线程定期刷盘(默认30秒)
如果写入速度持续超过刷盘速度,PageCache就会不断堆积。在我们的案例中,某个服务正在
