2025-05-29 19:33:07 +02:00
|
|
|
import time
|
|
|
|
|
import os
|
|
|
|
|
|
2025-05-31 00:28:04 +02:00
|
|
|
RAPL_PATH = "/sys/class/powercap/intel-rapl:0/energy_uj"
|
|
|
|
|
INTERVAL_SEC = 1.0 # configurable via command-line argument or env var
|
2025-05-29 19:33:07 +02:00
|
|
|
|
2025-05-31 00:28:04 +02:00
|
|
|
def read_energy(path):
|
2025-05-29 19:33:07 +02:00
|
|
|
try:
|
2025-05-31 00:28:04 +02:00
|
|
|
with open(path, "r") as f:
|
2025-05-29 19:33:07 +02:00
|
|
|
return int(f.read().strip())
|
|
|
|
|
except FileNotFoundError:
|
2025-05-31 00:28:04 +02:00
|
|
|
raise RuntimeError(f"RAPL support not available: {path}")
|
2025-05-29 19:33:07 +02:00
|
|
|
|
2025-05-31 00:28:04 +02:00
|
|
|
def calculate_power(energy_before, energy_after, interval_sec):
|
|
|
|
|
delta_uj = energy_after - energy_before
|
|
|
|
|
power_watts = (delta_uj / 1_000_000) / interval_sec
|
|
|
|
|
return f"{power_watts:.2f} Watts"
|
2025-05-29 19:33:07 +02:00
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
if os.geteuid() != 0:
|
|
|
|
|
print("Please run this script as root.")
|
|
|
|
|
exit(1)
|
2025-05-31 00:28:04 +02:00
|
|
|
|
2025-05-29 19:33:07 +02:00
|
|
|
try:
|
2025-05-31 00:28:04 +02:00
|
|
|
# RAPL support check
|
|
|
|
|
with open(RAPL_PATH, "r") as f:
|
|
|
|
|
_ = int(f.read().strip())
|
|
|
|
|
|
|
|
|
|
while True:
|
|
|
|
|
energy_before = read_energy(RAPL_PATH)
|
|
|
|
|
time.sleep(INTERVAL_SEC)
|
|
|
|
|
energy_after = read_energy(RAPL_PATH)
|
|
|
|
|
|
|
|
|
|
power_reading = calculate_power(energy_before, energy_after, INTERVAL_SEC)
|
|
|
|
|
print(f"Power Usage: {power_reading}")
|
|
|
|
|
|
2025-05-29 19:33:07 +02:00
|
|
|
except KeyboardInterrupt:
|
|
|
|
|
print("\nStopped.")
|