Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

1.2. サブシステム、階層、コントロールグループ、タスクの関係

cgroup の用語においては、システムプロセスはタスクと呼ばれることを念頭に置いてください。
ではここで、サブシステム、cgroup の階層、およびタスクの間における関係を管理するにあたってのいくつかの簡単なルールとそれらのルールがもたらす影響について説明しましょう。

ルール 1

単一階層には、単一または複数のサブシステムを接続することができます。
このため、cpu および memory のサブシステム (もしくは任意数のサブシステム) を単一階層に接続できます。ただし、各サブシステムは、別のサブシステムがすでに接続された別の階層に接続されていないことが条件となります (ルール 2 を参照)。
ルール 1

図1.1 ルール 1

ルール 2

別のサブシステムがすでに接続されている階層がある場合には、単一のサブシステム (例: cpu) を複数の階層に接続することはできません。
このため、memory サブシステムが接続された階層がある場合には、cpu サブシステムは 2 つの異なる階層には決して接続できませんが、両方の階層に接続されているのがそのサブシステムのみの場合には、単一のサブシステムを 2 つの階層に接続することが可能です。
ルール 2 (丸数字は、サブシステムが接続される時間的順序)

図1.2 ルール 2 (丸数字は、サブシステムが接続される時間的順序)

ルール 3

システムに新たな階層が作成されると、システム上のタスクはすべて、最初にその階層のデフォルトの cgroup のメンバーとなります。これは、root cgroup としても知られています。作成された単一階層ではいずれも、システム上の各タスクをその階層内の 完全に一つの cgroup のメンバーにすることができます。cgroup がそれぞれ異なる階層にあれば、単一のタスクを複数の cgroups のメンバーとすることが可能です。タスクが同じ階層内の第 2 の cgroup のメンバーとなると、タスクはその階層内の第 1 の cgroup から即時に削除されます。タスクが同じ階層内の異なる 2 つの cgroup のメンバーとなることはありません。
このため、cpumemory サブシステムが cpu_mem_cg という名前の階層に接続されて、net_cls サブシステムが net という名前の階層に接続された場合、稼働中の httpd プロセスは、cpu_mem_cg 内の任意の単一 cgroup および net 内の任意の単一 cgroup のメンバーとすることができます。
httpd プロセスがメンバーとなっている cpu_mem_cg 内の cgroup によって、CPU 時間が、他のプロセスに割り当てられた時間の半分に制限され、メモリー使用量が最大で 1024 MB に限定される可能性があります。また、メンバーとなっている net 内の cgroup によって、転送速度が 30 メガバイト毎秒に制限される場合があります。
第 1 の階層が作成されると、そのシステム上の全タスクは、最低でも 1 つの cgroup (root cgroup) のメンバーとなります。このため、cgroup を使用すると、すべてのシステムタスクは常に、最低でも一つの cgroup のメンバーとなります。
ルール 3

図1.3 ルール 3

ルール 4

システム上のいずれかのプロセス (タスク) が自分自身をフォークすると、子プロセス (タスク) が作成されます。子タスクは、親の cgroup のメンバーシップを自動的に継承しますが、必要に応じて異なる cgroup に移動することが可能です。フォークされた後には、親プロセスと子プロセスは完全に独立します。
その結果として、cpu_and_mem 階層内の half_cpu_1gb_max という名前の cgroup と、net 階層内の trans_rate_30 という cgroup のメンバーである httpd タスクについて検討してください。 この httpd プロセスが自分自身をフォークすると、その子プロセスは自動的に half_cpu_1gb_max cgroup と trans_rate_30 cgroup のメンバーとなり、親タスクが属するのとまったく同じ cgroup を継承します。
それ以降には、親タスクと子タスクは完全に相互に独立した状態となり、一方のタスクが属する cgroup を変更しても他方のタスクには影響を及ぼしません。また、親タスクの cgroup を変更しても、孫タスクへも一切影響はありません。つまり、子タスクはいずれも、最初は親タスクとまったく同じ cgroup へのメンバーシップを継承しますが、これらのメンバーシップは後で変更もしくは削除することができるということになります。
ルール 4 (丸数字は、タスクがフォークする時間的順序)

図1.4 ルール 4 (丸数字は、タスクがフォークする時間的順序)