9

SUSE SLES 11 を使用する POWER7 システムでマルチプログラム ワークロード (SPEC CPU2006 ベンチマークに基づく) を実行しています。

場合によっては、ワークロード内の各アプリケーションが大量のメモリを消費し、合計メモリ フットプリントがシステムにインストールされている使用可能なメモリ (32 GB) を超えることがあります。

そうしないと、スワップを使用するプロセスの測定値が大きく影響を受ける可能性があるため、スワップを無効にしました。そうすることで、カーネルが OOM キラーを介して一部のプロセスを強制終了する可能性があることを私は知っています。それはまったく問題ありません。問題は、カーネルによって強制終了されたスレッドがエラー状態 (たとえば、プロセスがシグナルによって終了された) で終了したことを期待していたことです。

すべてのプロセスを起動し、それらを使用して待機するフレームワークがあります

waitpid(pid, &status, 0);

スレッドが OOM キラーによって強制終了された場合でも (画面と /var/log/messages にメッセージが表示されるので、そのことはわかっています)、呼び出しは

WIFEXITED(status);

1 を返し、呼び出し

WEXITSTATUS(status);

ゼロを返します。したがって、プロセスがいつ正常に終了したのか、いつ OOM キラーによって強制終了されたのかを区別することはできません。

私は何か間違ったことをしていますか?OOMキラーによってプロセスが強制終了されたことを検出する方法を知っていますか?

この投稿がほぼ同じ質問をしているのを見つけました。しかし、それは古い投稿であり、回答が満足のいくものではなかったため、新しい質問を投稿することにしました。

4

1 に答える 1

10

Linux OOMキラーは、を送信することで機能しSIGKILLます。あなたのプロセスがOOMによって殺された場合、WIFEXITED1を返すのは怪しいです。

TLPI

選択したプロセスを強制終了するために、OOMキラーはSIGKILLシグナルを配信します。

したがって、次を使用してこれをテストできるはずです。

if (WIFSIGNALED(status)) {
    if (WTERMSIG(status) == SIGKILL)
        printf("Killed by SIGKILL\n");
}
于 2011-08-24T19:30:38.783 に答える