サブシステム紹介(続き)
今回は前回紹介できなかったサブシステムを紹介したあと、
Memoryサブシステム
コンテナに対してメモリの制限を行いたい場合に使用するのがmemoryサブシステムです。cgroupに対して制限値を設定したり、
まずは制限を設定してみましょう。制限を設定するには以下の2つのファイルに値を書き込みます。
- memory.
limit_ in_ bytes - メモリ消費量の制限値の設定と表示
(バイト) - memory.
memsw. limit_ in_ bytes - メモリ+スワップメモリの消費量の制限値の設定と表示
(バイト)
スワップの消費量も含めた制限を設定したい場合は後者を、
たとえばtest1
グループのメモリ使用量を100MBに設定したい場合は以下のように設定します。/sys/
にmemoryサブシステムをマウント済みとします。
$ sudo mkdir /sys/fs/cgroup/memory/test1 $ echo $$ | sudo tee /sys/fs/cgroup/memory/test1/tasks (現在のシェルをtasksに登録) 31784 $ echo 100M | sudo tee /sys/fs/cgroup/memory/test1/memory.limit_in_bytes (制限値を100MBに設定) 100M $ cat /sys/fs/cgroup/memory/test1/memory.limit_in_bytes (設定された制限値の確認) 104857600
100M
という文字列を書き込むと、
では実際に制限値に達した時にどうなるかを見る前にmemoryサブシステムで使用するファイルをさらにいくつか見ておきましょう。
- memory.
usage_ in_ bytes - cgroup内のプロセスが現在消費しているメモリ
- memory.
max_ usage_ in_ bytes - cgroup内のプロセスが今までに消費したメモリの最大値
- memory.
failcnt - cgroup内のプロセスのメモリ消費量が制限値にヒットした回数
memory.
を継続して監視することで、memory.
やmemory.
をチェックして、
さて、malloc()
でメモリを確保して、memset()
でメモリを消費するだけのmemory
というプログラムを作成し、
$ ./memory Killed
実行して少し時間が経つと"Killed"と表示されてプロセスがkillされました。これだけではなんのことかわからないかと思います。これはLinuxでシステムのメモリが足りなくなった時に発動するOOM Killerによってcgroup内のプロセスが強制終了させられています。メモリの消費が上限に達したことをmemory.
を見て確認してみましょう。
$ cat /sys/fs/cgroup/memory/test1/memory.max_usage_in_bytes 104857600
先ほど設定した制限値が最大値になっており、
また、
メモリ使用量の制限を行うだけであれば、
- memoryサブシステムをマウントしたルート直下のファイルへの値の設定は行えません。
- 前回説明した階層構造はデフォルトでは無効になっています。有効にするには
memory.
というファイルにuse_ hierarchy 1
を書き込みます。ただし、cgroupがすでに配下に子供のcgroupを持つときはこのファイルの値の変更はできません。 - 先に紹介したスワップを含めたメモリ消費の制限を設定する
memory.
へ値を設定したい場合は、memsw. limit_ in_ bytes あらかじめ memory.
に値を設定しておかなければなりません。limit_ in_ bytes
ここで紹介した以外にもmemoryサブシステムには多数の機能があります。詳しくは先に紹介したmemory.
ここで紹介したメモリ制限はユーザメモリの制限であり、memory.
で始まるファイルを使用します。しかしカーネルメモリの管理機能はまだまだ実装や改良が続いており、
net_clsサブシステム
net_tc
コマンドで指定して、
また3.iptables
コマンドは、
net_
blkioサブシステム
blkio
では、/sys/
というサブシステム専用のディレクトリを作成してから、blkio
サブシステムを指定してマウントし、test1
を作成します。その後、test1
グループに対して現在のシェルのPIDを登録します。
$ sudo mount -n -t cgroup -o blkio cgroup /sys/fs/cgroup/blkio/ (blkioサブシステムのマウント)
$ sudo mkdir /sys/fs/cgroup/blkio/test1
$ echo $$ | sudo tee -a /sys/fs/cgroup/blkio/test1/tasks
25462
ここでは/dev/
に対して単位時間辺りに書き込める量に制限をかけてみます。この時使用するファイルは以下のファイルです。
- blkio.
throttle. read_ bps_ device - デバイスからの読み込みの制限値
(バイト/ 秒) - blkio.
throttle. write_ bps_ device - デバイスへの書き込みの制限値
(バイト/ 秒)
制限をかけるにはデバイスのノード番号が必要です。このノード番号と制限値を以上のファイルに書き込むことで制限できます。またblkio
で制限ができないデバイスのノード番号を指定したり、/dev/
などのパーティションを指定したりするとエラーで書き込めません。
$ ls -l /dev/vdb brw-rw---- 1 root disk 253, 16 Jun 16 15:03 /dev/vdb
/dev/
のノード番号は 253:16 ですので、
$ echo "253:16 1048576" | sudo tee /sys/fs/cgroup/blkio/test1/blkio.throttle.write_bps_device 253:16 1048576 $ cat /sys/fs/cgroup/blkio/test1/blkio.throttle.write_bps_device 253:16 1048576
無事書き込めていますね。複数のデバイスに対する設定を行う場合は、
$ echo "253:0 1048576" | sudo tee /sys/fs/ cgroup/ blkio/ test1/ blkio. throttle. write_ bps_ device 253:0 1048576 $ cat /sys/ fs/ cgroup/ blkio/ test1/ blkio. throttle. write_ bps_ device 253:0 1048576 253:16 1048576
/dev/
のノード番号である253:0
に対する制限を書き込むと、
制限を取り消したい場合は制限値として0
を書き込みます。
$ echo "253:0 0" | sudo tee /sys/fs/cgroup/blkio/test1/blkio.throttle.write_bps_device 253:0 0 $ cat blkio.throttle.write_bps_device 253:16 1048576
先ほど存在していた/dev/
に対する制限が消えていますね。
さて、
$ sudo dd if=/dev/zero of=/data/testfile bs=4K count=1024 oflag=direct 1024+0 records in 1024+0 records out 4194304 bytes (4.2 MB) copied, 4.00925 s, 1.0 MB/s
きちんと設定通りの値になっていますね。同様に読み込みの制限を設定してみましょう。
$ echo "253:16 1048576" | sudo tee /sys/fs/cgroup/blkio/test1/blkio.throttle.read_bps_device 253:16 1048576 $ dd if=/data/testfile of=/dev/null bs=4K count=1024 iflag=direct 1024+0 records in 1024+0 records out 4194304 bytes (4.2 MB) copied, 4.00191 s, 1.0 MB/s
書き込みと同様に制限がされているのがわかりますね。ここでは単位時間あたりのバイト数で制限しましたが、
上記のような設定を行うと、
- blkio.
throttle. io_ serviced - IO操作の回数
- blkio.
throttle. io_ service_ bytes - 転送されたバイト数
これも確認しておきましょう。
$ cat /sys/fs/cgroup/blkio/test1/blkio.throttle.io_serviced 253:16 Read 1027 253:16 Write 1024 253:16 Sync 2051 253:16 Async 0 253:16 Total 2051 Total 2051 $ cat /sys/fs/cgroup/blkio/test1/blkio.throttle.io_service_bytes 253:16 Read 4206592 253:16 Write 4194304 253:16 Sync 8400896 253:16 Async 0 253:16 Total 8400896 Total 8400896
I/
perf_eventサブシステム
perf_
カーネル付属文書のperf-record.
net_prioサブシステム
net_
優先度の設定と設定の確認にはnet_
ファイルを使います。ここまでの例と同様に/sys/
ディレクトリにマウントして試してみましょう。
ここの例はUbuntu 12.
$ sudo modprobe netprio_cgroup (net_prioのモジュールをロード)
$ sudo mount -n -t cgroup -o net_prio cgroup /sys/fs/cgroup/net_prio
$ sudo mkdir /sys/fs/cgroup/net_prio/test1
$ sudo mkdir /sys/fs/cgroup/net_prio/test2
ここではcgroupfsをマウントしたあと、test1
とtest2
という2つのグループを作成しました。まずはどのように制限値が設定されているか、
$ cat /sys/fs/cgroup/net_prio/test1/net_prio.ifpriomap lo 0 eth0 0 $ cat /sys/fs/cgroup/net_prio/test2/net_prio.ifpriomap lo 0 eth0 0
このようにインターフェースごとの優先度の値が書かれています。cgroupを作成した時のデフォルト値は親グループのnet_
の値が使われます。
それではここで作成した2つのグループに優先度を設定してみます。test1
グループに1を、test2
グループに10を設定します。数字が大きい方が優先度が高くなります。
$ echo "eth0 1" | sudo tee /sys/fs/cgroup/net_prio/test1/net_prio.ifpriomap eth0 1 $ echo "eth0 10" | sudo tee /sys/fs/cgroup/net_prio/test2/net_prio.ifpriomap eth0 10 $ cat /sys/fs/cgroup/net_prio/test1/net_prio.ifpriomap lo 0 eth0 1 $ cat /sys/fs/cgroup/net_prio/test2/net_prio.ifpriomap lo 0 eth0 10
それぞれのグループのnet_
ファイルを見ると、test2
グループの方が優先度が高く設定されました。
net_
hugetlbサブシステム
HugeTLBはメモリを管理する単位であるページのサイズを大きくすることで、
nsサブシステム
nsサブシステムは前回の表1では紹介しませんでした。なぜかと言いますと、
元々は名前空間機能と連携してcgroupを作成する機能でした。2.cgroup.
機能が実装されるとともに、
2.
cgroup の今後
今回を合わせると3回に渡ってLinuxカーネルに実装されているcgroupの解説をしてきました。ここまで解説したようにかなり広範囲に渡る機能が実装されている一方で、
このような時期に、
一方でcgroupの大きな変更がかなり進んできており、
memoryサブシステム
今回説明したmemoryサブシステムの機能はユーザメモリの制限でした。一方でカーネルが内部的に使用するカーネルメモリの制限機能も実装が進んでいます。現時点でもカーネルメモリの制限を行う機能は実装されておりmemory.
で始まるファイルがカーネルメモリを制限するためのファイルです。
しかし、
また、
このようにまだまだ激しく変化している発展途上のサブシステムであり、
cgroupの再設計と変更
これまで説明したようにcgroupの開発が進み多数のサブシステムが実装され、
今後cgroupで一番大きく変わるのが前回cgroupの特徴としてあげた 複数階層構造のサポート がなくなり、
複数階層構造のサポートは一見柔軟性を持っているようにみえます。しかし現在のcgroupの仕様を考えるとあまり役に立つことがないようです。
たとえば、
freezerのようなグループのタスクに対して同時に何かを行うサブシステムを考えた場合、
このような場合、
このように、
cgroupの実際のユースケースでは、
これに伴い、
ただし、
この他にもcgroupに現在実装されているeventfdによる通知の仕組みも変わる予定のようです。また、
cgroupの管理
ここまで説明したように、
ただ、
そこで、
このエージェントへの名乗りをあげているのが、
まとめ
第3回から3回にわけてcgroupの説明を行いました。例で説明したようにcgroupfsを直接触ってcgroupの設定を行うことはあまりないと思いますが、
さて、
LXC-JPグループ
LXCに限らず、
名前はLXC-JPという名前ですが、