Prerequisites, building the RPM or DEB, and what lands on disk. When the package is installed, continue with deployment.md to configure and start it.
ThrottlePoint is not a daemon. It is a short-lived program that root runs
periodically from /etc/cron.d/hpc-eff, every 10 minutes by default. What it
does on each run depends on [MODE] control_mode; see
regulation-modes.md.
Required in both modes:
| Requirement | Why | Check |
|---|---|---|
| Root (cron runs as root) | Writing scaling_max_freq and /etc/cron.d |
id -u |
Python ≥ 3.9, python3-numpy, python3-requests |
Runtime | python3 -c 'import numpy, requests' |
cpupower (EL) or cpufreq-set (Debian) |
Applying the cap | command -v cpupower cpufreq-set |
| A writable cpufreq interface | Otherwise the cap silently does nothing | cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq |
ipmitool + DCMI-capable BMC |
Power reading for the log (optional) | ipmitool dcmi power reading |
Additionally, for control_mode = co2:
| Requirement | Why | Check |
|---|---|---|
| Outbound HTTPS | Price and CO₂ data | see below |
| A Nowtricity API key | CO₂ rating | https://www.nowtricity.com/ |
Additionally, for control_mode = temperature:
| Requirement | Why | Check |
|---|---|---|
| A working temperature source | The only input this mode has | depends on [TEMPERATURE_SOURCE] TYPE, see deployment.md |
ipmitool (only if TYPE=ipmi) |
Reading the sensor: required here, unlike the optional power reading above | ipmitool sensor reading "INLET_AIR_TEMP" |
nvidia-smi (only on GPU nodes) |
Applying the GPU power limit | nvidia-smi --query-gpu=count --format=csv,noheader |
The node must reach these hosts directly. There is no proxy setting in the
config; set https_proxy in the cron environment if you need one.
| Host | Purpose | Required? |
|---|---|---|
spotovaelektrina.cz |
Current price and historical monthly averages | Yes: price rating |
www.nowtricity.com |
CO₂ intensity (default backend) | Only if TYPE=nowtricity |
api.wattnet.eu |
CO₂ intensity (alternative backend) | Only if TYPE=wattnet |
Pre-flight check:
curl -s https://spotovaelektrina.cz/api/v1/price/get-actual-price-czk # expect an integercat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies 2>/dev/nullacpi-cpufreq gives you a discrete list of frequencies; intel_pstate in
active mode accepts any value in range and rounds it. Both work.
Warning: if
/sys/devices/system/cpu/cpu0/cpufreq/does not exist at all, frequency scaling disabled in BIOS, or a virtualised node, this tool cannot do anything on that node.
git clone git@github.com:CESNET/hpc_eff.git
cd hpc_effsudo dnf install -y ipmitool make kernel-tools rpm-build rpmdevtools \
python3 python3-setuptools python3-numpy python3-requests
make # clean → sdist → rpmbuild → dnf installmake builds and installs in one go. To build without installing:
make clean rpmdevdirs sdist rpm
# result: ~/rpmbuild/RPMS/noarch/hpc_eff-<version>-1.noarch.rpmsudo apt update
sudo apt install -y build-essential devscripts debhelper dh-make dh-python \
python3-all python3-setuptools fakeroot
sudo apt install -y ipmitool python3-numpy python3-requests \
cpufrequtils # or linux-cpupower on Debian 13
make deb # → ../hpc-eff_<version>_amd64.deb
sudo dpkg -i ../hpc-eff_*.deb
sudo apt-get install -f # pull in any missing runtime depsNote: build once per architecture. The RPM is
noarch(pure Python, installs anywhere). The DEB isArchitecture: anyand builds asamd64; the code is still architecture-independent, butdpkgrefuses to install anamd64.deb on an arm64 node. Build on one host of each architecture you run and distribute the resulting file to the rest; compute nodes do not need the build toolchain.
CI builds both artifacts on every push
(.github/workflows/ci.yml, Debian 13 and
Rocky 9), so you can also download them from the workflow run: open the
Actions tab on GitHub, pick the run for the commit/branch you want, and
grab hpc-eff-deb or hpc-eff-rpm from the Artifacts section at the
bottom of the run summary. Via the gh CLI:
gh run list --workflow=ci.yml --limit 5
gh run download <run-id> -n hpc-eff-deb # or hpc-eff-rpm| Path | Content |
|---|---|
/usr/bin/hpc-eff |
The executable |
/etc/hpc_eff/config.ini |
Active config (conffile, survives upgrades) |
/etc/hpc_eff/config.ini.example |
Reference copy (DEB only) |
/var/lib/hpc_eff/history.db |
SQLite log, created on first run |
/var/lib/hpc_eff/state.json |
Current state and rolling history, first run |
/etc/cron.d/hpc-eff |
Created by hpc-eff --enable |
Caution: the DEB
postinstrunshpc-eff --enableautomatically, so on Debian and Ubuntu the cron job is live the moment you install, before you have configured anything. The RPM does not do this. On Debian, either configure immediately or runsudo hpc-eff --disablefirst.
deployment.md: configure, first run, verify, tune.