Linux 4.14内核buff/cache无法自动释放致内存不足问题咨询
问题原因解析
针对4.14内核下buff/cache无法自动释放的问题,结合嵌入式Linux、JFFS2文件系统以及内核版本差异的背景,核心原因主要集中在以下几点:
1. JFFS2文件系统的缓存逻辑差异
JFFS2是面向闪存的日志型文件系统,4.14内核中的JFFS2实现存在缓存保留机制:
- 当通过scp或拖拽传输文件时,文件数据会被加载到页缓存,JFFS2会将部分缓存页标记为低优先级回收甚至不可回收——早期JFFS2为了减少闪存重复读取(闪存IO性能远低于RAM),默认倾向于保留更多缓存;
- 即便系统内存不足,内核的LRU(最近最少使用)回收器也不会优先处理JFFS2的缓存页,导致这些缓存长期占用内存。手动执行
echo 3 > /proc/sys/vm/drop_caches只能释放少量未被锁定的干净缓存,大部分缓存因被JFFS2绑定而无法释放。
2. 内核内存回收子系统的版本优化
4.19内核针对嵌入式小内存场景和JFFS2做了关键修复与优化:
- 调整了JFFS2缓存页的回收优先级,内存紧张时会将其纳入常规LRU回收队列,优先释放冷缓存;
- 优化了脏页刷写调度,文件传输完成后能更快将JFFS2脏页写入闪存,刷写完成后立即释放对应缓存页,不会长期占用内存;
- 修复了4.14中存在的缓存页泄漏bug:部分JFFS2缓存页在写入闪存后未被正确标记为可回收,导致内存无法释放。
3. 启动参数的间接影响
你的启动参数设置了ramdisk_size=90000,虽然系统实际使用MTD块设备的JFFS2,但4.14内核会预留对应大小的内存作为ramdisk空间,这部分内存无法被缓存回收机制利用,进一步压缩了可用内存,加剧了缓存无法释放后的内存不足问题。而4.19内核对未使用的ramdisk预留内存处理更灵活,不会长期锁定该空间。
临时缓解方案
- 提高
/proc/sys/vm/vfs_cache_pressure的值(例如设置为200),强制内核更积极地回收文件系统缓存; - 查看
/proc/meminfo的Dirty和Writeback字段,若数值较高,先手动触发脏页刷写:echo 1 > /proc/sys/vm/drop_caches,再执行缓存释放; - 最彻底的解决方式是升级内核到4.19及以上版本,从根源上解决JFFS2缓存回收的问题。
内容的提问来源于stack exchange,提问作者Moh3N
相关产品推荐
相关产品推荐

