SmartWatts
SmartWatts is a software-defined power meter based on the PowerAPI toolkit. SmartWatts is a configurable software that can estimate the power consumption of software in real-time. SmartWatts need to receive several metrics provided by hwpc-sensor :
- The Running Average Power Limit (RAPL)
- TSC
- APERF
- MPERF
- CPU_CLK_THREAD_UNHALTED:REF_P
- CPU_CLK_THREAD_UNHALTED:THREAD_P
- LLC_MISSES
- INSTRUCTIONS_RETIRED
These metrics are then used as inputs for a power model that estimate the power
consumption of each software.
The model can derive from the reality, each time the cpu-error-threshold
is
reached it learn a new power model, using the previous reports.
The choice of those specific metrics is motivated in SmartWatts: Self-Calibrating Software-Defined Power Meter for Containers
Installation
You can use the following script to install Smartwatts and HWPC Sensor.
From pypi
pip install smartwatts
From docker
docker pull powerapi/smartwatts-formula
From deb file
Download the .deb
file from the latest
release
Install smartwatts with sudo apt install ./python3-smartwatts_0.8.0-1_all.deb
Quickstart
For running the Smartwatts formula we'll need two things:
- A sensor that provide HWPCReport. We'll use HWPC sensor.
- A configuration for the formula. We provide an example bellow.
{
"verbose": true,
"stream": true,
"input": {
"puller": {
"model": "HWPCReport",
"type": "mongodb",
"uri": "mongodb://127.0.0.1",
"db": "test",
"collection": "prep"
}
},
"output": {
"pusher_power": {
"type": "mongodb",
"uri": "mongodb://127.0.0.1",
"db": "test",
"collection": "prep"
}
},
"cpu-frequency-base": 19,
"cpu-frequency-min": 4,
"cpu-frequency-max": 42,
"cpu-error-threshold": 2.0,
"disable-dram-formula": true,
"sensor-report-sampling-interval": 1000
}
The configuration can depend of your hardware, we provide an auto-configuration script.
Start by installing the hwpc-sensor (see
here) and start it (see
here).
You also need to start an mongodb via the command line docker run -d --name mongo_sw -p 27017:27017 mongo
.
Then run smartwatts
using one of the following command line, depending on
the installation you used:
- via pip :
python -m smartwatts --config-file config_file.json
- via docker
docker run -t --net=host -v $(pwd)/config_file.json:/config_file.json powerapi/smartwatts-formula --config-file /config_file.json
- via deb file :
smartwatts --config-file config_file.json
Your power report will be provided in the influxdb. You can watch them in a grafana using the following tutorial
Auto-config Script
This script detect the frequency of your cpu and use them to provide a configuration file for Smartwatts.
#!/usr/bin/env bash
maxfrequency=$(lscpu -b -p=MAXMHZ | tail -n -1| cut -d , -f 1)
minfrequency=$(lscpu -b -p=MINMHZ | tail -n -1 | cut -d , -f 1)
basefrequency=$(lscpu | grep "Model name" | cut -d @ -f 2 | cut -d G -f 1)
basefrequency=$(expr ${basefrequency}\*1000 | bc | cut -d . -f 1)
echo "
{
\"verbose\": true,
\"stream\": true,
\"input\": {
\"puller\": {
\"model\": \"HWPCReport\",
\"type\": \"socket\",
\"uri\": \"127.0.0.1\",
\"port\": 8080,
\"collection\": \"test_hwpc\"
}
},
\"output\": {
\"pusher_power\": {
\"type\": \"influxdb\",
\"model\": \"PowerReport\",
\"uri\": \"127.0.0.1\",
\"port\": 8086,
\"db\": \"test\",
\"collection\": \"prep\"
}
},
\"cpu-frequency-base\": $basefrequency,
\"cpu-frequency-min\": $minfrequency,
\"cpu-frequency-max\": $maxfrequency,
\"cpu-error-threshold\": 2.0,
\"disable-dram-formula\": true,
\"sensor-report-sampling-interval\": 1000
}
" > ./config_file.json