LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術

第4回 Linuxカーネルのコンテナ機能[3] ─cgroupとは?(その2)

この記事を読むのに必要な時間:およそ 6.5 分

前回は,cgroupを使ってリソース制御を行うのに必要な基礎知識となるcgroupfsの特徴を紹介しました。

今回からは,具体的にどのようなリソースの制御が可能なのかを紹介しながら,それぞれの機能を理解しやすいように簡単な例を挙げていきたいと思います。

サブシステム

名前空間と同様に,cgroupも扱うリソースによって『サブシステム』と呼ばれる独立した機能でリソースを扱います。サブシステムには大きく分けて,数値で制限をかけるような機能と,それ以外のアクセス権やグループ内のプロセスに対する操作を行う機能に分かれます。なお,サブシステムは『コントローラ』と呼ばれることもあります。

サブシステムには以下のようなものがあります。

表1 サブシステムの種類と機能

サブシステム機能の概要実装されたバージョン
cpuCPUのスケジューリングを制御
相対配分…グループ間のCPU時間の割当を割合で指定2.6.24
帯域制御…単位時間内にグループ内のタスクが実行できる合計時間を制限3.2
cpuacctグループ内のタスクが消費するCPU時間をレポート2.6.24
cpusetグループへのCPU,メモリノードの割り当て2.6.24
deviceグループ内のタスクのデバイスへのアクセスの許可,禁止の指定2.6.26
freezerグループ内のプロセス全てを同時に一時停止・再開2.6.28
memoryグループ内のタスクが消費するメモリリソースのレポートと制限2.6.29
net_clsグループ内のプロセスが発信するパケットの制御。パケットに識別子を付与。
tcで制御2.6.29
netfilterで制御3.14
blkioブロックデバイスに対する制限
重みづけ配分…グループ間のI/Oアクセスの比率を割合で指定2.6.33
帯域制限…グループ内のタスクが各デバイスに対して行える操作数の制限2.6.37
perf_eventcgroup単位でのperfツールの使用2.6.39
net_prioグループ内のタスクのネットワークの優先度の制御3.3
hugetlbcgroupからのhugetlbの使用3.6

表1にある「実装されたバージョン」はカーネルに実装されたバージョンで,ディストリビューションによってはこれよりも古いバージョンのカーネルにバックポートされている場合もあります。また,実装された時点では階層構造がサポートされておらず,後のバージョンで実装されたものもあります。

お使いのシステムで使用可能なサブシステムは,カーネルのバージョンだけでなく,カーネルをどのような設定で作成したかによっても違います。使用可能なサブシステムは以下のように/proc/cgroupsで確認できます。

$ cat /proc/cgroups 
#subsys_name    hierarchy       num_cgroups     enabled
cpuset          0               1               1
cpu             0               1               1
cpuacct         0               1               1
memory          0               1               1
devices         0               1               1
freezer         0               1               1
blkio           0               1               1
perf_event      0               1               1

カーネルによってはサブシステムの一部がモジュールとなっていて,デフォルトではロードされていない場合があります。

$ sudo modprobe cls_cgroup
$ cat /proc/cgroups | grep net_cls
net_cls 0       1       1

前の実行例の環境で新たにnet_clsサブシステムのモジュールをロードすると/proc/cgroupsにnet_clsが現れているのがわかります。

サブシステムのマウント

cgroupfsをマウントする際にはサブシステムごとにマウントできます。前回の説明の際にオプションとして-o cpuという指定をしました。これはcpuサブシステムをマウントするという意味になります。同様に別のマウントポイントに-o memoryと指定してmemoryサブシステムをマウントしてみましょう。

$ sudo mount -t tmpfs cgroup /sys/fs/cgroup
$ sudo mkdir /sys/fs/cgroup/cpu
$ sudo mount -n -t cgroup -o cpu cgroup /sys/fs/cgroup/cpu(ここまでは前回の例と同じ)
$ sudo mkdir /sys/fs/cgroup/memory (memoryサブシステム用のディレクトリ作成)
$ sudo mount -n -t cgroup -o memory cgroup /sys/fs/cgroup/memory (memoryサブシステムを指定してマウント)
$ ls /sys/fs/cgroup/memory/
cgroup.clone_children            memory.move_charge_at_immigrate
cgroup.event_control             memory.numa_stat
cgroup.procs                     memory.oom_control
memory.failcnt                   memory.soft_limit_in_bytes
memory.force_empty               memory.stat
  :(略)

/sys/fs/cgroup/memory以下にmemoryサブシステムをマウントしました。cpuサブシステムとは作られているファイルが違いますね。ここで見たように複数の階層構造を持てるというのもcgroupの特徴のひとつです。

また,複数のサブシステムを同時に1つのマウントポイント以下にマウントすることも可能です。たとえば以下のようにcpuとmemoryを同時に1つのマウントポイント以下にマウントする事ができます。上でcpuとmemoryサブシステムをマウントしましたので,アンマウントしてから実行します。

$ sudo umount /sys/fs/cgroup/cpu
$ sudo umount /sys/fs/cgroup/memory
$ sudo mkdir /sys/fs/cgroup/cpu_memory
$ sudo mount -n -t cgroup -o cpu,memory cgroup /sys/fs/cgroup/cpu_memory
              (cpu,memoryサブシステムを同時にマウント)
$ ls /sys/fs/cgroup/cpu_memory/
cgroup.clone_children      memory.memsw.limit_in_bytes
cgroup.event_control       memory.memsw.max_usage_in_bytes
cgroup.procs               memory.memsw.usage_in_bytes
cpu.cfs_period_us          memory.move_charge_at_immigrate
cpu.cfs_quota_us           memory.numa_stat
  : (略)

ディレクトリ内を確認してみると,cpuサブシステム関連のファイルとmemoryサブシステム関連のファイルが同時に作られており,同じマウントポイントに2つのサブシステムがマウントされたことがわかります。

ただし,同じサブシステムを同時に別のマウントポイントにマウントすることはできません。上記のマウントを実行した後に再度memoryサブシステムをマウントしようとするとエラーとなります。

$ sudo mount -n -t cgroup -o memory cgroup /sys/fs/cgroup/memory
Mount: cgroup already mounted or /sys/fs/cgroup/memory busy

著者プロフィール

加藤泰文(かとうやすふみ)

2009年頃にLinuxカーネルのcgroup機能に興味を持って以来,Linuxのコンテナ関連の最新情報を追っかけたり,コンテナの勉強会を開いたりして勉強しています。英語力のない自分用にLXCのmanページを日本語訳していたところ,あっさり本家にマージされてしまい,それ以来日本語訳のパッチを送り続けています。

Plamo Linuxメンテナ。ファーストサーバ株式会社所属。

Twitter:@ten_forward
技術系のブログ:http://tenforward.hatenablog.com/

コメント

コメントの記入