デフォルトで dnf-makecache.timer が動いています。1時間おきにレポジトリのキャッシュを更新しているのですが、そんなことする必要ある? と思って止めたところ、後日、まさかのサーバが止まってしまいました。

教訓

dnf-makecache.timer は止めてはいけない。デフォルトのまま動かしておけ。

何が起きたのか?

dnf-automatic-notifyonly.timer が dnf update を実行したところ、メモリ不足になってサーバが止まりました。その時点では辛うじてログインできたのですが、手動で dnf update したところ、固まってしまいました。気長に待っていれば再対応の機会があったかもしれませんが、諸々考えて、強制再起動という判断になりました。

顛末

(2023-11-27 追記)

メモリが足りなくなって挙動がおかしくなる現象は libsolv が原因でした。libsolv はパッケージの依存関係を解決するライブラリで、dnf の実行に必要です。

libsolv-0.7.25-1.fc38 の更新情報に以下の記述があります。

  • Support complex deps in SOLVABLE_PREREQ_IGNOREINST
  • Fix minimization not prefering installed packages in some cases
  • Reduce memory usage in repo_updateinfoxml
  • Fix lock-step interfering with architecture selection
  • Fix choice rule handing for package downgrades
  • Fix complex dependencies with an "else" part sometimes leading to unsolved dependencies

測定してみると、これまで dnf の実行に 600MB 以上消費していましたが、150MB程度に軽減されています。