Oracle Cloud "Always Free" の Compute oCPU 1/8 をどうやって実現しているのか、推測してみる。

# 1. Oracle Cloud の Always Free について

OOW 2019(Oracle OpenWorld 2019) で Always Free という Oracle Cloud の新しいトライアルサービスが発表されました。

> New Always Free Services
> https://www.oracle.com/cloud/free/
> 
>［速報］Oracle Cloudを期限なく無料で使える「Always Free」発表。1GBのVM2つ、Autonomous Database 2つなど提供。Oracle OpenWorld 2019
> https://www.publickey1.jp/blog/19/oracle_cloudalways_free1gbvm2autonomous_database_2oracle_openworld_2019.html
> 
> Oracle Cloudを期限なく無料で使える「Always Free」発表　1GBのVM2つ、Autonomous DB2つなど提供
> https://www.itmedia.co.jp/news/articles/1909/17/news076.html

サービスの詳細は公式や各種記事に譲るとして、本記事でフォーカスするのは Computeインスタンスの下記記述彡(ﾟ)(ﾟ)

```shell

Compute 2 virtual machines with 1/8 OCPU and 1 GB memory each.
```

1/8 oCPU って？？？という訳で、某所でお借りした Always Free の Computeインスタンス(OEL 7.7)を調べてみるやで。

# 2. /proc/cpuinfo の結果

/proc/cpuinfo の結果は下記の通り、AMD EPYC 7551 の 論理CPU を 2スレッド分、割り当てているもよう彡(ﾟ)(ﾟ)

```shell
$ cat /proc/cpuinfo
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 23
model           : 1
model name      : AMD EPYC 7551 32-Core Processor
stepping        : 2
microcode       : 0x1000065
cpu MHz         : 1996.248
cache size      : 512 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl xtopology cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibpb vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 virt_ssbd arat
bugs            : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips        : 3992.49
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : AuthenticAMD
cpu family      : 23
model           : 1
model name      : AMD EPYC 7551 32-Core Processor
stepping        : 2
microcode       : 0x1000065
cpu MHz         : 1996.248
cache size      : 512 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 1
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl xtopology cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibpb vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 virt_ssbd arat
bugs            : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips        : 3992.49
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:
```

仮想化方式は KVM みたい。

```shell
$ dmesg | grep -i virtual
[    0.000000] Booting paravirtualized kernel on KVM
[    1.827450] input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input4
[    1.878451] input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input3
[    2.286858] systemd[1]: Detected virtualization kvm.
```
# 3. vmstat と mpstat を流しながら yes > /dev/null で CPUをぶん回す

下記コマンドで CPU をぶん回してみます。

```shell
$ yes > /dev/null
```

vmstatログは下記の通り、yes > /dev/null 実行タイミング で st値 が上がってますやね～。

```shell
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0   4876 274120   2896 412016    0    0     0     0  134  245  0  0 88  0 12
 0  0   4876 274120   2896 412016    0    0     0     0  131  239  0  0 93  0  7
 0  0   4876 274120   2896 412016    0    0     0     0  155  284  0  0 98  0  2
 0  0   4876 274120   2896 412016    0    0     0     0  151  261  0  0 95  0  4
 0  0   4876 274120   2896 412016    0    0     0     0  147  260  0  0 96  0  4
 1  0   4876 274152   2896 412016    0    0     0     0  151  262  0  0 92  0  8
 0  0   4876 274152   2896 412016    0    0     0     0  150  270  0  0 91  0  9
 0  0   4876 274152   2896 412016    0    0     0     0  165  293  0  0 95  0  5
 2  0   4876 273928   2896 412024    0    0     8     0  713  200 14  1 56  0 29 ★ここから yes > /dev/null
 3  0   4876 273928   2896 412024    0    0     0     0  846  208 15  5 31  0 50 ★ここから yes > /dev/null
 3  0   4876 273960   2896 412032    0    0     0     0  865  136 16  4 33  0 47 ★ここから yes > /dev/null
 1  0   4876 273960   2896 412032    0    0     0     0  962  130 17  3 33  0 47 ★ここから yes > /dev/null
 2  0   4876 273960   2896 412032    0    0     0     0  888  184 16  4 32  0 48 ★ここから yes > /dev/null
 1  0   4876 273960   2896 412032    0    0     0     0  823  142 15  5 29  0 51 ★ここから yes > /dev/null
 1  0   4876 273960   2896 412032    0    0     0    20  877  177 17  5 25  0 53 ★ここから yes > /dev/null
 3  0   4876 273992   2896 412032    0    0     0     0  902  128 16  4 31  0 49 ★ここから yes > /dev/null
 1  0   4876 273992   2896 412032    0    0     0     0  894  160 19  3 28  0 51 ★ここから yes > /dev/null
：
```

mpstatログは下記の通り、やはり yes > /dev/null 実行タイミング で %steal の値が上がってます。

```shell
$ mpstat 1 -P ALL
:
03:27:07 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:27:08 PM  all    0.49    0.00    0.00    0.00    0.00    0.00    1.97    0.00    0.00   97.54
03:27:08 PM    0    0.00    0.00    0.00    0.00    0.00    0.00    2.00    0.00    0.00   98.00
03:27:08 PM    1    0.00    0.00    0.00    0.00    0.00    0.00    1.98    0.00    0.00   98.02

03:27:08 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:27:09 PM  all    9.61    0.00    0.87    0.00    0.00    0.00   20.09    0.00    0.00   69.43
03:27:09 PM    0   22.55    0.00    0.00    0.00    0.00    0.00   20.59    0.00    0.00   56.86
03:27:09 PM    1    0.00    0.00    1.56    0.00    0.00    0.00   18.75    0.00    0.00   79.69

03:27:09 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle ★ここから yes > /dev/null
03:27:10 PM  all   15.56    0.00    3.89    0.00    0.00    0.00   48.25    0.00    0.00   32.30 ★ここから yes > /dev/null
03:27:10 PM    0   20.80    0.00    4.80    0.00    0.00    0.00   51.20    0.00    0.00   23.20 ★ここから yes > /dev/null
03:27:10 PM    1   10.69    0.00    3.05    0.00    0.00    0.00   45.80    0.00    0.00   40.46 ★ここから yes > /dev/null

03:27:10 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle ★ここから yes > /dev/null
03:27:11 PM  all   16.26    0.00    3.66    0.00    0.00    0.00   47.97    0.00    0.00   32.11 ★ここから yes > /dev/null
03:27:11 PM    0   23.21    0.00    3.57    0.00    0.00    0.00   51.79    0.00    0.00   21.43 ★ここから yes > /dev/null
03:27:11 PM    1   10.29    0.00    4.41    0.00    0.00    0.00   44.12    0.00    0.00   41.18 ★ここから yes > /dev/null

03:27:11 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle ★ここから yes > /dev/null
03:27:12 PM  all   16.06    0.00    3.61    0.00    0.00    0.00   47.79    0.00    0.00   32.53 ★ここから yes > /dev/null
03:27:12 PM    0   29.36    0.00    2.75    0.00    0.00    0.00   55.05    0.00    0.00   12.84 ★ここから yes > /dev/null
03:27:12 PM    1    5.04    0.00    4.32    0.00    0.00    0.00   43.17    0.00    0.00   47.48 ★ここから yes > /dev/null
:
```

%steal の値が上昇するということは、仮想化レイヤでGuest OSに割り当てているCPUに何かしらの制御が入ってるということ彡(ﾟ)(ﾟ)

# 4. KVM の CPU割当時間制御（vcpu_period と vcpu_quota）

KVM の CPU割当時間制御 は 下記を参考にしました。

 > KVM CPUのリソース制限
 > http://kt-hiro.hatenablog.com/entry/20180715/1531606948
 > :
 > vcpu_period の期間内で「CPU処理時間の合計」> vcpu_quota となると、それ以上はCPU処理時間が割り当てられなくなる。
 > CPU処理時間は仮想CPU全体で合計されるため、period < quota となる場合もある。
 > :
 > 
 > 20.43. スケジュールパラメーターの設定
 > https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html-single/virtualization_deployment_and_administration_guide/index#sect-Managing_guest_virtual_machines_with_virsh-Setting_schedule_parameters
 > :
 > vcpu_period:cpu.cfs_period_us
 > vcpu_quota:cpu.cfs_quota_us
 > :

1Core = 2CPU Thread の環境で 1秒間全CPUスレッド を占有すると、quota は 2,000,000μs になる計算です。

推測なんですが、1/8 oCPU は 2スレッド分を丸々占有した CPU時間の 1/8、
vcpu_period=1,000,000, vcpu_quota=250,000 (または同一比の数値) を
KVM側で設定して、制御しているんかと予測彡(ﾟ)(ﾟ)

# 5. まとめ

Oracle Cloud の Always Free最高や！彡(^)(^)
皆さん、Always Free で どんどん Oracle Cloud を触ってみて下さいね。

 > New Always Free Services
 > https://www.oracle.com/cloud/free/
 > 注意事項：携帯番号は 日本は (+81) をつけて 9012345678 と入力します。
 > ※最初の「0」は必ず省きます。省かないと認証のSMSが来ません。