From ef7cb9f808740d89f2145c8d3584b5f805be4ed1 Mon Sep 17 00:00:00 2001 From: Adel Noureddine Date: Thu, 27 Jun 2024 15:14:19 +0200 Subject: [PATCH] Move PowerMonitor for Windows from JoularJX repo to its own repository and update README accordingly --- PowerMonitor/.gitignore | 2 - PowerMonitor/Main.cpp | 46 ------- PowerMonitor/PowerMonitor.sln | 31 ----- PowerMonitor/PowerMonitor.vcxproj | 151 ---------------------- PowerMonitor/PowerMonitor.vcxproj.user | 4 - PowerMonitor/hubbloRAPL.cpp | 168 ------------------------- PowerMonitor/hubbloRAPL.h | 33 ----- README.md | 41 ++---- install/PowerMonitor.exe | Bin 14848 -> 0 bytes install/config.properties | 76 ----------- install/joularjx-2.9.0.jar | Bin 48131 -> 0 bytes install/linux-install.sh | 23 ---- install/windows-install.bat | 25 ---- install/windows-install.ps1 | 25 ---- pom.xml | 4 +- 15 files changed, 15 insertions(+), 614 deletions(-) delete mode 100644 PowerMonitor/.gitignore delete mode 100644 PowerMonitor/Main.cpp delete mode 100644 PowerMonitor/PowerMonitor.sln delete mode 100644 PowerMonitor/PowerMonitor.vcxproj delete mode 100644 PowerMonitor/PowerMonitor.vcxproj.user delete mode 100644 PowerMonitor/hubbloRAPL.cpp delete mode 100644 PowerMonitor/hubbloRAPL.h delete mode 100644 install/PowerMonitor.exe delete mode 100644 install/config.properties delete mode 100644 install/joularjx-2.9.0.jar delete mode 100644 install/linux-install.sh delete mode 100644 install/windows-install.bat delete mode 100644 install/windows-install.ps1 diff --git a/PowerMonitor/.gitignore b/PowerMonitor/.gitignore deleted file mode 100644 index c03028d..0000000 --- a/PowerMonitor/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.vs/ -x64/ \ No newline at end of file diff --git a/PowerMonitor/Main.cpp b/PowerMonitor/Main.cpp deleted file mode 100644 index 1235897..0000000 --- a/PowerMonitor/Main.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2021-2024, Adel Noureddine, Université de Pau et des Pays de l'Adour. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the - * GNU General Public License v3.0 only (GPL-3.0-only) - * which accompanies this distribution, and is available at - * https://www.gnu.org/licenses/gpl-3.0.en.html - * - * Author : Adel Noureddine - */ - -#include -#include -#include - -#include "hubbloRAPL.h" - -using namespace std; - -void sighandler(int snum) { - closeDriver(); - exit(1); -} - -int main() { - signal(SIGINT, sighandler); - - if (loadDriver()) { - float beforeEnergy = 0.0; - float afterEnergy = 0.0; - float energy = 0.0; - while (true) { - afterEnergy = getRAPLEnergy(); - energy = afterEnergy - beforeEnergy; - beforeEnergy = afterEnergy; - cout << energy << endl; - - // Sleep for one second - Sleep(1000); - } - return 0; - } - else { - cout << "Driver failed" << endl; - } -} \ No newline at end of file diff --git a/PowerMonitor/PowerMonitor.sln b/PowerMonitor/PowerMonitor.sln deleted file mode 100644 index be81ab6..0000000 --- a/PowerMonitor/PowerMonitor.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.1.32328.378 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerMonitor", "PowerMonitor.vcxproj", "{4EE8902F-9DA1-4BF2-ADC3-B99D57CEB67C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4EE8902F-9DA1-4BF2-ADC3-B99D57CEB67C}.Debug|x64.ActiveCfg = Debug|x64 - {4EE8902F-9DA1-4BF2-ADC3-B99D57CEB67C}.Debug|x64.Build.0 = Debug|x64 - {4EE8902F-9DA1-4BF2-ADC3-B99D57CEB67C}.Debug|x86.ActiveCfg = Debug|Win32 - {4EE8902F-9DA1-4BF2-ADC3-B99D57CEB67C}.Debug|x86.Build.0 = Debug|Win32 - {4EE8902F-9DA1-4BF2-ADC3-B99D57CEB67C}.Release|x64.ActiveCfg = Release|x64 - {4EE8902F-9DA1-4BF2-ADC3-B99D57CEB67C}.Release|x64.Build.0 = Release|x64 - {4EE8902F-9DA1-4BF2-ADC3-B99D57CEB67C}.Release|x86.ActiveCfg = Release|Win32 - {4EE8902F-9DA1-4BF2-ADC3-B99D57CEB67C}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {1E89AB54-09D1-411C-8743-F2DC6697277C} - EndGlobalSection -EndGlobal diff --git a/PowerMonitor/PowerMonitor.vcxproj b/PowerMonitor/PowerMonitor.vcxproj deleted file mode 100644 index cc91eac..0000000 --- a/PowerMonitor/PowerMonitor.vcxproj +++ /dev/null @@ -1,151 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - Win32Proj - {4ee8902f-9da1-4bf2-adc3-b99d57ceb67c} - PowerMonitor - 10.0 - - - - Application - true - v143 - Unicode - - - Application - false - v143 - true - Unicode - - - Application - true - v143 - Unicode - - - Application - false - v143 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - false - - - true - - - false - - - - Level3 - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - - - - - Level3 - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - Level3 - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - - - - - - - - - \ No newline at end of file diff --git a/PowerMonitor/PowerMonitor.vcxproj.user b/PowerMonitor/PowerMonitor.vcxproj.user deleted file mode 100644 index 0f14913..0000000 --- a/PowerMonitor/PowerMonitor.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/PowerMonitor/hubbloRAPL.cpp b/PowerMonitor/hubbloRAPL.cpp deleted file mode 100644 index 4cc54b2..0000000 --- a/PowerMonitor/hubbloRAPL.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2024, Adel Noureddine, Université de Pau et des Pays de l'Adour. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the - * GNU General Public License v3.0 only (GPL-3.0-only) - * which accompanies this distribution, and is available at - * https://www.gnu.org/licenses/gpl-3.0.en.html - * - * Author : Adel Noureddine - */ - -#include -#include - -#include "hubbloRAPL.h" - -using namespace std; - -HANDLE raplDriverHandle = NULL; - -const DWORD RAPL_CTL_CODE = CTL_CODE( - FILE_DEVICE_UNKNOWN, - static_cast(MSR_RAPL_POWER_UNIT), - METHOD_BUFFERED, - FILE_READ_DATA | FILE_WRITE_DATA -); - -float powerUnit, energyUnit, timeUnit; - -bool psys = false, pkg = false, dram = false; - -bool getDataFromDriver(UINT64 msr, UINT64* replyData, DWORD* replyLength) { - if (!DeviceIoControl( - raplDriverHandle, - RAPL_CTL_CODE, - &msr, - sizeof(msr), - replyData, - sizeof(replyData), - replyLength, - NULL - )) { - return 0; - } - - return 1; -} - -void getEnergyUnits() { - UINT64 replyData; - DWORD replyLength; - - if (!getDataFromDriver(MSR_RAPL_POWER_UNIT, &replyData, &replyLength)) { - return; - } - - // Time Units - constexpr UINT64 time_mask = 0xF0000; - const UINT64 time_val = replyData & time_mask; - timeUnit = 1.0f / (pow(2.0f, static_cast(time_val >> 16))); - - // Energy Units - constexpr UINT64 energy_mask = 0x1F00; - const UINT64 energy_val = replyData & energy_mask; - energyUnit = 1.0f / (pow(2.0f, static_cast(energy_val >> 8))); - - // Power Units - constexpr UINT64 power_mask = 0xF; - const UINT64 power_val = replyData & power_mask; - powerUnit = 1.0f / (pow(2.0f, static_cast(power_val))); -} - -void checkSupportedPlatform() { - UINT64 replyData; - DWORD replyLength; - - if (getDataFromDriver(MSR_PLATFORM_ENERGY_STATUS, &replyData, &replyLength)) { - if (replyData != 0) { - psys = true; - } - } - - if (!psys) { - if (getDataFromDriver(MSR_PKG_ENERGY_STATUS, &replyData, &replyLength)) { - if (replyData != 0) { - pkg = true; - } - } - - if (getDataFromDriver(MSR_DRAM_ENERGY_STATUS, &replyData, &replyLength)) { - if (replyData != 0) { - dram = true; - } - } - } -} - -int loadDriver() { - if (raplDriverHandle == NULL) { - raplDriverHandle = CreateFile( - L"\\\\.\\ScaphandreDriver", - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, - OPEN_EXISTING, - FILE_FLAG_OVERLAPPED, - NULL - ); - - if (raplDriverHandle == INVALID_HANDLE_VALUE) { - return 0; - } - - getEnergyUnits(); - - checkSupportedPlatform(); - - return 1; - }; - - return 0; -} - -void closeDriver() { - if(raplDriverHandle != NULL) { - CloseHandle(raplDriverHandle); - raplDriverHandle = NULL; - } -} - -float getRAPLEnergy() { - UINT64 replyData; - DWORD replyLength; - UINT64 msr = NULL; - - if (psys) { - if (!getDataFromDriver(MSR_PLATFORM_ENERGY_STATUS, &replyData, &replyLength)) { - cout << "not" << endl; - return 0.0; - } - const UINT32 rawPSYSEnergy = replyData & 0xFFFFFFFF; - const float PSYSEnergy = static_cast(rawPSYSEnergy) * energyUnit; - return PSYSEnergy; - } - else { - if (pkg) { - if (!getDataFromDriver(MSR_PKG_ENERGY_STATUS, &replyData, &replyLength)) { - return 0.0; - } - const UINT32 rawPKGEnergy = replyData & 0xFFFFFFFF; - const float PKGEnergy = static_cast(rawPKGEnergy) * energyUnit; - - if (dram) { - if (!getDataFromDriver(MSR_DRAM_ENERGY_STATUS, &replyData, &replyLength)) { - return 0.0; - } - const UINT32 rawDRAMEnergy = replyData & 0xFFFFFFFF; - const float DRAMEnergy = static_cast(rawDRAMEnergy) * energyUnit; - - return PKGEnergy + DRAMEnergy; - } - else { - return PKGEnergy; - } - } - } - return 0.0; -} \ No newline at end of file diff --git a/PowerMonitor/hubbloRAPL.h b/PowerMonitor/hubbloRAPL.h deleted file mode 100644 index d94d23e..0000000 --- a/PowerMonitor/hubbloRAPL.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2024, Adel Noureddine, Université de Pau et des Pays de l'Adour. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the - * GNU General Public License v3.0 only (GPL-3.0-only) - * which accompanies this distribution, and is available at - * https://www.gnu.org/licenses/gpl-3.0.en.html - * - * Author : Adel Noureddine - */ - -#pragma once - -#include - -// RAPL units -constexpr UINT64 MSR_RAPL_POWER_UNIT = 0x606; - -// Package -constexpr UINT64 MSR_PKG_ENERGY_STATUS = 0x611; - -// DRAM -constexpr UINT64 MSR_DRAM_ENERGY_STATUS = 0x00000619; - -// Platform = PSYS -constexpr UINT64 MSR_PLATFORM_ENERGY_STATUS = 0x0000064d; - -// Load and close driver -int loadDriver(); -void closeDriver(); - -// Get RAPL energy data -float getRAPLEnergy(); \ No newline at end of file diff --git a/README.md b/README.md index 82ae880..a04d27e 100755 --- a/README.md +++ b/README.md @@ -17,18 +17,24 @@ Detailed documentation (including user and reference guides) are available at: [ - Provides real-time power consumption of every method in the monitored program - Provides total energy for every method on program exit -## :package: Installation +## :package: Compilation and Installation -Just run the installation script in the ```install/``` folder: -- On Windows, run in a command line: ```windows-install.bat```. This will install JoularJX jar and ProgramMonitor to ```C:\joularjx```. -- On GNU/Linux, run in a terminal: ```sh linux-install.sh```. This will install JoularJX to ```/opt/joularjx```. +To build JoularJX, you need Java 11+ and Maven, then just build: -You can also just use the compiled jar package for JoularJX. +``` +mvn clean install -DskipTests +``` -JoularJX requires a minimum version of Java 11+. +Alternatively, you can use the Maven wrappen shipped with the project with the command: + +``` +Linux: ./mvnw clean install -DskipTests +Windows: ./mvnw.cmd clean install -DskipTests +``` JoularJX depend on the following software or packages in order to get power reading: - On Windows, JoularJX uses a custom power monitor program that uses the [Windows RAPL driver by Hubblo](https://github.com/hubblo-org/windows-rapl-driver), and therefore require installing the driver first, and runs on Intel or AMD CPUs (since Ryzen). +- On Windows, to read the data from the RAPL driver, we use a custom program monitor called [Power Monitor for Windows](https://github.com/joular/WinPowerMonitor). It used to be part of JoularJX, but now is in its own repository. Download the binary (or compile the source code), and specify its path in ```config.properties```. - On PC/server GNU/Linux, JoularJX uses Intel RAPL interface through powercap, and therefore requires running on an Intel CPU or an AMD CPU (since Ryzen). - On macOS, JoularJX uses `powermetrics`, a tool bundled with macOS which requires running with `sudo` access. It is recommended to authorize the current users to run `/usr/bin/powermetrics` without requiring a password by making the proper modification to the `sudoers` file. - On Raspberry Pi devices on GNU/Linux, JoularJX uses our own research-based regression models to estimate CPU power consumption with support for the following device models (we support all revisions of each model lineup. However, the model is generated and trained on a specific revision, listed between brackets, and the accuracy is best on this particular revision): @@ -85,7 +91,7 @@ JoularJX can be configured by modifying the ```config.properties``` files: - ```save-runtime-data```: write runtime methods power consumption in a CSV file. - ```overwrite-runtime-data```: overwrite runtime power data files, or if set to false, it will write new files for each monitoring cycle. - ```logger-level```: set the level of information (by logger) given by JoularJX in the terminal (allowed values: OFF, INFO, WARNING, SEVERE). -- ```powermonitor-path```: Full path to the power monitor program (only for Windows). +- ```powermonitor-path```: Full path to the [Power Monitor for Windows](https://github.com/joular/WinPowerMonitor) program (only for Windows). - ```track-consumption-evolution```: generate CSV files for each method containing details of the method's consumption over the time. Each consumption value is mapped to an Unix timestamp. - ```hide-agent-consumption```: if set to true, the energy consumption of the agent threads will not be reported. - ```enable-call-trees-consumption```: compute methods call trees energy consumption. A CSV file will be generated at the end of the agent's execution, associating to each call tree it's total energy consumption. @@ -96,27 +102,6 @@ JoularJX can be configured by modifying the ```config.properties``` files: You can install the jar package (and the PowerMonitor.exe on Windows) wherever you want, and call it in the ```javaagent``` with the full path. However, ```config.properties``` must be copied to the same folder as where you run the Java command. -## :floppy_disk: Compilation - -To build JoularJX, you need Java 11+ and Maven, then just build: - -``` -mvn clean install -DskipTests -``` - -Alternatively, you can use the Maven wrappen shipped with the project with the command: - -``` -Linux: ./mvnw clean install -DskipTests -Windows: ./mvnw.cmd clean install -DskipTests -``` - -To compile the Windows power monitor tool, required by JoularJX on Windows, open the project in Visual Studio and compile there. -Or open, Developer Command Prompt for VS (or Developer PowerShell for VS), and compile with this command: -``` -msbuild.exe PowerMonitor.sln /property:Configuration=Release -``` - ## Generated files For real-time power data or the total energy at the program exit, JoularJX generated two CSV files: diff --git a/install/PowerMonitor.exe b/install/PowerMonitor.exe deleted file mode 100644 index 786e32378bca47ac60cb5ad4a95656962dff00e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14848 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 HKYslWndI{| diff --git a/install/linux-install.sh b/install/linux-install.sh deleted file mode 100644 index ccf46e2..0000000 --- a/install/linux-install.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh - -# Copyright (c) 2021-2024, Adel Noureddine, Université de Pau et des Pays de l'Adour. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the -# GNU General Public License v3.0 only (GPL-3.0-only) -# which accompanies this distribution, and is available at -# https://www.gnu.org/licenses/gpl-3.0.en.html -# -# Author : Adel Noureddine - -INSTALLATION_PATH=/opt/joularjx - -read -p "Installation to $INSTALLATION_PATH. Continue ([y]/n)? " USER_CONFIRMATION -echo -if [ "$USER_CONFIRMATION" = "y" ] -then - mkdir $INSTALLATION_PATH - cp joularjx-*.jar $INSTALLATION_PATH - cp config.properties $INSTALLATION_PATH - - echo "Installation complete. JoularJX files installed in $INSTALLATION_PATH" -fi \ No newline at end of file diff --git a/install/windows-install.bat b/install/windows-install.bat deleted file mode 100644 index d27f382..0000000 --- a/install/windows-install.bat +++ /dev/null @@ -1,25 +0,0 @@ -:: Copyright (c) 2021-2024, Adel Noureddine, Université de Pau et des Pays de l'Adour. -:: All rights reserved. This program and the accompanying materials -:: are made available under the terms of the -:: GNU General Public License v3.0 only (GPL-3.0-only) -:: which accompanies this distribution, and is available at -:: https://www.gnu.org/licenses/gpl-3.0.en.html -:: -:: Author : Adel Noureddine - -@echo off -title JoularJX Windows Installer - -set INSTALLATION_PATH=C:\joularjx - -set USER_CONFIRMATION=y -set /p USER_CONFIRMATION=Installation to %INSTALLATION_PATH%. Continue ([y]/n)? -if /i not "%USER_CONFIRMATION%" == "y" goto :eof - -md %INSTALLATION_PATH% -copy joularjx-*.jar %INSTALLATION_PATH% -copy config.properties %INSTALLATION_PATH% -copy PowerMonitor.exe %INSTALLATION_PATH% - -echo Installation complete. JoularJX files installed in %INSTALLATION_PATH% -pause \ No newline at end of file diff --git a/install/windows-install.ps1 b/install/windows-install.ps1 deleted file mode 100644 index 2355cb1..0000000 --- a/install/windows-install.ps1 +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (c) 2021-2024, Adel Noureddine, Université de Pau et des Pays de l'Adour. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the -# GNU General Public License v3.0 only (GPL-3.0-only) -# which accompanies this distribution, and is available at -# https://www.gnu.org/licenses/gpl-3.0.en.html -# -# Author : Adel Noureddine - -$host.UI.RawUI.WindowTitle = "JoularJX Windows Installer" - -$INSTALLATION_PATH = "C:\joularjx" - -$USER_CONFIRMATION = Read-Host "Installation to $INSTALLATION_PATH. Continue ([y]/n)" -if ($USER_CONFIRMATION -ine "y") { - exit -} - -New-Item -ItemType Directory -Force -Path $INSTALLATION_PATH -Copy-Item "joularjx-*.jar" -Destination $INSTALLATION_PATH -Copy-Item "config.properties" -Destination $INSTALLATION_PATH -Copy-Item "PowerMonitor.exe" -Destination $INSTALLATION_PATH -Write-Host "Installation complete. JoularJX files installed in $INSTALLATION_PATH" - -Read-Host "Press Enter to continue..." \ No newline at end of file diff --git a/pom.xml b/pom.xml index b1ee2aa..57e0643 100644 --- a/pom.xml +++ b/pom.xml @@ -91,7 +91,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.3.0 + 3.4.2 @@ -110,7 +110,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.2.5 + 3.3.0