Edited at

LXC/cgroupsについても調べてみたのでめもめも

More than 5 years have passed since last update.

Dockerを調べていたら、下位レイヤであるLXCやcgroupに興味が出てきたので少し調べました。

まだ触ってみたくらい。


What is LXC?


  • LinuX Containerの略で、システムのコンテナ化を行なうための機構

  • OSレベルで提供されている

  • Linux kernelの機構であるcgroups/namespaceなどに依存している

  • 低レイヤな機構であるcgroupsなどをとりまとめる中間レイヤ的な側面を持つが、さらに高レイヤのDockerから利用されることが多い

  • 同様の技術にFreeBSD jailやSolaris Containersなど


How to use

以下でインストール。

ubuntu@ubuntu:~$ sudo apt-get install lxc

以下がテンプレートとして用意されている。

ubuntu@ubuntu:~$ ls -l /usr/lib/lxc/templates/

total 88
-rwxr-xr-x 1 root root 8227 Oct 29 2013 lxc-busybox
-rwxr-xr-x 1 root root 9806 Oct 29 2013 lxc-debian
-rwxr-xr-x 1 root root 10520 Oct 29 2013 lxc-fedora
-rwxr-xr-x 1 root root 9094 Oct 29 2013 lxc-opensuse
-rwxr-xr-x 1 root root 5115 Oct 29 2013 lxc-sshd
-rwxr-xr-x 1 root root 19736 Oct 29 2013 lxc-ubuntu
-rwxr-xr-x 1 root root 10590 Oct 29 2013 lxc-ubuntu-cloud

Debianをインストールしてみる。

十分以上かかるので注意。

ubuntu@ubuntu:~$ sudo lxc-create -t debian -n debian0

No config file specified, using the default config
debootstrap is /usr/sbin/debootstrap
Checking cache download in /var/cache/lxc/debian/rootfs-squeeze-i386 ...
Downloading debian minimal ...
I: Retrieving Release
W: Cannot check Release signature; keyring file not available /usr/share/keyrings
/debian-archive-keyring.gpg
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
...

一覧を表示すると存在している。

ubuntu@ubuntu:~$ sudo lxc list                                                   

RUNNING

FROZEN

STOPPED
debian0

開始してみる。

ubuntu@ubuntu:~$ sudo lxc start debian0

INIT: version 2.88 booting
...
Starting OpenBSD Secure Shell server: sshd.

Debian GNU/Linux 6.0 debian0 console

debian0 login: root
Password:
Linux debian0 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@debian0:~#

distributionは異なっているが、同一カーネル上で動作していることが分かる。

ubuntu@ubuntu:~$ uname -a

Linux ubuntu 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686 i686 i386 GNU/Linux

root@debian0:~# uname -a

Linux debian0 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686 GNU/Linux

ちなみに、以下のコマンドでfedoraをインストールすることもできるが、debianの場合と比較して時間がかかる。1時間くらいかかるかも。

ベースシステムの相違が大きいため、いろんなrpmを別途インストールする必要があるためぽい。

ubuntu@ubuntu:~$ sudo lxc-create -t fedora -n fedora0


No config file specified, using the default config
...
'fedora' template installed
'fedora0' created
ubuntu@ubuntu:~$ sudo lxc-start -n fedora0

Fedora release 14 (Laughlin)
Kernel 3.2.0-24-generic-pae on an i686 (tty1)

fedora0 login: root
Password:
Last login: Tue Jul 15 01:01:39 on console
[root@fedora0 ~]# uname -a
Linux fedora0 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686 i686 i386 GNU/Linux


What is cgroups?


  • リソースの制限


    • グループ単位でメモリ割り当てを制限



  • 優先順位の変動


    • グループ単位でCPU, Disk I/Oの優先順位を変更



  • 監視


    • グループ単位で使用しているリソースを計上



  • 各グループは階層構造を持つ


    • 子グループは親グループの属性を一定引き継ぐ



なお、以前のバージョンだとnamespaceの分離もcgroupが対応していたようですが、消されました

namespaceはカーネルの機能として独立した、ということかな。


How to use

リソース制限についてやってみる。

まずはインストール。

$ sudo apt-get install cgroup-bin

関連コマンドは

- cgcreate

- cgexec

- cgclassify

cgroupを作成。メモリとCPUのリソースを制限できるようにする。

$ sudo cgcreate -g memory,cpu:test

下記のsysfsで確認できる。

$ ls -l  -l /sys/fs/cgroup/cpu/test/

total 0
-rw-r--r-- 1 root root 0 Jul 15 13:17 cgroup.clone_children
--w--w--w- 1 root root 0 Jul 15 13:17 cgroup.event_control
-rw-r--r-- 1 root root 0 Jul 15 13:17 cgroup.procs
-rw-r--r-- 1 root root 0 Jul 15 13:17 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Jul 15 13:17 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Jul 15 13:17 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Jul 15 13:17 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Jul 15 13:17 cpu.shares
-r--r--r-- 1 root root 0 Jul 15 13:17 cpu.stat
-rw-r--r-- 1 root root 0 Jul 15 13:17 notify_on_release
-rw-r--r-- 1 root root 0 Jul 15 13:17 tasks

指定cgroupでプロセスを起動。

$ sudo cgexec -g memory,cpu:test /bin/bash

指定cgroupに属していることが分かる。

# cat /proc/self/cgroup

5:freezer:/sysdefault
4:memory:/test
3:devices:/sysdefault
2:cpuacct:/sysdefault
1:cpu:/test

CPU共有の優先度を指定可能。100で10%。

# cat /sys/fs/cgroup/cpu/test/cpu.shares                          

1024
# echo 100 >/sys/fs/cgroup/cpu/test/cpu.shares

メモリ使用量の制限。これ以上のメモリを確保しようとするとスワップアウトする。

# cat /sys/fs/cgroup/memory/test/memory.limit_in_bytes

9223372036854775807
# echo $((1024*1024)) >/sys/fs/cgroup/memory/test/memory.limit_in_bytes

統計情報も見える。

cat /sys/fs/cgroup/cpu/test/cgroup.procs 

9239
# ps auxw | grep 9239
root 9239 0.0 0.4 6960 2216 pts/1 S 13:35 0:00 /bin/bash


Docker / LXC / cgroups

なんだか似たようなシステムに思えるけど、結局これらの関係ってどうなってるの? という疑問についてはこちらが詳しい。


  • Dockerは下位レイヤとしてLXCを利用する

  • コンテナの可搬性(LXCでは環境が異なるとコンテナの互換性がない)

  • アプリの配布に最適化している

  • 自動ビルド(Dockerfile)

  • バージョン管理

  • コンテナ再利用

  • コンテナ共有

  • 様々なツール/システムとの連携

機能別に分類すると、


ファイルシステムの分離

LXC(namespace)が提供

リソースの分離

LXC(cgroup)が提供

ネットワークの分離

LXC(cgroup)が提供

ファイルシステムのCopy on Write

AUFSが提供

ロギング

Dockerが提供

ファイルの変更管理と再利用

Dockerが提供

対話的シェル

LXCが提供