Control Groups/Linux Container を利用した KVM のリソース制御と

Control Groups/Linux Container を利用した KVM のリソース制御と
性能評価に関するレポート
2011/02/28
サービスディベロップメントグループ
船ヶ山 慶
研究背景
現在の仮想化技術にあるハイパーバイザー型の問題点として、ゲスト OS(以後 VM)の
SLA(Service Level Agreement)、Oos(Quality of Service)が完全に出来ていないことが挙げられ
る。※1
そこで、kernel 2.6.27 より kernel にマージされた Control Groups(以後 cgroups)を利用し、
VM の統合リソース制御が行えるか調査し、その性能評価を行う。
今回の性能評価では、マルチコア CPU のリソース制御、ディスク IO 制御、ネットワーク制
御を調査する。※2
また、今回利用した Linux Container(以後 lxc)も合わせて調査する。
※今回のレポートでは NUMA(Non-Uniform Memory Access)については触れない。
※1 Xen には、dm-ioband といったようなディスク I/O 帯域制御ドライバなどがあるが、リソ
ース全体をカバーしておらず十分でない。
※2 メモリについては、すでに KVM や他の仮想化技術でサポートされているため調査しない。
cgroups(Control Groups)
概要
特定のプロセス及びプロセスグループ※3を分離し、リソース管理を行う仕組みで従来の
Linux リソース管理をより柔軟、高度に管理する事を目的とした技術である。
ライブラリには、libcgroup.so が用意されており、libvirt や後述する Linux Containers もこれを
利用している。
cgroups は Kernel 2.6.27 から追加され、kernel 2.6.29 で全機能をサポートされました。
ライセンスは GPLv2 で、RHEL6 に標準搭載されています。
※3 cgroups では複数のプロセスをまとめて管理することができる。もちろん1プロセスも管
理も可能である。以後文章では、1プロセスも複数のプロセスもプロセスグループで統一する。
cgroup 用語
●
●
●
cgroup
○ 複数のサブシステムと複数のプロセス(task)をグルーピングし、システムに関連
付けます。
サブシステム(subsystem)
○ cgroups によって提供されるリソースコントローラ(スケジューリング、割り当
て)を制御、設定するのに利用します。
階層(hierarchy)
○ 階層構造で表現された cgroup の集まりを表現しています。
■cgroup 同士の親子関係を表現できます。
○ プロセスグループ毎にサブシステムと階層が存在します。
○ 階層内はすべてアクセス権限を変更する事で、root でなくても操作することが可
能です。
利用イメージ
以下の図は、各種システムリソースを cgroups で割り振った場合の例である。
#A ではユーザ別、#B ではプロセスグループ別と状況に応じた柔軟なリソース制御を提供し
ています。
構成と図解(Fedora 14 base)
以下の図はユーザが操作可能なライブラリ、設定ファイル、ファイルシステムです。
●
libcg API
○ cgroup をプログラムから操作するためのライブラリです。
○
●
●
プロセスグループの作成、編集、削除、アクセス権限等の操作を行う事ができま
す。
設定ファイル※4
○ cgconfig.conf
■cgroup ファイルシステムのマウント情報等の定義を行います。
cgconfigparser を利用しロードします。
○ cgrules.conf
■プロセスグループを利用可能なグループ、ユーザの指定を行います。
■cgrulesengd を利用しロードします。
ファイルシステム
○ /cgroup を cgroups ファイルシステムとして利用することで、直接操作すること
ができます。
※4 Fedora 14 では図のような構成になっているが、設定次第でどのような構成も取れる様に
なっています。
また、Fedora 14 では/sbin/cgconfigparser、/sbin/gcrulesengd 用の起動スクリプトが別途提供
されています。
リソース制御
CPU
CPU のリソース制御では、コアの指定やプロセスグループ単位での重み付けで制御を行うこ
とできます。
cgroup ファイルシステムからの設定例
guest1 が使用する CPU コアを変更します。
guest1 が現在使用している CPU コアを表示
# cat /cgroup/guest1/cpuset.cpus
0
guest1 の CPU コアを 1 に変更
# echo "1" > /cgroup/guest1/cpuset.cpus
guest1 が現在使用している CPU コアを表示(確認)
# cat /cgroup/guest1/cpuset.cpus
1
#A は、VM(プロセス)別にコアを指定する場合の図解です。
#B は、一つのコアにプロセス別の重み付けを行う場合の図解です。
※ VM とあるがプロセスグループと同義です。
※ 今回は触れませんが、CPU のメモリ・ノードの操作も可能である。
メモリ
RAM、スワップの設定やプロセスグループが使用しているメモリの使用状況を確認することが
できます。
ディスク
ディスク別(Block Device 単位)の使用可否やアクセス権限、IO 制御(重み付け、使用時間等)を
行うことができます。
※CPU の図と同様のことが可能です。
ネットワーク
プロセスグループに、tc(traffic control)で利用する class id を設定することができます。
※cgroups 自体に帯域制御を行う仕組みはありません。実際の帯域制御は tc が行います。
設定項目
net_cls.classid
ファイルシステム
cgroups filesystem を mount することで以下のようなファイル群が作成される。これを設定
することで様々な cgroup の設定が可能になります。
subsystem カテゴリ
●
●
●
●
●
●
●
cpu.xxx
○ cpu コアの重み付け(優先度)操作
cpuset.xxx
○ cpu コアの割り当て操作
cpuacct.xxx
○ CPU 使用率などの統計情報をレポート
memory.xxx
○ 物理メモリの操作、制御とレポート
net_cls
○ iproute2 tc(Traffic Control)で利用する class id の操作
blkio.xxx
○ ディスク I/O の重み付け、I/O スケジューラーレポートなど
device.xxx
●
○ ディスクのアクセス制御
Freezer
○ プロセスグループ(cgroup)全体を一時停止、再開
cgroups 階層
以下は mount コマンドを利用した場合の構成です。cgroup の設定次第で、自由なファイルシ
ステム構造にすることも可能です。
# tree /cgroup/
├── blkio.io_merged
IO のマージ要求数レポート(読み取り、書き込み、同期|非同期)
├── blkio.io_queued
IO キューに滞留数レポート
├── blkio.io_service_bytes
各デバイスに転送された Byte 数レポート(読み取り、書き込み、同期、非同期、合計)
├── blkio.io_service_time
IO 時間レポート(ナノ秒)
├── blkio.io_serviced
特定デバイス上での実行 IO 数レポート(読み込み、書き込み、同期、非同期、合計)
├── blkio.io_wait_time
IO スケジューラで待機させられた合計レポート(ナノ秒)
├── blkio.reset_stats
cgroup の統計情報のリセット(pseudofiles)
├── blkio.sectors
各ブロック(デバイス)に転送されたセクタ数レポート
├── blkio.time
ブロックデバイス単位で使用できる時間を指定することができる(ミリ秒)
├── blkio.weight
ブロック IO の重み付け値レポート
├── blkio.weight_device
各デバイス(/dev)の指定を行ってブロック IO 制御を行う。
# ls -al /dev/sda
brw-rw---- 1 root disk 8, 0 2010-12-25 13:55 /dev/sda
8 = メジャーデバイス番号
0 = マイナーデバイス番号
example) echo “dev_maj:dev_minor weight” > /path/to/cgroup/blkio.weight_device
├── cgroup.event_control
├── cgroup.procs
├── cpu.rt_period_us
グループが CPU リソースへ再割り当てされるべき間隔(マイクロ秒)
├── cpu.rt_runtime_us
グループが CPU リソースへのアクセスを保持する最長の期間(マイクロ秒)
├── cpu.shares
グループがシェアできる割合
├── cpuacct.stat
CPU サイクルレポート(USER_HZ)
├── cpuacct.usage
すべて CPU 消費時間レポート(ナノ秒)
├── cpuacct.usage_percpu
各 CPU 消費時間の合計レポート(ナノ秒)
├── cpuset.cpu_exclusive
├── cpuset.cpus
グループが使用する CPU のコア No を指定 [0, 1, 0-2]
├── cpuset.mem_exclusive
├── cpuset.mem_hardwall
├── cpuset.memory_migrate
├── cpuset.memory_pressure
├── cpuset.memory_pressure_enabled
├── cpuset.memory_spread_page
├── cpuset.memory_spread_slab
├── cpuset.mems
グループが使用する CPU 集合のメモリノードを指定 [0, 1, 0-2]
├── cpuset.sched_load_balance
├── cpuset.sched_relax_domain_level
├── devices.allow
アクセス可能なデバイス
a b,c 両デバイス
b ブロックデバイス
c キャラクタデバイス
x:y x=デバイスのメジャー番号、y=デバイスのマイナー番号
r 読み取り可能
w 書き込み可能
m 書き込み可能(ない場合は作成可)
├── devices.deny
アクセス不可能なデバイス
※設定値は、devices.allow と同一
├── devices.list
利用しているデバイスリスト
※設定値は、devices.allow と同一
├── memory.failcnt
メモリ制限(memory.limit_in_bytes)値を超えた回数レポート
├── memory.force_empty
├── memory.limit_in_bytes
メモリの最大値を設定します。
無制限にしたい場合は、-1 を設定
├── memory.max_usage_in_bytes
使用可能なユーザメモリの最大容量レポート(Byte)
├── memory.memsw.failcnt
メモリ制限(memory.limit_in_bytes)値を超えた回数レポート
├── memory.memsw.limit_in_bytes
メモリと swap の使用容量を設定します。
無制限にする場合は、-1 を設定します。
├── memory.memsw.max_usage_in_bytes
プロセスによって使用されるメモリ使用量と swap 領域の最大値レポート(Byte)
├── memory.memsw.usage_in_bytes
プロセスによって使用されているメモリ使用量と swap 領域の合計レポート(Byte)
├── memory.move_charge_at_immigrate
├── memory.oom_control
oom_kill_disable OOM killer を利用するか
under_oom コンテナ内のタスク(プロセス)に OOM Killer を利用するか
├── memory.soft_limit_in_bytes
├── memory.stat
メモリ統計情報レポート
├── memory.swappiness
ページのスワップ調整(parent : /proc/sys/vm/swappiness)
├── memory.usage_in_bytes
プロセスの現在の総メモリ使用量レポート(Byte)
├── memory.use_hierarchy
├── net_cls.classid
ネットワークの通信 Control で利用する tc への識別子
├── notify_on_release
├── release_agent
├── guest1 ※cgroups
├── ...
└── tasks
管理している PID リスト
初期セットアップ
cgroups 状態チェック
cgroups のインストール状態を確認します。これは現在利用可能な設定や kernel を確認する
事ができます。(fedora 14)
# lxc-checkconfig
Kernel config /proc/config.gz not found, looking in other places...
Found kernel config file /boot/config-2.6.35.4-9m.mo7.x86_64
--- Namespaces --Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled
--- Control groups --Cgroup: enabled
Cgroup namespace: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
--- Misc --Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
LXC(Linux Containers)
概要
Linux Containers(以後 LXC)は、完全なリソースの分離と制御を行うことができます。
具体的には、ユーザ空間でのコンテナオブジェクトを提供、管理することを目的とした仕組み
です。
※ユーザ空間での使用であるため、ホスト OS の資産を再利用することでハイパーバイザー
型の仮想化技術より効率よく運用することができます。
LXC は、cgroups を含めたオブジェクトをコンテナという単位で管理します。
また、cgroups よりシンプルな設定で管理することができ、各コンテナを起動、停止、一時停
止する機能なども有したオープンソースソフトウェアです。
LXC を使用することで、コンテナ型の仮想化を提供することができます。
コンテナ型の仮想化技術は、Solaris Containers や FreeBSD jail、OpenVZ が有名ですが、LXC
は cgroup を基礎としてコンテナ型の仮想化を実現しています。
LXC は大きくシステムコンテナとアプリケーションコンテナに分類されてます。
前者は OS 全体の仮想化で init(sysvinit など)から起動 ※6 し仮想 OS 空間を提供します。
後者は chroot と同じでアプリケーションを分離する方式に非常に似ています。また、単一アプ
リケーションを分離するだけであるため、非常にシンプルかつ軽量であるのが特徴です。
今回は、アプリケーションコンテナを主軸に説明していきます。
LXC のコンテナ管理は libvirt の管理方法に非常によく似ています。
※6 起動プロセスは init(SysVinit)からですので非常に高速に起動します。ですが、一つの
Kernel(一般的にはホスト OS)をゲスト OS が共有しているため他の OS 等をゲスト OS とし動
作させる事ができないなど、他のコンテナ型と同じデメリットもあります。
構成と図解
アプリケーションコンテナを実行した場合、以下のような図で起動することができます。
定義
● ケイパビリティ : POSIX Capability(LInux カーネルケイパビリティ)
○ CAP_SYS_MODULE ....
● cgroups : Control Groups
● Virtual Network : 仮想ネットワークデバイス
● utsname : 独立したホスト名
● rootfs : コンテナのファイルシステム
● mount : コンテナへマウント : /lib /bin ...
● console,pty ... : その他
lxc.conf の記述方法(man, kernel document からの和訳を含みます)
コンテナは構成ファイル(lxc.conf)を使用して構築されます。
作成時に lxc.conf を指定しない場合、親の定義されている lxc.conf が使用されます。
デフォルトでは、SysV IPC が分離マウントされ、システムリソースは明示的に定義があるま
で親のシステムリソースを使用します。※ネットワークも同様です。
lxc.utsname
コンテナのホスト名
lxc.network.type
ネットワーク仮想化の種類を指定します。
lxc.network.type フィールドは定義があるたびに複数回定義することが可能です。
このようにすることで1つのコンテナに複数のネットワーク仮想化定義を行うことができま
す。
empty
ループバックアドレス
veth
peer network デバイスが1つ作成されます。
コンテナ外には lxc.network.link は指定されてたブリッジに定義されます。
vlan
VLAN は lxc.network.link で指定されたコンテナに割り当てられたインターフェ
イスとリンクされています。
VLAN ID を指定オプションは lxc.network.vlan.id です。
macvlan
macvlan インターフェイスは lxc.network.link で指定されたコンテナに割り当て
られたインターフェイスとリンクします。
phys
lxc.network.link で指定された既存のインターフェイスは、コンテナに割り当て
られています。
lxc.network.flags
ネットワークのために実行するアクションを指定します。
up: インターフェイスがアクティブになります。
lxc.network.link
実際のネットワークトラフィックに使用するインターフェイスを指定します。
lxc.network.name
ネットワークインターフェイス名を指定します。
lxc.network.hwaddr
インターフェイスの MAC アドレスを指定します。
lxc.network.ipv4
仮想化されたインターフェイスに割り当てる IPv4 アドレスを指定します。
複数のネットワークインターフェースを指定することが可能です。
その場合は複数行記述してください。
format) x.y.z.t / m
192.168.1.123/24。
lxc.network.ipv6
仮想化されたインターフェイスに割り当てる IPv6 アドレスを指定します。
複数のネットワークインターフェースを指定することが可能です。
その場合は複数行で記述してください。
format) ×::y/ m
2003:db8:1:0:214:1234:fe0b:3596/64
lxc.pts
仮想 PTS のインスタンスを指定します。
lxc.console
コンテナーシステムコンソールパスを指定します。
lxc.tty
仮想 TTY のインスタンスを指定します。
ライフサイクル
LXC は他の仮想化ソフトと同様に Start -> Running -> Stop のような、状態遷移を行うことが
できます。
以下の図は、コンテナのライフサイクルモデルを表している。
主要コマンド(man, kernel document からの和訳を含みます)
LXC には、コンテナを操作するためのコマンドが提供されています。
共通オプション
-?, -h, --help
長いヘルプを出力します。
--usage
使用方法のメッセージを与える。
-q, --quiet
静かに実行します。
-o --logfile=FILE
ログの出力先をファイル指定する。
-l --logpriority=LEVEL
ログレベルの指定。
レベル : FATAL, CRIT, WARN, ERROR, NOTICE, INFO, DEBUG
lxc-wait
説明
特定のコンテナの状態を監視します。
指定した状態になるまで待ちます。
書式
lxc-wait -n コンテナ名 -s 状態
利用方法
停止や状態変更の実行の際に、状態変更を確認する手段として利用する。
オプション
-n --name=NAME
ターゲットとなるユニークなコンテナー名
形式は英数字の文字列識別子
-s
コンテナの状態
OR 演算子 | で重ねてして可能 example) 'RUNNING|STOPPED'
例
lxc-wait --name guest1 -s "STARTING|RUNNING"
lxc-stop
説明
コンテナ内で実行されているアプリケーションを停止する。
書式
lxc-wait -n コンテナ名
オプション
-n --name=NAME
ターゲットとなるユニークなコンテナ名
形式は英数字の文字列識別子
lxc-unfreeze
説明
コンテナの一時停止を解除する。
書式
lxc-unfreeze -n コンテナ名
オプション
-n --name=NAME
ターゲットとなるユニークなコンテナー名
形式は英数字の文字列識別子
lxc-start
説明
コンテナを起動します。
書式
lxc-start -n コンテナ名 [-f 設定ファイル] [-s KEY=VAL] [command]
利用方法
指定されたコンテナ内の指定されたコマンドを実行します。
オプションで指定された設定ファイルを利用してコンテナ内のコマンドを実行します
が、指定が無い場合はグローバルの設定を利用して実行されます。
コマンドが指定されている場合、lxc-start はシステムコンテナを実行には'/bin/init'が利
用されます。
オプション
-n --name=NAME
ターゲットとなるユニークなコンテナー名
形式は英数字の文字列識別子
-d --daemon
デーモンとしてコンテナの実行を行ないます。
-f, --rcfile=FILE
コンテナの設定ファイル
-s, --define KEY=VAL
設定ファイルで指定された値をオーバーライドすることができます。
lxc-ps
説明
コンテナ内のプロセスを表示します。
書式
lxc-ps [--name コンテナ名] [--lxc] [ps option]
オプション
-n --name=NAME
ターゲットとなるユニークなコンテナー名
形式は英数字の文字列識別子
--lxc
コンテナ内のプロセスの出力制限します。
[ps options]
一般的な'ps'コマンドのオプションを指定します。
lxc-monitor
説明
コンテナの状態をモニタリングします。
書式
lxc-monitor -n コンテナ名
利用方法
指定されたコンテナの状態を監視します。名前は POSIX2 の正規表現記法を利用する
ことができます。
※すべてのコンテナを指定することも可能です。
オプション
-n --name=NAME
ターゲットとなるユニークなコンテナー名
形式は英数字の文字列識別子
lxc-ls
説明
コンテナの表示を行ないます。
書式
lxc-ls [ls option]
オプション
[ls option]は一般的な ls オプションを利用することができます。
lxc-kill
説明
コンテナにシグナルを送り停止することができます。
書式
lxc-kill --name=コンテナ名 SIGNUM
利用方法
指定したコンテナの最初のプロセスに SIGNUM を送信し停止させます。
オプション
-n --name=NAME
ターゲットとなるユニークなコンテナー名
形式は英数字の文字列識別子
例
コンテナ 123 のプロセス pi1 にシグナル 26 を送信する
lxc-execute -n 123 -- pi1 -d 500000
lxc-kill --name=123 26
lxc-freeze
説明
コンテナを一時停止します。
書式
lxc-freeze -n コンテナ名
利用方法
明示的に再開コマンドを送るまでは、プロセスはブロックされます。
スケジュールバッチ処理を利用する際などに有効なコマンドです。
オプション
-n --name=NAME
ターゲットとなるユニークなコンテナー名
形式は英数字の文字列識別子
lxc-execute
説明
コンテナ内でアプリケーションを実行します。
書式
lxc-execute -n コンテナ名 [-f 設定ファイル] [-s KEY=VAL ] command
利用方法
指定したコンテナ内の指定されたコマンドを実行します。
設定ファイルにない設定はグローバルの設定を利用して実行されます。
オプション
-f, --rcfile=FILE
コンテナの設定ファイル
-s, --define KEY=VAL
設定ファイルで指定された値をオーバーライドすることができます。
lxc-destroy
説明
コンテナを削除します。
書式
lxc-create -n コンテナ名
利用方法
lxc-create で起動したコンテナを削除します。
オプション
-n --name=NAME
ターゲットとなるユニークなコンテナー名
形式は英数字の文字列識別子
lxc-create
説明
コンテナの作成を行ないます。
書式
lxc-create -n コンテナ名 [-f 設定ファイル] [-t template]
利用方法
設定ファイルを元にコンテナを作成します。
設定ファイルを指定されていない場合、デフォルトの設定を元に作成されます。
オプション
-f, --rcfile=FILE
コンテナの設定ファイル
-t
コンテナ作成時に実行したいスクリプト
lxc-create コマンドによって呼ばれるスクリプトを指定してください。
lxc-cgroup
説明
コンテナに関連付けされた cgroup コントロールグループを管理します
書式
lxc-start -n name サブシステム [値]
オプション
-n --name=NAME
ターゲットとなるユニークなコンテナー名
形式は英数字の文字列識別子
サブシステム
サブシステム制御グループの名前を指定します。
[値]
サブシステム制御グループの値を設定することができます。
便利なスクリプトサンプル
すべてのコンテナのリストを取得しその状態を取得する。
-#!/bin/bash
for i in $(lxc-ls -1); do
lxc-info -n $i
done
-すべてのコンテナのすべての PID を表示する。
-#!/bin/bash
for i in $(lxc-ls -1); do
lxc-ps --name $i --forest
done
-複数のコンテナを監視します。パラメータは正規表現を受付けることが可能です。
説明
'foo'と'bar'を監視します。
-#!/bin/bash
lxc-monitor -n "foo|bar"
-すべてのコンテナを監視します。
-#!/bin/bash
lxc-monitor -n ".*"
-バックグラウンドで lxc-wait を起動する
-#!/bin/bash
lxc-wait -n foo -s STOPPED &
LXC_WAIT_PID=$!
-バックグラウンドでコンテナを起動する
-#!/bin/bash
lxc-execute -n foo mydaemon &
--
クイックスタート(ssh)
概要
sshd をコンテナ内で動作させます。
lxc 設定
lxc の設定は未指定とします。
手順
cgroup をマウント
mount -t cgroup cgroup /cgroup
すでにホストで動作している sshd を停止
/etc/init.d/sshd stop
コマンドベースで sshd をコンテナ実行
lxc-execute -n sshd /usr/sbin/sshd
補足
-n sshd : コンテナ名の指定
/usr/sbin/sshd : コンテナ内で実行するコマンド
コンテナ内で動作しているか確認
lxc-info -n sshd
'sshd' is RUNNING
ssh でログイン
ssh localhost
補足
パスワードはホストのパスワード
プロセスを表示(ホスト OS 上)
$ ps ax
PID TTY
STAT TIME COMMAND
1 pts/0 S+ 0:00 /usr/lib64/lxc/lxc-init -- /usr/sbin/sshd
3?
Ss 0:00 /usr/sbin/sshd
4?
Ss 0:00 sshd: root@pts/2
6 pts/2 Ss そく 0:00 -bash
41 pts/2 R+ 0:00 ps ax
KVM を利用した性能測定
概要
Control Groups, LinuxContainers に KVM を配置し、その利用時のパフォーマンス劣化を調査
します。
ベンチマークは複数のベンチマークソフトを使用します。
KVM(Kernel-based Virtual Machine)
●
●
●
●
Linux カーネル仮想化基板として Kernel に取り込まれている仮想化技術である。
Intel-VT(-x)や AMD-V などの CPU 仮想化支援機構を利用しネイティブ仮想化を実現し
ています。
エミュレータには Qemu を利用することで、多数の OS をサポートしている。
Kernel に取り込まれたことで、Xen ではなく KVM の利用が増えている。
○ 補足 : Kernel 2.6.34 で Xen Guest 、2.6.37 で Xen Host(一部機能)の取り込みが
行われているので、今後はどうなるか未知数である。
性能測定方法
以下の4パターンで性能測定を行う。
● ホスト
● ゲスト単体
● ゲスト on Control Groups
● ゲスト on Linux Container
測定箇所
● CPU
● ディスク
● ネットワーク
ベンチマークソフト
●
kernbench
○
○
●
fedora 14 kernel source linux-2.6.35
dbench
○
○
●
kernbench Version 0.50
dbench version 4.00
command : dbench 5
tbench
○
○
dbench version 4.00
command : tbench -t 60 5 {IPADDR}
■※物理的に違うサーバに tbench_srv を用意
ブリッジ設定
KVM で使用する、ブリッジを新規に作成します。
bash スクリプト例
-#!/bin/bash
_ifconfig=`which ifconfig`
_brctl=`which brctl`
_route=`which route`
_iptables=`which iptables`
br_name="{ブリッジ名}"
eth="{物理インターフェース名}"
ipaddr="{物理インターフェースに割り当てる IP アドレス}"
netmask="{物理インターフェースに割り当てるサブネットマスク}"
gateway="{ゲートウェイアドレス}"
${_ifconfig} eth0 0.0.0.0 promisc up
${_brctl} addbr ${br_name}
${_brctl} addif ${br_name} ${eth}
${_ifconfig} ${br_name} up
${_ifconfig} ${br_name} ${ipaddr} netmask ${netmask}
${_route} add default gw ${gateway}
${_iptables} -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
-設定後は、ifconfig, route, brctl コマンドを使い設定の確認を行ってください。
QEMU コマンド
/usr/bin/qemu-kvm ¥
-M pc-0.13 ¥
-enable-kvm ¥
-m 4096 ¥
-smp 2,sockets=1,cores=1,threads=1 ¥
-name guest1 ¥
-uuid 346e3b60-88e7-aeae-26ce-c4d1a1b9b6eb ¥
-nodefconfig ¥
-nodefaults ¥
-chardev socket,id=monitor,path=/var/lib/libvirt/qemu/guest1.monitor,server,nowait ¥
-mon chardev=monitor,mode=readline ¥
-rtc base=utc ¥
-boot c ¥
-drive file=/virt/iso/Fedora-14-x86_64-DVD.iso, ¥
if=none,media=cdrom,id=drive-ide0-1-0,readonly=on,format=raw ¥
-device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 ¥
-drive file=/virt/images/guest1.img,if=none,id=drive-virtio-disk0,boot=on,format=qcow2 ¥
-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0 ¥
-device virtio-net-pci,vlan=0,id=net0,mac=52:54:00:ff:34:5e,bus=pci.0,addr=0x3 ¥
-net tap,vlan=0,name=hostnet0 ¥
-chardev pty,id=serial0 ¥
-device isa-serial,chardev=serial0 ¥
-usb -vnc 0.0.0.0:10 ¥
-k ja ¥
-vga cirrus ¥
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5
サーバー情報
●
●
●
●
●
●
●
●
●
CPU : 2 core
Memory : 8G
Network : 100M
QEMU emulator version 0.13.0 (qemu-kvm-0.13.0)
OS Fedora 14 x86_64
kernel version 2.6.35.10-74
cgroup version 0.36
lxc version 0.7.2
KVM は、ブリッジ経由(br0)
測定結果
kernbench を最大負荷で実行した場合の測定結果
コマンド : kernbench
使用した kernel : Kernel 2.6.35.6-45.fc14.x86_64
考察
ゲスト単体に比べゲスト on Control Groups とゲスト on Linux Containers に若干のパフォー
マンス劣化(1〜2%)が見られたが、Control Groups,Linux Containers の機能を考えると許
容できるパフォーマンスを発揮していると考える。
dbench の測定結果
コマンド : dbench 5
考察
ゲスト単体に比べゲスト on Control Groups とゲスト on Linux Containers に若干のパフォー
マンス劣化(1〜2%)が見られたが、Control Groups,Linux Containers の機能を考えると許
容できるパフォーマンスを発揮していると考える。
※max_latency は、複数回測定を行ったが、ゲスト on Control Groups とゲスト on Linux
Containers の両方で安定した値が取得できなかった。
※ゲスト on Control Groups(グラフ)で劣化が見られるが1M 程度の劣化でありかつ、複数
回の測定をおこなっていないので、誤差と考える。
tbench の測定結果
コマンド : tbench -t 60 5 192.168.55.3
※192.168.55.3 は物理的に違うサーバに tbench_srv を用意した。
考察
ゲスト単体に比べゲスト on Control Groups とゲスト on Linux Containers にパフォーマン
ス劣化(10〜15%)が見られた。
※max_latency は、複数回測定を行ったが、ゲスト on Control Groups とゲスト on Linux
Containers の両方で安定した値が取得できなかった。
最後に
Control Groups、Linux Containers を利用することで、SLA、Qos が行えることが確認できた。
実例として、不意なアクセスによるシステムリソースの枯渇や、他プロセスへの影響をなくす
事ができるなどの利点もあることがわかった。
KVM の性能評価でもわかるように、KVM+Control Groups、Linux Containers でのパフォー
マンス劣化がそれほど発生していないこともわかった。
参考 URL
●
●
●
●
Control Group : http://libcg.sourceforge.net/
Linux Container : http://lxc.sourceforge.net/
Kernel Document(cgroups) : http://www.kernel.org/doc/Documentation/cgroups/
LXC: Linux コンテナー・ツール :
○ http://www.ibm.com/developerworks/jp/linux/library/l-lxc-containers/