hysryt / wiki

https://hysryt.github.io/wiki/
0 stars 0 forks source link

cgroup #109

Open hysryt opened 5 years ago

hysryt commented 5 years ago

https://gihyo.jp/admin/serial/01/linux_containers/0003 https://gihyo.jp/admin/serial/01/linux_containers/0004 https://gihyo.jp/admin/serial/01/linux_containers/0005

hysryt commented 5 years ago

cgroup 機能によってグルーピングされるプロセスのグループを cgroup と呼ぶ。

cgroup の管理は cgroupファイルシステム(cgroupfs)内で行う。

そのためまずは cgroupfs を /sys/fs/cgroup/cpu にマウントする。 -o cpu でサブシステムに cpu を指定している。 これで cpu リソースを管理する cgroup を格納するディレクトリができる。 このディレクトリが cpu サブシステムを扱う cgroup のルートディレクトリとなる。

$ sudo mount -t cgroup -o cpu cgroup /sys/fs/cgroup/cpu
$ ls /sys/fs/cgroup/cpu
cgroup.clone_children  cpu.cfs_period_us  cpu.rt_runtime_us  notify_on_release
cgroup.event_control   cpu.cfs_quota_us   cpu.shares         release_agent
cgroup.procs           cpu.rt_period_us   cpu.stat           tasks

cgroup はそのディレクトリの中に作成していく。 mkdir でディレクトリを作成すればそれが cgroup となる。 ディレクトリ内には設定用のファイルが自動的に生成される。

$ cd cpu
$ sudo mkdir test01
$ ls test01
cgroup.clone_children  cpu.cfs_period_us  cpu.rt_runtime_us  notify_on_release
cgroup.event_control   cpu.cfs_quota_us   cpu.shares         tasks
cgroup.procs           cpu.rt_period_us   cpu.stat

cgroup にプロセスを登録するにはこのディレクトリの中の tasks ファイルにプロセスIDを追加するだけでいい。

$ cd test01
$ echo $$ | sudo tee -a tasks
1508
$ cat tasks
1508
1713

1508 が シェルのプロセスID、1713 が cat のプロセスIDとなる。 この結果から分かるように、子プロセスは自動的に親プロセスと同じ cgroup に属す。

個々の cgroup に登録する前は、各プロセスはルートディレクトリのtasksに登録されている。

hysryt commented 5 years ago

cgroup での mount コマンド

$ mount -n -t <ファイルシステム名> -o <オプション> <デバイス> <ディレクトリ>

-n はマウントの際に /etc/mtab に書き込みを行わない為のフラグ。必要かどうかは不明。 -t でファイルシステム名を指定する。cgroup の場合はそのまま cgroup-o でオプションを指定する。cgroup の場合ここにサブシステム名を記述する。 <デバイス> にマウントするデバイスを記述する。cgroup の場合はここもそのまま cgroup

$ sudo mount -n -t cgroup -o cpu cgroup /sys/fs/cgroup/cpu