Linuxに古いページキャッシュページを自動的にリリースさせる方法は?

Linuxに古いページキャッシュページを自動的にリリースさせる方法は?

Linuxカーネル5.8以降にアップグレードした後、RAMが不足しているためシステムがハングしており、これらの問題はページキャッシュで発生します。

私はOpenStreetMapplanet_latest.osm.pbfファイルのデータを私が使用するより効率的な構造に再構築するプログラムがあります。ただし、ファイルが自分のシステムのRAM容量(60GBファイル、48GB RAM)より大きいため、ページキャッシュがいっぱいです。カーネル 5.8 以前は、キャッシュがいっぱいで動作し続けました (ディスクスラッシングの増加)。 5.8以降、ページキャッシュからページが自動的に解放されないため、システムはフリーズします(例:Planet_latest.osm.pbfファイルを順次読み取ると30GBが解放されます)。システムを停止するために再構成者を使用する必要はない。これを行うには、次の権限のないコマンドを見つけました。

catPlanet_latest.osm.pbf>/dev/null

私はfadvise64()システムサービスを使用して、私が渡した惑星ファイルのページを手動で強制解除しようとしました。役に立ちましたが、プログラムが生成したさまざまな出力ファイルの問題を完全に解決することはできませんでした(特に、これらの一時出力ファイルがランダムに読み取られたときに少し)。

もしそうなら、システムRAMが不足すると、5.8〜5.10 Linuxカーネルにページキャッシュから古いページを自動的に解放させることができますか?

この問題を解決するために、私はキャッシュサイズを監視し、キャッシュが大きすぎると/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にバグレポートを送信しましたが、まだレビューしていません。

ベストアンサー1

おすすめ記事