Introduction
Oracle Database Appliance now fully supports virtualization with KVM, and this could be interesting for some of us. If you’re using Enterprise Edition, you probably decreased the number of cores to comply with your licenses. Now you can increase your core configuration with more cores, some being dedicated to your databases, and some for user-managed VMs. Let’s find out how you can migrate from bare-metal core allocation to CPU pools and discover the possibilities of this feature.
Updated the 1st of July, 2022: it looks like Bare-Metal CPU pools ARE NOT considered as hard-partitioning with Enterprise Edition. It means that despite using them for your Bare-Metal databases, all the enabled cores on your ODA need to be licensed. Those used for Bare-Metal CPU pools but also those remaining on the system, even if they are dedicated to VMs, and never used for your databases. The only supported mode for hard-partitioning is databases in DB Systems only, or core reduction according to your license on your ODA if you need Bare-Metal databases.
3 kinds of CPU pool
CPU pools are of 3 types on ODA:
- Bare-Metal: these are CPU pools you can associate with Bare-Metal databases (must be licensed)
- DB Systems: these are CPU pools you can associate with your DB Systems (must be licensed)
- user-managed VMs: these are CPU pools for your multi-purpose VMs that don’t require any Oracle Database license
You can define multiple CPU pools of each kind, or none on your ODA.
This CPU pool configuration comes on top of your CPU core configuration. Previously, the only way to match your license with your ODA was to decrease the number of cores available on your system with odacli update-cpucore. Now it is much more flexible.
Configuration without using CPU pools
Without using CPU pools, on Enterprise Edition, core reduction is needed to match your licenses. For example, for 2 EE licenses on my ODA X8-2M, I need to lower my cores available to 4 after deployment:
odacli describe-cpucore
Node Cores Modified Job Status
----- ------ ---------------------------------- ---------------
0 32 February 17, 2022 1:55:24 PM CET CONFIGURED
lscpu | grep MHz
CPU MHz: 2799.817
CPU max MHz: 3900.0000
CPU min MHz: 1000.0000
odacli update-cpucore -c 4
Modifying the enabled number of CPU requires a reboot of all nodes in the ODA system. Are you sure you want to proceed with this operation? (Y/N): Y
After the reboot, check new core configuration and CPU speed:
odacli describe-cpucore
Node Cores Modified Job Status
----- ------ ---------------------------------- ---------------
0 4 February 18, 2022 4:05:44 PM CET CONFIGURED
lscpu | grep MHz
CPU MHz: 3899.943
CPU max MHz: 3900.0000
CPU min MHz: 1000.0000
As I already told you in another blog post, reducing the cores is giving more speed thanks to Turbo Boost. With only a few cores enabled, you can expect full speed from your Xeons.
Increase core configuration
On my ODA configured with 4 cores, I will first increase the number of cores on the server. I want to keep only 4 cores for databases according to my license.
odacli update-cpucore -c 8
Modifying the enabled number of CPU requires a reboot of all nodes in the ODA system. Are you sure you want to proceed with this operation? (Y/N): Y
Let’s check configuration and CPU speed after the reboot:
odacli describe-cpucore
Node Cores Modified Job Status
----- ------ ---------------------------------- ---------------
0 8 February 18, 2022 4:25:11 PM CET CONFIGURED
lscpu | grep MHz
CPU MHz: 3685.555
CPU max MHz: 3900.0000
CPU min MHz: 1000.0000
As expected, my cores are running a little bit slower. Note that you’re not supposed to decrease the core numbers. You are only allowed to increase them after initial configuration. And according to your license, this sounds obvious.
Configuring and playing with the CPU pools
Now let’s create a CPU pool for bare metal databases:
odacli create-cpupool -n cpupool4BM -c 4 -bm
odacli describe-job -i a818a597-a60a-4824-a8e3-85c53d3087e6 | grep Status:
Status: Success
And let’s associate this CPU pool to all my bare metal databases:
odacli list-databases
ID DB Name DB Type DB Version CDB Class Shape Storage Status DbHomeID
---------------------------------------- ---------- -------- -------------------- ---------- -------- -------- ---------- ------------ ----------------------------------------
42656d90-e18e-4325-a69a-13d3a6b58710 DBITST SI 19.13.0.0.211019 true OLTP odb1 ASM CONFIGURED 5e7a146a-c18d-427b-a206-e532ec9907cf
a2193c80-d004-4295-847e-ec8277952bd7 DBTAG38 SI 19.13.0.0.211019 false OLTP odb1 ASM CONFIGURED 5e7a146a-c18d-427b-a206-e532ec9907cf
odacli modify-database -i 42656d90-e18e-4325-a69a-13d3a6b58710 -cp cpupool4BM
DB will be restarted as part of CPU Pool operation. Do you want to continue [y/n]:y
odacli describe-job -i ef4c6aff-c0e2-4493-9500-c3069559157e | grep Status:
Status: Success
odacli modify-database -i a2193c80-d004-4295-847e-ec8277952bd7 -cp cpupool4BM
DB will be restarted as part of CPU Pool operation. Do you want to continue [y/n]:y
odacli describe-job -i c5e73921-619f-48dc-92c4-80be97128a23 | grep Status:
Status: Success
Let’s create a CPU pool for user-managed VMs:
odacli create-cpupool -n cpupool4VM -c 4 -vm
odacli list-cpupools
Name Type Configured on Cores Associated resources Created Updated
-------------------- ------------------ ------------------------- ----- ------------------------------ ----------------------- -----------------------
cpupool4VM VM dbi-oda-x8 4 NONE 2022-02-18 16:49:53 CET 2022-02-18 16:49:53 CET
cpupool4BM BM dbi-oda-x8 4 DBITST, DBTAG38 2022-02-18 16:39:39 CET 2022-02-18 16:46:32 CET
Let’s create several VMs in this CPU pool:
odacli create-vmstorage -n VMstore -s 100G
odacli create-vm -n srvapp01 -m 8G -src /opt/dbi/AlmaLinux-8.4-x86_64-dvd.iso -vc 2 -cp cpupool4VM -vn pubnet -vms VMstore -s 16G -g "vnc,listen=10.36.0.241"
odacli create-vm -n srvapp02 -m 8G -src /opt/dbi/AlmaLinux-8.4-x86_64-dvd.iso -vc 2 -cp cpupool4VM -vn pubnet -vms VMstore -s 16G -g "vnc,listen=10.36.0.241"
odacli create-vm -n srvapp03 -m 8G -src /opt/dbi/AlmaLinux-8.4-x86_64-dvd.iso -vc 2 -cp cpupool4VM -vn pubnet -vms VMstore -s 16G -g "vnc,listen=10.36.0.241"
odacli list-vms
Name VM Storage Node Current State Target State Created Updated
-------------------- -------------------- --------------- --------------- --------------- ----------------------- -----------------------
srvapp02 VMstore dbi-oda-x8 ONLINE ONLINE 2022-02-18 16:54:15 CET 2022-02-18 16:54:15 CET
srvapp01 VMstore dbi-oda-x8 ONLINE ONLINE 2022-02-18 16:53:45 CET 2022-02-18 16:53:45 CET
srvapp03 VMstore dbi-oda-x8 ONLINE ONLINE 2022-02-18 16:54:32 CET 2022-02-18 16:54:32 CET
No problem to configure 6 vCPUs on this 4-core CPU pool.
Normally I shouldn’t have enough cores to create a pool for DB Systems, let’s try:
odacli create-cpupool -n cpupool4DBS -c 4 -dbs
odacli describe-job -i c0a27a41-469b-4145-bd1d-2bd770aeb5a7
Job details
----------------------------------------------------------------
ID: c0a27a41-469b-4145-bd1d-2bd770aeb5a7
Description: CPU Pool cpupool4DBS creation
Status: Failure
Created: February 18, 2022 4:55:45 PM CET
Message: DCS-10001:Internal error encountered: Not enough physical CPUs available for CPU Pool 'cpupool4DBS' on node 'dbi-oda-x8'.
Task Name Start Time End Time Status
---------------------------------------- ----------------------------------- ----------------------------------- ----------
Validate CPU Pool doesn't exist February 18, 2022 4:55:45 PM CET February 18, 2022 4:55:45 PM CET Success
Validate NUMA state February 18, 2022 4:55:45 PM CET February 18, 2022 4:55:45 PM CET Success
Create metadata February 18, 2022 4:55:45 PM CET February 18, 2022 4:55:45 PM CET InternalError
Correct. This is not possible.
As I don’t want to add more licenses, let’s decrease cores on bare metal CPU pool. I will share my 2 licenses between BM and DBS:
odacli modify-cpupool -n cpupool4BM -c 2
WARNING: Must restart the following Oracle Databases associated with CPU Pool 'cpupool4BM' for the update to take effect: DBITST,DBTAG38
odacli describe-job -i 259d7fe1-afba-450f-beca-5410a5993160 | grep Status:
Status: Success
odacli create-cpupool -n cpupool4DBS -c 2 -dbs
odacli describe-job -i f595cae9-fc00-4055-89e2-218d12307b06 | grep Status:
Status: Success
I can now create some DB Systems using this CPU pool:
grep pool /opt/dbi/create_dbsystem_srvdb4*.json
/opt/dbi/create_dbsystem_srvdb47.json: "cpuPoolName": "cpupool4DBS",
/opt/dbi/create_dbsystem_srvdb48.json: "cpuPoolName": "cpupool4DBS",
/opt/dbi/create_dbsystem_srvdb49.json: "cpuPoolName": "cpupool4DBS",
odacli create-dbsystem -p /opt/dbi/create_dbsystem_srvdb47.json
odacli create-dbsystem -p /opt/dbi/create_dbsystem_srvdb48.json
odacli create-dbsystem -p /opt/dbi/create_dbsystem_srvdb49.json
odacli list-dbsystems
Name Shape Cores Memory GI version DB version Status Created Updated
-------------------- ---------- ----- ---------- ------------------ ------------------ --------------- ----------------------- -----------------------
srvdb47 odb2 2 16.00 GB 19.13.0.0.211019 19.13.0.0.211019 CONFIGURED 2022-02-22 17:40:42 CET 2022-02-22 18:13:44 CET
srvdb49 odb2 2 16.00 GB 19.13.0.0.211019 19.13.0.0.211019 CONFIGURED 2022-02-22 16:27:54 CET 2022-02-22 16:58:43 CET
srvdb48 odb2 2 16.00 GB 19.13.0.0.211019 19.13.0.0.211019 CONFIGURED 2022-02-22 15:53:25 CET 2022-02-22 16:23:22 CET
odacli list-cpupools
Name Type Configured on Cores Associated resources Created Updated
-------------------- ------------------ ------------------------- ----- ------------------------------ ----------------------- -----------------------
cpupool4VM VM dbi-oda-x8 4 srvapp02, srvapp01, srvapp03 2022-02-18 16:49:53 CET 2022-02-18 16:49:53 CET
cpupool4BM BM dbi-oda-x8 2 DBITST, DBTAG38 2022-02-18 16:39:39 CET 2022-02-18 16:58:21 CET
cpupool4DBS DB_SYSTEM_SHARED dbi-oda-x8 2 srvdb47, srvdb49, srvdb48 2022-02-18 16:59:34 CET 2022-02-18 16:59:34 CET
As you can see, there is no problem configuring multiple DB Systems on a 2-core CPU pool, as there is no problem configuring 10 bare metal databases on a 2-core CPU pool.
Another interesting thing is that you can define multiple CPU pools of each kind. For example, if you want to dedicate cores to specific bare metal databases, you just need to create a new bare metal pool (here I also need to decrease another pool to free up 2 cores – and it will cost me 1 more EE license):
odacli modify-cpupool -n cpupool4VM -c 2
odacli create-cpupool -n cpupool4BMPROD -c 2 -bm
odacli modify-database -i a2193c80-d004-4295-847e-ec8277952bd7 -cp cpupool4BMPROD
odacli list-cpupools
Name Type Configured on Cores Associated resources Created Updated
-------------------- ------------------ ------------------------- ----- ------------------------------ ----------------------- -----------------------
cpupool4VM VM dbi-oda-x8 2 srvapp02, srvapp01, srvapp03 2022-02-18 16:49:53 CET 2022-02-22 18:38:39 CET
cpupool4BMPROD BM dbi-oda-x8 2 DBTAG38 2022-02-22 18:39:20 CET 2022-02-22 18:41:07 CET
cpupool4BM BM dbi-oda-x8 2 DBITST 2022-02-18 16:39:39 CET 2022-02-22 18:41:06 CET
cpupool4DBS DB_SYSTEM_SHARED dbi-oda-x8 2 srvdb47, srvdb49, srvdb48 2022-02-18 16:59:34 CET 2022-02-18 16:59:34 CET
Conclusion
CPU pools are a brilliant addition to ODA. And it works like a charm. As this is still compatible with core reduction, you also benefit from high CPU core speed and load isolation. Bravo!