2008年 4月 21日 月曜日
やっぱり Sun がスキ!
CPU Caps 機能の動作を確認してみました
今回は、今月公開された Solaris 10 5/08 で新たに追加された Solaris コンテナの CPU Caps 機能に関して紹介します。
CPU Caps とは、コンテナに割り当てたれた CPU pool 内のリソースに対して使用制限を かける事ができる機能です。
では実際に動作を検証してみましょう。
検証環境は、8 CPU のサーバ上に作成したコンテナ (test-zone) に対して、4 CPU 分 のリソース使用制限を設定します。
[設定方法]
CPU Caps の設定は、ゾーン設定コマンド zonecfg 内で "set ncpus" にて制限を かけたい CPU 数を指定します。
# zonecfg -z test-zone zonecfg:test-zone> create zonecfg:test-zone> set zonepath=/export/zone/test2-zone zonecfg:test-zone> add capped-cpu zonecfg:test-zone:capped-cpu> set ncpus=4 zonecfg:test-zone:capped-cpu> end zonecfg:test-zone> commit
CPU Caps を設定し、info で値を確認すると以下のように表示されます。
zonecfg:test-zone> info
zonename: test-zone
zonepath: /export/zone/test-zone
brand: native
autoboot: false
bootargs:
pool:
....
....
capped-cpu:
[ncpus: 4.00]
rctl:
name: zone.cpu-cap
value: (priv=privileged,limit=400,action=deny)
[動作検証]
設定ができた所で、実際に zone を作成して負荷をかけてみます。 まずは、mpstat コマンドにて zone 内に CPU が 8 個存在している事を確認します。
test-zone# mpstat CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl 0 12 0 212 285 182 54 0 1 2 0 149 0 1 0 99 1 2 0 21 15 0 28 0 0 1 0 112 0 0 0 100 2 1 0 4 9 0 15 0 0 0 0 87 0 0 0 100 3 1 0 5 6 3 6 0 0 0 0 75 0 0 0 100 4 9 0 57 24 0 66 0 1 1 0 195 0 0 0 99 5 1 0 15 6 0 11 0 0 0 0 95 0 0 0 100 6 1 0 2 2 0 2 0 0 0 0 74 0 0 0 100 7 1 0 1 1 0 0 0 0 0 0 62 0 0 0 100ここで、CPU リソースを大量消費するプロセスを dd コマンドで 9 個起動します。
test-zone# ps -ef | grep dd
root 1723 28721 0 17:16:45 pts/2 0:00 grep dd
root 587 28721 4 17:14:28 pts/2 1:00 dd if=/dev/zero of=/dev/null
root 675 28721 4 17:14:29 pts/2 0:59 dd if=/dev/zero of=/dev/null
root 22197 19493 4 17:13:29 pts/2 2:00 dd if=/dev/zero of=/dev/null
root 763 28721 4 17:14:30 pts/2 0:59 dd if=/dev/zero of=/dev/null
root 784 28721 4 17:14:30 pts/2 0:59 dd if=/dev/zero of=/dev/null
root 384 28721 4 17:14:27 pts/2 1:01 dd if=/dev/zero of=/dev/null
root 731 28721 4 17:14:29 pts/2 0:57 dd if=/dev/zero of=/dev/null
root 797 28721 4 17:14:31 pts/2 0:58 dd if=/dev/zero of=/dev/null
root 811 28721 4 17:14:31 pts/2 0:55 dd if=/dev/zero of=/dev/null
vmstat で CPU の idle 値を確認すると、8 CPU のうち 指定した 4 CPU 分 (50%) の リソース制限がかけれらている事が確認できました。(以下 vmstat のログ参照)
test-zone# vmstat 5 kthr memory page disk faults cpu r b w swap free re mf pi po fr de sr lf s0 s1 s2 in sy cs us sy id 0 0 0 13665784 14289320 4 28 3 13 13 0 0 60 3 -0 -0 348 941 183 0 0 100 0 0 0 13394712 14845816 0 2 0 0 0 0 0 0 2 0 0 687 381039 679 33 17 50 0 0 0 13394584 14845688 0 1 0 0 0 0 0 0 0 0 0 675 380613 664 33 17 50 0 0 0 13394584 14845688 0 1 0 0 0 0 0 0 0 0 0 680 378673 668 33 17 50 0 0 0 13394784 14845888 0 1 0 0 0 0 0 0 0 0 0 677 378797 664 33 17 50
今度は、mpstat で各 CPU 毎のリソース消費状況を確認してみます。
test-zone# mpstat 5 .... CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl 0 0 0 362 291 190 102 19 34 0 0 41108 29 16 0 55 1 0 0 1 60 0 93 21 26 1 0 48938 34 17 0 50 2 0 0 1 60 3 84 24 21 1 0 51049 35 18 0 47 3 0 0 12 61 2 97 21 26 3 0 43064 30 15 0 55 4 0 0 1 55 0 84 21 28 2 0 55644 38 19 0 42 5 0 0 1 48 0 69 19 22 1 0 50612 36 18 0 46 6 0 0 2 51 4 68 20 21 1 0 45181 32 16 0 51 7 0 0 0 50 0 77 18 21 1 0 41583 30 15 0 55 CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl 0 0 0 371 289 188 91 17 31 1 0 45559 31 17 0 52 1 0 0 2 58 0 79 22 26 2 0 56062 38 19 0 43 2 0 0 1 58 3 83 19 24 2 0 47050 33 17 0 51 3 0 0 0 57 2 90 21 26 1 0 39873 28 14 0 57 4 0 0 0 56 0 84 23 31 2 0 55867 38 19 0 43 5 0 0 0 51 0 72 22 24 2 0 51719 36 18 0 46 6 0 0 3 55 0 86 21 24 1 0 41062 29 15 0 56 7 0 0 13 53 0 82 21 25 2 0 41240 29 15 0 56 ....
CPU リソース制限を set ncpus=4 で設定したので、てっきり特定の 4 CPU が固定で 消費されるのかと思ったら、平均して 4 CPU になるよう制限されている事が 確認できました。(ncpus 値は 3.5 など整数でない値も指定可能です)
CPU Caps はあくまでも Fair Share Scheduler の制御下で動作しているのですね。
[まとめ]
今まで zone 間で CPU pool を共有する環境下で CPU リソース制限をかける時は、 いくら CPU リソースを zoneA:zoneB = 1:2 の割合で指定しても、Fair Share Scheduler の仕様で zoneA のコンテナが 100% pool 内の CPU リソースを使い切る事ができました。 今回追加された CPU Caps 機能は、zone 間で同じ CPU Pool を共有している時で も完全に CPU リソースに制限をかける事ができます。
Posted at 04:06午後 4 21, 2008 by Naoyuki Yamada in Sun | 投稿されたコメント[0]