サブシステム紹介(続き)
今回は前回紹介できなかったサブシステムを紹介したあと、
Memoryサブシステム
コンテナに対してメモリの制限を行いたい場合に使用するのがmemoryサブシステムです。cgroupに対して制限値を設定したり、
まずは制限を設定してみましょう。制限を設定するには以下の2つのファイルに値を書き込みます。
- memory.
limit_ in_ bytes - メモリ消費量の制限値の設定と表示
(バイト) - memory.
memsw. limit_ in_ bytes - メモリ+スワップメモリの消費量の制限値の設定と表示
(バイト)
スワップの消費量も含めた制限を設定したい場合は後者を、
たとえばtest1
グループのメモリ使用量を100MBに設定したい場合は以下のように設定します。/sys/
にmemoryサブシステムをマウント済みとします。
100M
という文字列を書き込むと、
では実際に制限値に達した時にどうなるかを見る前にmemoryサブシステムで使用するファイルをさらにいくつか見ておきましょう。
- memory.
usage_ in_ bytes - cgroup内のプロセスが現在消費しているメモリ
- memory.
max_ usage_ in_ bytes - cgroup内のプロセスが今までに消費したメモリの最大値
- memory.
failcnt - cgroup内のプロセスのメモリ消費量が制限値にヒットした回数
memory.
を継続して監視することで、memory.
やmemory.
をチェックして、
さて、malloc()
でメモリを確保して、memset()
でメモリを消費するだけのmemory
というプログラムを作成し、
実行して少し時間が経つと"Killed"と表示されてプロセスがkillされました。これだけではなんのことかわからないかと思います。これはLinuxでシステムのメモリが足りなくなった時に発動するOOM Killerによってcgroup内のプロセスが強制終了させられています。メモリの消費が上限に達したことをmemory.
を見て確認してみましょう。
先ほど設定した制限値が最大値になっており、
また、
メモリ使用量の制限を行うだけであれば、
- 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を登録します。
ここでは/dev/
に対して単位時間辺りに書き込める量に制限をかけてみます。この時使用するファイルは以下のファイルです。
- blkio.
throttle. read_ bps_ device - デバイスからの読み込みの制限値
(バイト/ 秒) - blkio.
throttle. write_ bps_ device - デバイスへの書き込みの制限値
(バイト/ 秒)
制限をかけるにはデバイスのノード番号が必要です。このノード番号と制限値を以上のファイルに書き込むことで制限できます。またblkio
で制限ができないデバイスのノード番号を指定したり、/dev/
などのパーティションを指定したりするとエラーで書き込めません。
/dev/
のノード番号は 253:16 ですので、
無事書き込めていますね。複数のデバイスに対する設定を行う場合は、 制限を取り消したい場合は制限値として 先ほど存在していた さて、 きちんと設定通りの値になっていますね。同様に読み込みの制限を設定してみましょう。 書き込みと同様に制限がされているのがわかりますね。ここでは単位時間あたりのバイト数で制限しましたが、 上記のような設定を行うと、 これも確認しておきましょう。 I/ perf_ カーネル付属文書のperf-record. net_ 優先度の設定と設定の確認には ここの例はUbuntu 12. ここではcgroupfsをマウントしたあと、 このようにインターフェースごとの優先度の値が書かれています。cgroupを作成した時のデフォルト値は親グループの それではここで作成した2つのグループに優先度を設定してみます。 それぞれのグループの net_ HugeTLBはメモリを管理する単位であるページのサイズを大きくすることで、 nsサブシステムは前回の表1では紹介しませんでした。なぜかと言いますと、 元々は名前空間機能と連携してcgroupを作成する機能でした。2. 2. 今回を合わせると3回に渡ってLinuxカーネルに実装されているcgroupの解説をしてきました。ここまで解説したようにかなり広範囲に渡る機能が実装されている一方で、 このような時期に、 一方でcgroupの大きな変更がかなり進んできており、 今回説明したmemoryサブシステムの機能はユーザメモリの制限でした。一方でカーネルが内部的に使用するカーネルメモリの制限機能も実装が進んでいます。現時点でもカーネルメモリの制限を行う機能は実装されており しかし、 また、 このようにまだまだ激しく変化している発展途上のサブシステムであり、 これまで説明したようにcgroupの開発が進み多数のサブシステムが実装され、 今後cgroupで一番大きく変わるのが前回cgroupの特徴としてあげた 複数階層構造のサポート がなくなり、 複数階層構造のサポートは一見柔軟性を持っているようにみえます。しかし現在のcgroupの仕様を考えるとあまり役に立つことがないようです。 たとえば、 freezerのようなグループのタスクに対して同時に何かを行うサブシステムを考えた場合、 このような場合、 このように、 cgroupの実際のユースケースでは、 これに伴い、 ただし、 この他にもcgroupに現在実装されているeventfdによる通知の仕組みも変わる予定のようです。また、 ここまで説明したように、 ただ、 そこで、 このエージェントへの名乗りをあげているのが、 第3回から3回にわけてcgroupの説明を行いました。例で説明したようにcgroupfsを直接触ってcgroupの設定を行うことはあまりないと思いますが、 さて、 LXCに限らず、 名前はLXC-JPという名前ですが、/dev/
のノード番号である253:0
に対する制限を書き込むと、0
を書き込みます。/dev/
に対する制限が消えていますね。
perf_
net_
net_
ファイルを使います。ここまでの例と同様に/sys/
ディレクトリにマウントして試してみましょう。test1
とtest2
という2つのグループを作成しました。まずはどのように制限値が設定されているか、net_
の値が使われます。test1
グループに1を、test2
グループに10を設定します。数字が大きい方が優先度が高くなります。net_
ファイルを見ると、test2
グループの方が優先度が高く設定されました。hugetlbサブシステム
nsサブシステム
cgroup.
機能が実装されるとともに、cgroup の今後
memoryサブシステム
memory.
で始まるファイルがカーネルメモリを制限するためのファイルです。cgroupの再設計と変更
cgroupの管理
まとめ
LXC-JPグループ