はじめに
Always Onデバイスで問題を起こし、長らくアップデートを止められていたWindows 10 2004がようやく僕のSurface Laptop3にも降りてきました。
早速WSL2をと思ったところで、メイン機で発生したメモリ枯渇問題を思い出したのでcronを使って頻繁にキャッシュをドロップして対処してみました。
設定
Ubuntuを使用していますが、インストールしたデフォルトではcronが動いていないので動かします。
sudo service cron start
キャッシュを落とすコマンドはsudoして動かすので、(ごちゃごちゃやるのが面倒なので)rootのcrontabを使います。
sudo su
crontabでcronの設定を行います。初回は以後どのエディタを使うか聞かれますがお好みで。僕はVimを選択しました。
crontab -e
毎分キャッシュを落とすコマンド1を書きます。
* * * * * sh -c "echo 3 >'/proc/sys/vm/drop_caches' && swapoff -a && swapon -a"
ちなみに5分毎が良ければ以下のような感じになります。
*/5 * * * * sh -c "echo 3 >'/proc/sys/vm/drop_caches' && swapoff -a && swapon -a"
保存するとcronjobが有効になり、設定した時間間隔でコマンドが走ります。
様子
タスクマネージャーを観察していると1分後にVmmemのメモリ使用量が約1.1GBから666MBまで減少したので、きちんと動いているようです。
キャッシュを大量に必要とするような何かしらをWSL上で動かすときに惨事が発生しそうな気もするのですが、開発系のアプリケーション以外にも(主にTeamsとかOutlookとかのメモリ食い虫を)開いておかないといけない環境ですので、.wslconfigを触ってメモリ上限を決めるやり方よりは常にメモリが空いてくれている方が何かとうれしいのでこのやり方にしました。問題が起きるようならまた別の対策を考えます。
メインマシンならメモリが64GBあるので迷わず.wslconfigに上限32GBとか設定するのですが、Surface Laptop3は16GBしかないので……。