親プロセスではなく分岐した子プロセスにのみメモリ/CPU制限を設定するにはどうすればよいですか?

親プロセスではなく分岐した子プロセスにのみメモリ/CPU制限を設定するにはどうすればよいですか?

apache2をプロセスツリー全体(apache2およびすべての分岐サブプロセス)で使用される最大Xメモリ量ではなく、分岐された各サブワーカープロセスで使用される最大Xメモリ量に制限する方法はありますか?

cgroups / systemdを使用してソリューションを試しましたが、すべてが各サブプロセスを個別に制限するのではなく、基本プロセスとすべてのサブプロセスの組み合わせを制限します。

私はapache2だけでなく、子プロセスを生成するすべてのプロセスで動作するソリューションを探しています。

答え1

呼び出すには、アプリケーション(あなたの場合はオープンソースのApache2)のソースコードを改善するだけです。制限設定(2)通話成功後フォーク(2)しかし、電話する前に実行(2)

setrlimitなぜなら、あなたは本当にシステムコールを完了したいからです。後ろに(設定した内容は、シェルの組み込み機能を通じて追加のfork呼び出しがあるまで保持されます。)setrlimitulimit

Linuxの仕組みをよりよく理解するために時間を費やしてください。システムコール(2)仕事(特にfork&&execvesetrlimitと使用方法と時期。私は良いLinuxシステムプログラミングブックを読むことをお勧めします。アルカリ性ホスファターゼ

したがって、使用中のすべてのプログラムをわずかに変更しない限り、達成しようとする目標はしばしば非現実的です。これUnixの哲学forkこれはこれを禁止するのデザインにインスピレーションを与えました。execvesetrlimit

もちろん、原則としては言葉にならないことをすることもできます。LD_PRELOAD技術オーバーロード動作forksetrlimit0を返した後に呼び出す)またはexecvesetrlimitその前にsyscallを呼び出す)動的リンク 実行可能ファイル(または自分のバリエーションをパッチするのと同じlibc.so)しかし、これは不合理です。また、見ることができますファイル1)またはLDD(1)動的にリンクされた実行可能ファイルを検出します。

ただし、ulimitシェル組み込み機能を使用してApache2とすべてのサブキーを制限できます。 Apache2のドキュメントを詳しく見てみると、子プロセスの設定がたくさんあります。

関連情報