Linuxマシンでスワップ(実際にはzram)を使用してプロセスを終了したいとします。スワップはRAMのサイズの半分です。 RAMには空き領域が10%しかなく、スワップもほぼいっぱいです。
このプロセスでは、RAMの2%のみを使用していますが、スワップの約90%を使用しています。
ソフトクローズ(SIGTERM)を実行し、プロセスがシグナルをキャッチしてそれ自体でクローズできるようにすると、スワップされたすべてのマッピングがスワップ解除されますが、プロセス全体に適合する十分な空きRAMはありません。
そのため、SIGKILLを使用してプロセスを強制終了する方がよい場合がありますが、メモリ不足のためにOOM-killerが他のプロセス、またはXセッション全体またはinitを強制終了するのではないかと心配しています。
つまり、killシグナルを送信してプロセスのスワップされた部分を物理メモリに移動するようにしますか?(何を期待する必要がありますか?カーネルのバージョンによって異なりますか?)
その場合、そのような場合はどうすればよいですか?目標は、残りの部分に触れずにプロセスを終了することです(他にも重要なプロセスが実行されています)
さらに、それが1つのプロセスではなく、プロセスのツリーであり、アプリケーションを自動的に終了させることができない場合に、それを正しく強制終了するにはどうすればよいですか?
一般的に言えば、ページは必要でない限りRAMにスワップバックされません。つまり、ページがRAM実際に何かによってアクセスされた(アクセススレッドの続行を許可する前に、OSがページをMMU)にロードして処理するRAMでページフォールト例外を引き起こす)プロセスを(SIGKILLを使用して)ハードキルすると、プロセスのスレッドは実行されないため、キルされたプロセスはそのページにアクセスできず、それらのページはRAMにロードされません。
実際、プロセスを強制終了せずに実行を再開した場合でも、実際にアクセスするページのみが(RAMに)スワップインされます。さらに、すべてのRAMがいっぱいで、RAMにない別のページにアクセスする必要がある場合、OSはRAMの別のページを選択してスワップアウトします(ディスクに)プログラムがアクセスする必要のあるページ用にRAMにスペースを空けるもちろん、これが頻繁に発生すると、プログラムを実行する代わりに、メモリをRAMとディスクの間で移動することにほとんどの時間を費やしているため、マシンの速度が大幅に低下する可能性があります。これは「スラッシング」と呼ばれます。
プロセスツリー全体を強制終了することに関しては、次のことを試してみてください。
# in pid is saved pid of the parent process
CPIDS=`pgrep -P $pid` # gets pids of child processes
for cpid in $CPIDS ; do kill -9 $cpid ; done # first kill children
kill -9 $pid # then the parent (yeah, that sound kinda bad)