#!/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)