読者です 読者をやめる 読者になる 読者になる

TenForward

技術ブログ。はてなダイアリーから移転しました

libvirt 経由で lxc を触ろうと思ってハマる (5)

(2010/11/02 更新) lxc ツールキットを使った実験の時はメモリ制限が働いていたと書いてましたが,修正前の例だと働いてませんでした(実験ミス ;_;)."lxc.cgroup.memory.memsw.limit_in_bytes" の記述を追加しました.

前回 は,lxc ツールキットを使っても,libvirt を使っても,/proc/meminfo の値が親環境と同じ値で,制限値でないというのを確認しました.そこで

念のため,親環境の /cgroup/debian/memory.limit_in_bytes ファイルを見ると 536870912 となっていたので,制限はかかっているようです (実際にメモリ使いまくっては確認してませんが).

と書いてましたが,これを確認してみました.(うっかりしてましたが,この cgroup ファイルシステムの中身を確認したのは lxc ツールキットを使ったときだけだったみたいです)

確認は,コンテナを起動して,malloc してメモリ確保した後,エラーが出るまで memset をし続けるだけのプログラムを実行してます.

lxc ツールキットを使った場合

lxc.cgroup.memory.limit_in_bytes = 128M
lxc.cgroup.memory.memsw.limit_in_bytes = 128M

こんな感じで設定して,普通に

lxc-start -n debian

という風に起動した後,プログラムを動かしたら,126MB 程度 memset した時点でプログラムは終了しました.制限はちゃんと働いているようです (当たり前).

これだと libvirt と同じ条件でもないので,念のため lxc に付属のサンプルを使って

lxc.utsname = alpha
lxc.network.type = vlan
lxc.network.vlan.id = 1234
lxc.network.flags = up
lxc.network.link = eth0
lxc.network.hwaddr = 4a:49:43:49:79:bd
lxc.cgroup.memory.limit_in_bytes = 128M
lxc.cgroup.memory.memsw.limit_in_bytes = 128M

みたいな設定ファイルを作成し,

root@plamo001:~# lxc-execute -n test -f lxc-vlan.conf /bin/bash
root@alpha:~# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:01 lxc-init
    2 pts/0    00:00:00 bash
    6 pts/0    00:00:00 ps

という風にコンテナが起動させ,コンテナで起動していることを確認した後,memset しまくると,無事 126M 付近でプログラムはエラー終了しました.

この時,/proc なんかは 前回同様に親環境の値を表示しています.

root@alpha:~# free -m 
             total       used       free     shared    buffers     cached
Mem:          1003         70        932          0          7         37
-/+ buffers/cache:         25        977
Swap:            0          0          0
root@alpha:~# cat /proc/meminfo | grep MemTotal
MemTotal:        1027356 kB

libvirt

前々回 にあるのと同様の XML 定義ファイルで,メモリを

  <memory>131072</memory>

という風に設定して

virsh --connect lxc:/// start vm

という風に起動し,virsh console コマンドで接続して,memset しまくるプログラムを実行したら,親環境と同じサイズまで確保可能でした.上記の制限が効いていないようです.Why??

libvirt の方はもう少し調査 (勉強?) が必要なようです... (>_<)