Files
opt/collectd/usr/local/bin/power-data-likwid
2024-12-23 10:54:34 +01:00

78 lines
1.7 KiB
Python
Executable File

#!/usr/bin/python3
#
# Imports
#
import sys
import time
import argparse
import pylikwid
#
# Configuration
#
hostname = "server"
cpuid = 0
pinfo = pylikwid.getpowerinfo()
domainid = pinfo.get("domains").get("PKG").get("ID")
measurement_duration = 5
measurement_interval = 15
dinfo = pinfo.get("domains")
domain_names = list(dinfo.keys())
domain_ids = [domain["ID"] for domain in list(dinfo.values())]
#
# Command line arguments
#
parser = argparse.ArgumentParser(description="Get CPU power consumption")
parser.add_argument("-s", action="store_true", help="print in human readable format")
args = parser.parse_args()
human_readable = args.s
#
# Methods
#
def get_power():
start = list()
end = list()
power = list()
for domain_id in domain_ids:
e_start = pylikwid.startpower(cpuid, domain_id)
start.append(e_start)
time.sleep(measurement_duration)
for domain_id in domain_ids:
e_stop = pylikwid.stoppower(cpuid, domain_id)
end.append(e_stop)
for events in zip(start, end, domain_ids):
joules = pylikwid.getpower(events[0], events[1], events[2])
power.append(joules / measurement_duration)
return dict(list(zip(domain_names, power)))
def print_rrd(measurements):
timestamp = int(time.time())
for measurement in list(measurements.items()):
name = measurement[0].lower()
power = measurement[1]
print(
(
"PUTVAL {}/exec-power/gauge-{} {}:{:.1f}".format(
hostname, name, timestamp, power
)
)
)
#
# Main
#
if human_readable:
print(get_power())
else:
while True:
power = get_power()
print_rrd(power)
sys.stdout.flush()
time.sleep(measurement_interval)