運用中のサーバーでは、負荷がかかると次の問題が発生することがあります (Linux 4.10)。
- 負荷を処理するアプリケーション (Web サーバー) が高負荷で実行されています。
- 新しいジョブが開始されます (例: cron)。これには clone() システム コールが必要ですが、メモリの割り当てに失敗します。
- カーネル OOM キラーが起動し、Web サーバーのアプリケーション プロセスの 1 つを強制終了して、新しいジョブを開始できるようにします。
- 「free -m」は、サーバーの 64 GB のうち、空きメモリが 1 ~ 3 GB 程度と非常に少ないことを示しています。ただし、メモリの大部分はページ キャッシュにあります。
- システムにはスワップ パーティション/ファイルの設定がなく、vm.swappiness はデフォルト値の 60 に設定されています。
代わりに、ロードが開始される前に「echo 3 > /proc/sys/vm/drop_caches」を実行しておけば、OOM によって Web サーバー アプリケーションが強制終了されることはなく、すべて正常に動作します。
上記の条件下では、カーネルはプロセスを強制終了してメモリを解放する前にページ キャッシュを解放しないのでしょうか?