Power Virtual Server (PowerVS)のShared Processor Pool機能を使ってみる

# はじめに

Power Virtual Server（PowerVS）で、Shared Processor Pool機能（以下SPP）が使えるようになりました。
https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-manage-SPP

これは、オンプレミスのPowerで使えるSPPと概ね同じ概念で、CPUプールを定義し、複数のLPAR間でそのプールのCPUリソースを共有できる機能です。
複数LPARで使用するCPUの合計に上限を設けられるので、CPUコア数で課金するソフトウェアのライセンス費用を抑制できる可能性があります。

オンプレミスと若干違うのは、PowerVSがマルチテナントであるため、他テナントのリソースを奪いすぎないよう、下記が規定値となっていてユーザー側では変更できない点です。
・Virtual Processor-to-Entitled Capacity (VP to EC) が1:1である。
・Weightが全てのLPARで同じ値（128）に設定されている。

SPPの利用例としては、例えば、SPPを1コアで作り、その中に、uncapped sharedで0.25コアのLPARを4つ（LPAR1〜LPAR4）作ったとします。上述の通りVP:ECの比率は1:1なので、0.25コアでLPARを作ると、そのLPARのVPは1で作られます。

1つのLPAR（例えばLPAR1）で負荷が高くなった場合、他の区画がCPUを使っていなければ、LPAR1はVP=1までのCPUリソースを取得します。
同じSPP内に他に負荷の高いLPAR（例えばLPAR2）がいた場合、LPARに割り当てられたコア数（Entitled Capacity）までは優先的に取得しつつ、均等に分け合って利用します。これは上述の通り、Weightが同じ値に設定されているためです。LPAR1とLPAR2の負荷が高く、LPAR3とLPAR4がほとんどCPUを使っていないような場合、LPAR1とLPAR2が約0.5コアずつ使用します。

（他が空いていれば）1コアの能力を出せるLPARが4つありますので、システム全体で4コア相当とも言えますが、使っているSPPは1コアですので、ソフトウェアライセンスの規約によっては1コア分の課金で利用できる、というのがShare Processor Poolのメリットです。（詳しくは利用するソフトウェアの利用規約をご確認ください。）

# 試してみる

実際に試してみます。

1コアを予約したSPPを作成。
pool placement groupは、指定しなくても構いませんが、指定する場合は先にplacement groupを作っておきます。（placement groupについては[こちら](https://qiita.com/y_tama/items/26a2e69f40e5524c8c16)に書きました。）
SPP自体にも費用がかかりますので、SPPの費用と、SPPにより安くできるソフトウェアライセンス費用を比較して利用を判断する形になると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/84294474-b89f-0f61-b3ec-c08d8b11365f.png)

poolができたら、その中にLPARを作成します。

LPAR作成画面でSPP内にLPARを作成することを指定します。（後から移動することはできません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/a7e9c0fb-b2e4-6325-9c26-84ba9b663a8c.png)

0.25コアのAIXのLPARを4つ作成していきます。
LPARを作成してCPUを割り当てるにつれ、SPPのAllocated coresが増え、Available coresが減っていきます。

下記は3つ作ったところ。0.25コアx3LPAR=0.75コアがAllocate済となり、Availableが0.25となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/dc5bd626-262c-06f9-29d9-5633ec97cc9e.png)

0.25コアのLPARを4つ作ると、1コアのSPPのリソースは全部使い切った状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/49c11f9f-bdf3-c86e-c48a-7ee451a5d28f.png)

これ以上のLPARの作成はエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/134190b2-a6e5-947f-8e22-9cb743d7f855.png)

lparstat -iで、LPARの情報を確認します。

```:LPAR1のlparstatの出力
bash-4.3# lparstat -i
Node Name                                  : aix01
Partition Name                             : aix01-d6ee30fd-000147ba
Partition Number                           : 11
Type                                       : Shared-SMT-8
Mode                                       : Uncapped
Entitled Capacity                          : 0.25
Partition Group-ID                         : 32779
Shared Pool ID                             : 1
Online Virtual CPUs                        : 1
Maximum Virtual CPUs                       : 5
Minimum Virtual CPUs                       : 1
Online Memory                              : 2048 MB
Maximum Memory                             : 16384 MB
Minimum Memory                             : 2048 MB
Variable Capacity Weight                   : 128
Minimum Capacity                           : 0.25
Maximum Capacity                           : 1.00
Capacity Increment                         : 0.01
Maximum Physical CPUs in system            : 20
Active Physical CPUs in system             : 20
Active CPUs in Pool                        : 1
Shared Physical CPUs in system             : 19
Maximum Capacity of Pool                   : 100
Entitled Capacity of Pool                  : 100
Unallocated Capacity                       : 0.00
Physical CPU Percentage                    : 25.00%
Unallocated Weight                         : 0
Memory Mode                                : Dedicated
Total I/O Memory Entitlement               : -
Variable Memory Capacity Weight            : -
Memory Pool ID                             : -
Physical Memory in the Pool                : -
Hypervisor Page Size                       : -
Unallocated Variable Memory Capacity Weight: -
Unallocated I/O Memory entitlement         : -
Memory Group ID of LPAR                    : -
Desired Virtual CPUs                       : 1
Desired Memory                             : 2048 MB
Desired Variable Capacity Weight           : 128
Desired Capacity                           : 0.25
Target Memory Expansion Factor             : -
Target Memory Expansion Size               : -
Power Saving Mode                          : Dynamic Power Savings (Favor Performance)
Sub Processor Mode                         : -
bash-4.3# 
```

今回、ポイントになるのは下記です。

割り当てCPUは0.25
```
Entitled Capacity                          : 0.25
```

VPは1（変更不可）
```
Online Virtual CPUs                        : 1
```

weightは128（全LPAR共通、変更不可）
```
Variable Capacity Weight                   : 128
```

なお、SPPは1台の物理筐体のCPUを効率よく分け合って使う技術ですので、同じSPPに作ったLPARは全て同じ筐体上に配置されます。（`prtconf`コマンドで筐体のシリアルを確認すると、全て同じシリアルの筐体上に作られていることが確認できます）

`yes > /dev/null &` を複数実行してCPU負荷を高めながら、vmstatでCPUの使用状況を確認します。

## 1つのLPARに負荷

何も負荷をかけていない初期状態では、CPU使用率は0%です。
`yes > /dev/null &` を複数実行すると、usの列（右から7列目）が99(%)になり、pcの列（右から3列目）が0.97〜0.98（コア）といった高い値になり、SPP内にある1コアをほぼ全て取得している状態になります。


```:LPAR1のvmstatの出力
# vmstat -t 1

System configuration: lcpu=8 mem=2048MB ent=0.25

kthr    memory              page              faults              cpu             time  
----- ----------- ------------------------ ------------ ----------------------- --------
 r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa    pc    ec hr mi se
 2  0 386157 74554   0   0   0   0    0   0   9  385 190  0  0 99  0  0.01   3.7 03:33:16
 2  0 386160 74551   0   0   0   0    0   0   7   55 188  0  0 99  0  0.01   2.5 03:33:17
 2  0 386196 74515   0   0   0   0    0   0  11 1373 194 19  1 81  0  0.12  49.7 03:33:18
 3  0 386236 74475   0   0   0   0    0   0  15 19778 219 45  0 55  0  0.98 393.3 03:33:19
 4  0 386276 74435   0   0   0   0    0   0   9 33956 223 68  1 31  0  0.98 390.1 03:33:20
 6  0 386356 74355   0   0   0   0    0   0  10 40307 216 78  1 22  0  0.96 384.4 03:33:21
 6  0 386396 74315   0   0   0   0    0   0  12 45584 218 86  1 13  0  0.98 391.7 03:33:22
 8  0 386476 74235   0   0   0   0    0   0   7 49080 223 93  1  6  0  0.97 389.2 03:33:23
10  0 386557 74154   0   0   0   0    0   0  12 57316 233 99  1  0  0  0.97 389.4 03:33:24
11  0 386557 74154   0   0   0   0    0   0   4 55637 265 99  1  0  0  0.97 388.5 03:33:25
11  0 386557 74154   0   0   0   0    0   0  22 56104 431 99  1  0  0  0.97 386.8 03:33:26
11  0 386557 74154   0   0   0   0    0   0   2 55097 398 99  1  0  0  0.97 388.6 03:33:27
11  0 386557 74154   0   0   0   0    0   0   0 55361 400 99  1  0  0  0.97 388.9 03:33:28
11  0 386557 74154   0   0   0   0    0   0   0 55609 401 99  1  0  0  0.97 388.8 03:33:29
```

## 2つのLPARに負荷

次に、LPAR1に負荷をかけたまま、LPAR2でも同様に`yes > /dev/null &`を複数実行し、負荷を高めます。
すると、LPAR1とLPAR2でpoolの1CPUを等分して使うため、右から３列目のpcの列が0.97あたりから0.5あたりになります。
与えられた0.5コアの処理能力をフルに使っていますので、usの値が99%というのは変わりません。

```:LPAR1のvmstatの出力
11  0 386563 74148   0   0   0   0    0   0  10 51852 412 99  1  0  0  0.89 355.9 03:33:52
11  0 386563 74148   0   0   0   0    0   0   0 55334 388 99  1  0  0  0.96 384.9 03:33:53
11  0 386563 74148   0   0   0   0    0   0   9 55020 398 99  1  0  0  0.95 380.8 03:33:54
11  0 386563 74148   0   0   0   0    0   0   6 56014 384 99  1  0  0  0.97 387.1 03:33:55
kthr    memory              page              faults              cpu             time  
----- ----------- ------------------------ ------------ ----------------------- --------
 r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa    pc    ec hr mi se
11  0 386838 73873   0   0   0   0    0   0  14 56375 397 99  1  0  0  0.95 380.7 03:33:56
11  0 386858 73853   0   0   0   0    0   0   6 53756 396 99  1  0  0  0.94 375.0 03:33:57
11  0 386954 73757   0   0   0   0    0   0   7 57413 417 99  1  0  0  0.96 383.5 03:33:58
11  0 386563 74148   0   0   0   0    0   0   7 57306 419 99  1  0  0  0.96 385.5 03:33:59
11  0 386563 74148   0   0   0   0    0   0   4 55254 411 99  1  0  0  0.97 386.9 03:34:00
11  0 386563 74148   0   0   0   0    0   0   1 55580 392 99  1  0  0  0.96 385.9 03:34:01
11  0 386563 74148   0   0   0   0    0   0   1 56865 399 99  1  0  0  0.97 388.7 03:34:02
11  0 386563 74148   0   0   0   0    0   0   0 44302 395 99  1  0  0  0.69 277.9 03:34:03
11  0 386563 74148   0   0   0   0    0   0   0 35053 392 99  1  0  0  0.58 233.7 03:34:04
11  0 386563 74148   0   0   0   0    0   0   2 31307 391 99  1  0  0  0.53 212.8 03:34:05
11  0 386563 74148   0   0   0   0    0   0   1 30265 392 99  1  0  0  0.52 206.4 03:34:06
11  0 386563 74148   0   0   0   0    0   0   0 29335 396 99  1  0  0  0.49 197.7 03:34:07
11  0 386563 74148   0   0   0   0    0   0   2 28749 393 99  1  0  0  0.49 196.4 03:34:08
11  0 386563 74148   0   0   0   0    0   0  12 28251 420 99  1  0  0  0.48 194.0 03:34:09
11  0 386563 74148   0   0   0   0    0   0   0 28254 402 99  1  0  0  0.49 195.0 03:34:10
11  0 386563 74148   0   0   0   0    0   0  12 28124 395 99  1  0  0  0.48 193.9 03:34:11
11  0 386563 74148   0   0   0   0    0   0   0 28470 395 99  1  0  0  0.49 194.8 03:34:12
11  0 386563 74148   0   0   0   0    0   0   0 28253 401 99  1  0  0  0.49 195.4 03:34:13
11  0 386563 74148   0   0   0   0    0   0   9 28099 397 99  1  0  0  0.49 195.1 03:34:14
11  0 386563 74148   0   0   0   0    0   0   3 28000 391 99  1  0  0  0.49 194.0 03:34:15
kthr    memory              page              faults              cpu             time  
----- ----------- ------------------------ ------------ ----------------------- --------
 r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa    pc    ec hr mi se
11  0 386563 74148   0   0   0   0    0   0   3 28546 390 99  1  0  0  0.49 195.6 03:34:16
11  0 386563 74148   0   0   0   0    0   0   3 28851 391 99  1  0  0  0.49 197.2 03:34:17
11  0 386563 74148   0   0   0   0    0   0   4 28410 406 99  1  0  0  0.49 194.5 03:34:18
11  0 386563 74148   0   0   0   0    0   0   5 27961 400 99  1  0  0  0.49 195.9 03:34:19
```

## 3つのLPARに負荷

さらに、LPAR3でも負荷を高めると、1CPUのプールを3つのLPARで等分しますので、右から３列目のpcの列が0.33あたりになります。
与えられた0.33コアの処理能力をフルに使っていますので、usの値が99%というのはここでも変わりません。

```:LPAR1のvmstatの出力
11  0 386953 73758   0   0   0   0    0   0  14 29506 409 99  1  0  0  0.49 194.4 03:35:11
11  0 386564 74147   0   0   0   0    0   0   4 28281 397 99  1  0  0  0.49 194.1 03:35:12
11  0 386564 74147   0   0   0   0    0   0   0 28204 389 99  1  0  0  0.48 193.2 03:35:13
11  0 386564 74147   0   0   0   0    0   0   3 28710 392 99  1  0  0  0.49 195.4 03:35:14
11  0 386564 74147   0   0   0   0    0   0   0 28637 390 99  1  0  0  0.48 193.9 03:35:15
kthr    memory              page              faults              cpu             time  
----- ----------- ------------------------ ------------ ----------------------- --------
 r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa    pc    ec hr mi se
11  0 386564 74147   0   0   0   0    0   0   3 27854 383 99  1  0  0  0.49 196.5 03:35:16
11  0 386564 74147   0   0   0   0    0   0   1 28080 394 99  1  0  0  0.49 195.8 03:35:17
11  0 386564 74147   0   0   0   0    0   0   1 27881 394 99  1  0  0  0.48 193.6 03:35:18
11  0 386564 74147   0   0   0   0    0   0   1 28269 396 99  1  0  0  0.49 196.6 03:35:19
11  0 386564 74147   0   0   0   0    0   0   0 28528 400 99  1  0  0  0.47 188.0 03:35:20
11  0 386564 74147   0   0   0   0    0   0   2 21353 385 99  1  0  0  0.35 141.0 03:35:21
11  0 386564 74147   0   0   0   0    0   0   1 18715 387 99  1  0  0  0.32 127.2 03:35:22
11  0 386564 74147   0   0   0   0    0   0   1 19157 391 99  1  0  0  0.33 133.4 03:35:23
11  0 386564 74147   0   0   0   0    0   0   2 21815 438 99  1  0  0  0.33 131.7 03:35:25
11  0 386564 74147   0   0   0   0    0   0   4 19497 386 99  1  0  0  0.34 135.2 03:35:26
11  0 386564 74147   0   0   0   0    0   0  21 19625 482 99  1  0  0  0.34 135.7 03:35:27
11  0 386564 74147   0   0   0   0    0   0  14 20103 396 99  1  0  0  0.34 136.8 03:35:28
11  0 386564 74147   0   0   0   0    0   0   0 20030 390 99  1  0  0  0.34 135.9 03:35:29
10  0 386564 74147   0   0   0   0    0   0   0 19866 380 99  1  0  0  0.34 136.3 03:35:30
^C# 

```

## 条件を変えてみる
LPAR4を削除し、割り当てCPUをLPAR1=0.5, LPAR2=0.25, LPAR3=0.25にした場合、下記の挙動となりました。

- LPAR1だけに負荷 -> LPAR1が約1.0コアを取得する。
- LPAR1とLPAR2に負荷 -> LPAR1とLPAR2が約0.5コアずつ取得する。
- LPAR1、LPAR2、LPAR3に負荷 -> LPAR1が約0.5コア, LPAR2が約0.25コア, LPAR3が約0.25コアを取得する。

トータルのCPUコア数に上限を設けることで、複数LPARでコア数課金のソフトウェアを使う際のライセンスを安くできる可能性のあるShared Processor Pool機能のご紹介でした。

以上