やっぱり Sun がスキ! : Weblog やっぱり Sun がスキ!

やっぱり Sun がスキ!

http://blogs.sun.com/yappri/date/20080421 2008年 4月 21日 月曜日

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 リソースに制限をかける事ができます。