LoginSignup
6
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-07-16

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が提供
6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8