私は次のような状況にあります。 (次の関数はPythonからのものです。)
実行中のプロセスAがあり、ここにcgroupメモリ制限が設定されています。
os.fork() を使用して A で子プロセスをフォークします。 Bと呼びましょう。次に、os.execvpを実行してBのシェルスクリプトをロードします。http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/exec.htmlプロセスは、呼び出し元(Bなど)と同じアドレス空間で実行されます。
Bで実行されるシェルスクリプトは、指定されたヒープサイズで無期限に実行され、OOMで自動的に終了するJavaプログラムを生成します。これを通して-XX:OnOutOfMemoryError='kill -9 %p'javaコマンドで。これにより、Bの子として別のプロセスCが生成される。
上から見ると、やはりBはAの子、CはBの子に見えます。
疑わしい点は次のとおりです。
cgroup制限はA、(A + B)、または(A + B + C)にのみ適用されますか?
メモリ制限に達すると、A、(A + B)、(A + B + C)のいずれのプロセスが終了しますか?なぜ?制限が適用されたプロセスのpidまたはアドレス空間を使用して識別されますか?
上記の場合、すべてのプロセスが終了しない場合は、cgroup設定を微調整してすべての子プロセスを終了する方法はありますか?この場合、孤児プロセスが残るからです。
基本オペレーティングシステムとしてCentos7を使用しています。
答え1
私はあなたが持っているすべての質問に答えます:
- cgroup は A とそのすべての子に適用されます。この動作を確認するために実験を実行できます。以下を考慮してください。
Create a new memory cgroup
# mkdir /sys/fs/cgroup/memory/example
Note the shell's PID:
# echo $$
679
Put the running shell into the new cgroup
# echo $$ > /sys/fs/cgroup/memory/example/cgroup.procs
Examine what processes are in the cgroup. Here 679 was the
shell's PID; 723 is the pid of cat
# cat /sys/fs/cgroup/memory/example/cgroup.procs
679
723
Start a new shell and note its PID
# bash
# echo $$
726
Examine what processes are in the cgroup. 679 was the original
shell. 726 is the second shell. 731 is cat:
# cat /sys/fs/cgroup/memory/example/cgroup.procs
679
726
731
- ~によるとメモリcgroupドキュメント:
cgroupが制限を超えた場合は、まずcgroupからメモリを回収し、cgroupがタッチした新しいページのスペースを解放しようとします。リサイクルに失敗すると、OOM ルーチンが呼び出され、cgroup で最大のジョブを選択して終了します。
これに基づいて、cgroupのすべてのプロセスを終了せずに、最も多くのメモリを消費するプロセスを選択します。
- ここで、要求されたものと一致するようにどのプロセスが終了するかを調整する方法が見つかりませんでした。たとえば、OOM キラーを制御する方法があります。Linux週間ニュース記事。つまり、親プロセスの1つが終了すると、そのプロセスが所有するすべての子プロセスがPID = 1(デフォルト)のプロセスにリセットされます。