memo

2011-03-17

cgroup と autogroup と systemd と

Caution

以下の文章は激しく間違っている可能性があります。

Linux 2.6.38 にて autogroup 機能が導入された。 既存の cgroup との違いとか systemd と仲良くしてくれるかどうかとか あれこれ考えたり調べたりしてみる。

autogroup

autogroup は session group 毎に自動で割り当てられる。 CPU はまずこの単位で均等に割り振られ、その後、グループ内の各プロセスに割り当てられることになる。

通常は CPU はプロセス毎に均等に割り当てられるが:

20%   20%   20%   20%   20% 
[  P1 |  P2 |  P3 |  P4 |  P5 ]

ここで P1, P2, P3 が一つの autogroup だった場合は:

33%        33%        33%
[ P1,P2,P3 |       P4 |       P5 ]

というように autogroup 毎に CPU が割り当てられるようになる。

session group は親プロセスから引き継がれ、 setsid が呼ばれると新たに作成される。 通常インタラクティブシェルは起動時に新しい session group を開始するので、 シェルとその子供たちはまとめて一単位として CPU を割り当てられる事になる。

そのため、 make -j 20 のような一つの session group 内で大量のプロセスが 生成されるようなコマンドを実行したとしても、他のグループに与える影響は小さくなる。

また、各 daemon も多くは起動時に session group を作成する。

ただし、通常のアプリケーションは session group を作成したりはしない。 したがってデスクトップ環境では多くのプロセスが同じ session group/autogroup に属することになるので、 autogroup の恩恵はあまり受けられないと思われる。

なお、下記の cgroup がプロセスに割り当てられている場合、 autogroup は無視されるようだ。

cgroup

以前より Linux が持っていた機能で、任意のグループを作成して任意のプロセスにそれを割り当てることができる。

autogroup と同じく CPU 割り当てのグループを作ることができる他、 メモリー使用量やディスク IO なども細かく制御することが可能。

cgroup は親プロセスから引き継がれるが、新たなグループの作成はユーザーランドで行う必要がある。 その分柔軟に設定できるとも言えるし、手がかかって面倒くさいとも言える。

systemd

Fedora 方面で開発中の次世代 init の一つ。 service 毎に自動で cgroup を作成、割り当ててくれる。

gettygdm も service の一つなので、ログインセッション毎に cgroup が出来ることになる。 そのため、他のログイン中のユーザーが無茶をしたりとか、 daemon が暴走したりしても影響を受けにくくなる。

一方、ログイン後に起動したプロセスは全て同じ cgroup に属することになるので、 自分が make -j 20 とか実行した場合、横で動いている Firefox 等にもろに影響がでることになる。

前述の通り autogroup は cgroup が割り当たっていると無視されるので、 systemd 環境下では通常 autogroup は働いてくれない。

pam_systemd

systemd にくっ付いてくる pam モジュール。 ログイン時に自動で cgroup を作成してくれる。

この時作成される cgroup は owner がログインユーザーに変更されているので、 ログイン後にユーザー権限で自由に変更やサブグループの作成ができる。 .bashrc 等にシェル毎の cgroup を作成するような処理を書いておけば、 autogroup と同等の効果が得られるようになる。

また、デフォルトの設定だと何故か cpu cgroup をリセットしてくれるので、 systemd 環境下でも autogroup が動作するようになる。

参照