Energy Estimation for Virtual Servers Using Resource Utilization and Machine Learning
Organizations: The Climate and Environmental Institute NILU , Postboks 100, 2027 Kjeller, Norway
Abstract
Estimating the energy use of virtual servers is difficult because physical power interfaces and privileged host counters are typically accessible only on the underlying physical host. We investigate a machine learning approach that predicts the CPU-package power attributable to an individual virtual server from system and performance metrics observable within that virtual server itself. During training, host-side RAPL measurements provide the power target used to learn this mapping, while deployed inference requires only measurements available within the virtual server. We evaluate the approach across heterogeneous CPU platforms, multiple workload families, unseen workloads and hardware, concurrent workload combinations, and varying resource allocations using temporally blocked evaluation. Prediction is generally strong when deployment conditions are represented during training, while zero-shot transfer to unseen workloads, hardware, and configurations is less reliable. A pooled multi-platform model retains good performance when target platforms are represented during training, and pooled multi-configuration modeling performs well across different processor and memory allocations. Feature-importance analysis reveals interpretable resource signatures consistent with workload behavior across CPU, memory, storage, and network activity. Monitoring and inference add little direct CPU-power overhead. The results support practical virtual server power estimation when training data cover the intended deployment domain.
Figures & tables
| Set | Feature set | Features |
| F1 | Basic | cpu.total mem.used diskio.vda.read_bytes_rate_per_sec diskio.vda.write_bytes_rate_per_sec network.enp1s0.bytes_recv_rate_per_sec network.enp1s0.bytes_sent_rate_per_sec |
| F2 | Basic + CPU performance | F1 + perf.cycles_per_sec perf.instructions_per_sec perf.ref_cycles_per_sec perf.ipc |
| F3 | Basic + memory performance | F1 + perf.dram_read_bytes_est_per_sec perf.l3_load_misses_per_sec perf.loads_per_sec |
| F4 | Basic + I/O performance | F1 + perf.block_rq_issue_per_sec perf.block_rq_complete_per_sec perf.net_dev_xmit_per_sec perf.netif_receive_skb_per_sec |
| F5 | All | Union of F1–F4 |
| Platform | Workload | MAE | RMSE | NMAE | |
| (W) | (W) | (%) | |||
| E3-1270 v6 | kernelcomp | 0.985 | 0.609 | 1.682 | 1.97 |
| E3-1270 v6 | apache | 0.936 | 2.688 | 3.877 | 10.30 |
| E3-1270 v6 | pgbench | 0.857 | 1.853 | 3.233 | 5.93 |
| E3-1270 v6 | iperf3 | 0.932 | 1.661 | 2.555 | 15.52 |
| E-2286G | kernelcomp | 0.961 | 2.450 | 3.900 | 5.58 |
| Platform | kernelcomp | Apache | pgbench | iperf3 |
| E3-1270 v6 | 0.914 | 0.630 | 0.493 | 0.130 |
| E-2286G | 0.442 | 0.661 | -1.153 | -2.351 |
| Xeon 6527P | 0.756 | 0.738 | 0.751 | 0.208 |
| EPYC 4245P | 0.709 | 0.558 | 0.515 | -1.395 |
| EPYC 7443P | 0.053 | 0.153 | -1.331 | 0.516 |
| Platform | kernelcomp | Apache | pgbench | iperf3 |
| E3-1270 v6 | -0.071 | -0.306 | -0.364 | -0.802 |
| E-2286G | -0.519 | -0.284 | -1.939 | -3.267 |
| Xeon 6527P | -0.196 | -0.149 | -0.169 | -0.526 |
| EPYC 4245P | -0.261 | -0.401 | -0.367 | -2.250 |
| EPYC 7443P | -0.914 | -0.783 | -2.266 | -0.349 |
| Held-out platform | MAE (W) | RMSE (W) | NMAE (%) | |
| E3-1270 v6 | 0.566 | 7.614 | 10.087 | 31.62 |
| E-2286G | 0.468 | 14.526 | 18.151 | 40.51 |
| Xeon 6527P | -0.373 | 7.737 | 10.914 | 39.53 |
| EPYC 4245P | 0.774 | 7.254 | 9.401 | 22.88 |
| EPYC 7443P | 0.625 | 5.761 | 7.114 | 25.61 |
| Platform | MAE (W) | RMSE (W) | NMAE (%) | |
| All platforms | 0.890 | 3.858 | 5.835 | 13.87 |
| E3-1270 v6 | 0.889 | 3.496 | 4.966 | 14.16 |
| E-2286G | 0.862 | 6.495 | 9.027 | 17.68 |
| Xeon 6527P | 0.546 | 3.833 | 5.776 | 18.71 |
| EPYC 4245P | 0.952 | 2.675 | 4.000 | 8.02 |
| EPYC 7443P | 0.856 | 2.970 | 4.147 | 12.70 |
| Workload mix | (%) | |||
| Apache+pgbench | 0.859 | -0.178 | -1.037 | 8.77 |
| kernelcomp+Apache | 0.951 | 0.845 | -0.107 | 6.66 |
| kernelcomp+iperf3 | 0.959 | 0.802 | -0.157 | 11.12 |
| kernelcomp+pgbench | 0.756 | 0.487 | -0.269 | 3.70 |
| Configuration | ||||
| 2 vCPU, 8 GB | 0.935 | 0.453 | -0.482 | 0.916 |
| 4 vCPU, 4 GB | 0.969 | 0.747 | -0.223 | 0.932 |
| 4 vCPU, 8 GB | 0.973 | – | – | 0.960 |
| 4 vCPU, 16 GB | 0.965 | 0.918 | -0.047 | 0.943 |
| 8 vCPU, 8 GB | 0.964 | 0.816 | -0.148 | 0.957 |
| Platform | (W) | (Wh) | Progress (%) | /action (%) |
| E3-1270 v6 | 0.071 | 0.0059 | -4.00 | 4.41 |
| E-2286G | 0.097 | 0.0080 | -4.23 | 4.55 |
| Xeon 6527P | 0.319 | 0.0266 | -1.01 | 1.45 |
| EPYC 4245P | 0.326 | 0.0272 | -1.10 | 1.60 |
| EPYC 4345P | -0.744 | -0.0620 | -2.66 | 1.74 |
| EPYC 7443P | -0.367 | -0.0306 | -6.25 | 6.34 |
| Study | Prediction target | Guest-only inference | Runtime host / hypervisor access | Hardware diversity | Transfer / generalization | Concurrent / VM-config. evaluation |
| Joulemeter [10] | VM power | No | Yes | Multiple production servers | Not primary focus | No |
| VMeter [12] | VM and host power | No | Yes | Single experimental platform | Multiple workloads | No |
| CloudMonitor [13] | Server power | No | Calibration / provider-side | Hardware-specific calibration | Limited | No |
| Povoa et al. [14] | Whole-system power | No | OS/system access | Multiple hardware configurations | Cross-hardware modeling | No |
| Veni and Bhanu [16] | VM power | No | Performance-counter access | Limited | Multiple workloads | No |
| Present work | VM-associated CPU-package power | Yes, after training | Training only | Six Intel/AMD platforms | Workload and hardware transfer | Yes |
| Study | Input features / families | Reported prediction performance |
| Joulemeter [10] | CPU utilization and power states, memory activity, disk I/O; optional cache counters | Approximately 1–3 W error in reported multi-VM power-estimation experiments. |
| VMeter [12] | CPU, cache, disk, and DRAM resource-activity counters | 93% mean and 94% median prediction accuracy against external power measurements. |
| CloudMonitor [13] | CPU, memory, disk, and network utilization | 3.91% average prediction error on the evaluated server configuration. |
| Povoa et al. [14] | OS resource counters for CPU, memory, disk I/O, and network activity | Best reported result: 99.94% accuracy and 6.32 W error. |
| Veni and Bhanu [16] | Hardware PMCs (CPU cycles, DRAM accesses, instruction-cache fetches, LLC misses); disk I/O statistics | 91–92% reported prediction accuracy using nonlinear SVR across benchmark workloads. |
| Present work | Guest CPU, memory, disk and network metrics; virtualized CPU and I/O performance counters | Pooled multi-platform: , MAE W, NMAE ; best within-platform: , MAE W, NMAE . |
| Attribute | Intel Xeon E3-1270 v6 | Intel Xeon E-2286G | Intel Xeon 6527P | AMD EPYC 4245P | AMD EPYC 4345P | AMD EPYC 7443P |
| Microarchitecture / generation | Kaby Lake / Xeon E3-1200 v6 | Coffee Lake / Xeon E-2200 | Granite Rapids-SP / Xeon 6 | Zen 5 / EPYC 4005 | Zen 5 / EPYC 4005 | Zen 3 / EPYC 7003 (Milan) |
| Sockets | 1 | 1 | 1 | 1 | 1 | 1 |
| Cores / threads | 4 / 8 | 6 / 12 | 24 / 48 | 6 / 12 | 8 / 16 | 24 / 48 |
| Base / max frequency | 3.8 / 4.2 GHz | 4.0 / 4.9 GHz | 3.0 / 4.2 GHz | 3.9 / 5.484 GHz | 3.8 / 5.581 GHz | 2.8 GHz |
| Host memory | 32 GB DDR4-2400 ECC, 2 16 GB Micron | 32 GB DDR4-2667 ECC, 2 16 GB Micron | 256 GB DDR5-6400 ECC, 8 32 GB Micron | 32 GB DDR5-5600 ECC, 2 16 GB Micron | 64 GB DDR5-5200 ECC, 2 32 GB Micron | 256 GB DDR4-3200 ECC, 8 32 GB |
| Storage | 2 240 GB SATA SSD | 2 960 GB SATA SSD | 2 1.92 TB NVMe SSD | 2 960 GB NVMe SSD | 2 1.92 TB NVMe SSD | 2 480 GB SAS SSD |
| Set | Model feature | Source | Meaning / construction | Unit |
| F1 | cpu.total | Glances | Total CPU utilization observed inside the guest VM. | % |
| F1 | mem.used | Glances | Guest memory currently in use. | bytes |
| F1 | diskio.vda.read_bytes_rate_per_sec | Glances | Read throughput of the guest virtual block device vda. | bytes/s |
| F1 | diskio.vda.write_bytes_rate_per_sec | Glances | Write throughput of the guest virtual block device vda. | bytes/s |
| F1 | network.enp1s0.bytes_recv_rate_per_sec | Glances | Guest network receive throughput on interface enp1s0. | bytes/s |
| F1 | network.enp1s0.bytes_sent_rate_per_sec | Glances | Guest network transmit throughput on interface enp1s0. | bytes/s |
| Platform | Derived model feature | Raw perf event(s) | Construction / interpretation |
| Intel | perf.dram_read_bytes_est_per_sec | offcore_requests.l3_miss_demand_data_rd | Demand-data reads that miss the LLC are converted to a rate and multiplied by 64 bytes per cache line to obtain an estimated DRAM-read traffic rate. |
| Intel | perf.l3_load_misses_per_sec | mem_load_retired.l3_miss | Retired load instructions missing the L3 cache, divided by the measured perf interval. |
| Intel | perf.loads_per_sec | mem_inst_retired.all_loads | Retired load instructions divided by the measured perf interval. |
| AMD EPYC 4245P / 4345P | perf.sys_dram_io_fills_per_sec | ls_dmnd_fills_from_sys.dram_io_all | System demand fills serviced through DRAM I/O, divided by the measured perf interval. |
| AMD EPYC 7443P | perf.sys_dram_io_fills_per_sec | ls_dmnd_fills_from_sys.mem_io_local + ls_dmnd_fills_from_sys.mem_io_remote | Local and remote system-memory demand fills are summed and divided by the measured perf interval to form the same AMD derived feature. |
| AMD | perf.loads_dispatched_per_sec | ls_dispatch.ld_dispatch | Dispatched load operations divided by the measured perf interval. |
| Attribute | Configuration |
| Guest OS | Ubuntu 26.04 LTS |
| Kernel | Linux 7.0.0 |
| Architecture | x86-64 |
| Virtualization | KVM |
| Virtual hardware model | QEMU Q35 / ICH9 |
| Virtual disk | 100 GB |
| Platform | kernelcomp | Apache | pgbench | iperf3 | Pooled |
| Intel Xeon E3-1270 v6 | 0.846 | 0.846 | 0.838 | 0.809 | 0.811 |
| Intel Xeon E-2286G | 0.939 | 0.868 | 0.681 | 0.711 | 0.762 |
| Intel Xeon 6527P | 0.892 | 0.918 | 0.922 | 0.554 | 0.907 |
| AMD EPYC 4245P | 0.888 | 0.771 | 0.862 | 0.885 | 0.874 |
| AMD EPYC 7443P | 0.964 | 0.914 | 0.889 | 0.824 | 0.836 |
| Mean | 0.906 | 0.863 | 0.838 | 0.757 | 0.838 |
| Workload | Rank | Feature | |
| kernelcomp | 1 | perf.ref_cycles_per_sec | 0.751 |
| 2 | cpu.total | 0.155 | |
| 3 | perf.loads_per_sec | 0.070 | |
| 4 | perf.cycles_per_sec | 0.051 | |
| 5 | perf.instructions_per_sec | 0.006 | |
| Apache | 1 | perf.cycles_per_sec | 0.754 |
| Workload | Rank | Feature | |
| kernelcomp | 1 | cpu.total | 0.308 |
| 2 | perf.ref_cycles_per_sec | 0.140 | |
| 3 | perf.dram_read_bytes_est_per_sec | 0.066 | |
| 4 | perf.loads_per_sec | 0.019 | |
| 5 | mem.used | 0.015 | |
| Apache | 1 | network.enp1s0.bytes_recv_rate_per_sec | 0.401 |
| Workload | Rank | Feature | |
| kernelcomp | 1 | cpu.total | 0.218 |
| 2 | perf.l3_load_misses_per_sec | 0.147 | |
| 3 | perf.cycles_per_sec | 0.132 | |
| 4 | mem.used | 0.048 | |
| 5 | perf.loads_per_sec | 0.038 | |
| Apache | 1 | perf.cycles_per_sec | 0.354 |
| Workload | Rank | Feature | |
| kernelcomp | 1 | perf.cycles_per_sec | 0.178 |
| 2 | perf.ref_cycles_per_sec | 0.140 | |
| 3 | cpu.total | 0.112 | |
| 4 | perf.loads_dispatched_per_sec | 0.079 | |
| 5 | perf.instructions_per_sec | 0.029 | |
| Apache | 1 | network.enp1s0.bytes_recv_rate_per_sec | 0.691 |
| Workload | Rank | Feature | |
| kernelcomp | 1 | perf.loads_dispatched_per_sec | 0.302 |
| 2 | perf.cycles_per_sec | 0.282 | |
| 3 | cpu.total | 0.121 | |
| 4 | perf.sys_dram_io_fills_per_sec | 0.086 | |
| 5 | mem.used | 0.015 | |
| Apache | 1 | network.enp1s0.bytes_recv_rate_per_sec | 0.359 |
| Held-out platform | Workload | MAE | RMSE | NMAE | Bias | ||
| (W) | (W) | (%) | (W) | ||||
| E3-1270 v6 | kernelcomp | 0.838 | 5.394 | 5.749 | 17.58 | 2.238 | 10947 |
| Apache | 0.822 | 5.430 | 6.712 | 21.29 | -0.746 | 10933 | |
| pgbench | -1.431 | 14.128 | 15.974 | 46.67 | 13.754 | 11094 | |
| iperf3 | 0.293 | 5.499 | 8.528 | 53.25 | 3.065 | 11387 | |
| E-2286G | kernelcomp | 0.385 | 14.174 | 16.566 | 32.72 | -13.936 | 10825 |
| Platform | Workload | F1 | F2 | F3 | F4 | F5 |
| E3-1270 v6 | kernelcomp | 0.960 | 0.984 | 0.984 | 0.962 | 0.985 |
| Apache | 0.877 | 0.932 | 0.927 | 0.879 | 0.936 | |
| pgbench | 0.649 | 0.861 | 0.861 | 0.806 | 0.857 | |
| E-2286G | kernelcomp | 0.927 | 0.959 | 0.959 | 0.934 | 0.961 |
| Apache | 0.899 | 0.942 | 0.935 | 0.901 | 0.945 | |
| pgbench | 0.693 | 0.789 | 0.787 | 0.738 | 0.786 |
| Pair | OFF (W) | ON (W) | (W) | (%) |
| R01 | 42.793 | 42.965 | +0.173 | +0.404 |
| R02 | 42.852 | 42.920 | +0.068 | +0.158 |
| R03 | 42.765 | 42.820 | +0.056 | +0.130 |
| Mean | 42.803 | 42.902 | +0.099 | +0.231 |
| 95% CI (paired difference) | ||||
| Metric | Mean | Median | P95 |
| F5 feature assembly (ms) | 0.451 | 0.439 | 0.473 |
| GBR prediction (ms) | 1.370 | 1.247 | 2.351 |
| Observation age (ms) | 1544 | 1544 | 1732 |