如何让Linux自动释放旧的pagecache页面?

如何让Linux自动释放旧的pagecache页面?

自从升级到 Linux 内核 5.8 及更高版本以来,我的系统一直遇到因 RAM 不足而冻结的问题,而这些问题都发生在页面缓存中。

我有一个程序可以将 OpenStreetMapplanet_latest.osm.pbf 文件中的数据重新组织成对我的使用更有效的结构。但是,由于该文件大于我系统上的 RAM 量(60GB 文件与 48GB RAM),因此页面缓存已满。在内核 5.8 之前,缓存将达到满,然后继续运行(磁盘抖动增加)。从 5.8 开始,系统会冻结,因为它永远不会自动从页面缓存中释放页面(例如,在我顺序读取 Planet_latest.osm.pbf 文件时释放的 30GB)。我不需要使用我的重组程序来挂起系统;我发现以下非特权命令可以做到这一点:

猫 Planet_latest.osm.pbf >/dev/null

我尝试使用 fadvise64() 系统服务手动强制释放我已经通过的行星文件中的页面;它有帮助,但并不能完全解决我的程序创建的各种输出文件的问题(特别是当这些临时输出文件稍后被随机读回时)。

那么,如何才能让 5.8 到 5.10 Linux 内核在系统 RAM 变低时自动从页面缓存中释放旧页面呢?

为了解决这个问题,我一直在使用一个脚本来监视缓存大小,并在缓存太大时写入 /proc/sys/vm/drop_caches ,当然这也会释放我当前正在使用的新页面以及过时的页面。

while true ; do
    H=`free | head -2 | tail -1 | awk '{print $6}'`
    if [ $H -gt 35000000 ]; then
        echo -n $H " @ " ; date
        echo 1 >/proc/sys/vm/drop_caches
        sensors | grep '°C'
        H=`free | head -2 | tail -1 | awk '{print $6}'`
        echo -n $H " @ "; date
    fi
    sleep 30
done

(传感器的作用是在我的程序的多线程 CPU 密集型阶段而不是磁盘密集型阶段留意 CPU 过热)。

我已经在 kernel.org 上提交了错误报告,但他们还没有查看。

相关内容