Oracle Cloud "Always Free" の Compute oCPU 1/8 をどうやって実現しているのか、推測してみる。
- 1. Oracle Cloud の Always Free について
- 2. /proc/cpuinfo の結果
- 3. vmstat と mpstat を流しながら yes > /dev/null で CPUをぶん回す
- 4. KVM の CPU割当時間制御(vcpu_period と vcpu_quota)
- 5. まとめ
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インスタンスの下記記述彡(゚)(゚)
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スレッド分、割り当てているもよう彡(゚)(゚)
$ 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 みたい。
$ 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 をぶん回してみます。
$ yes > /dev/null
vmstatログは下記の通り、yes > /dev/null 実行タイミング で st値 が上がってますやね~。
$ 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 の値が上がってます。
$ 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が来ません。