Kod eksperymentalny — js-runtime-energy

Skrypty pomiarowe, workloady i analiza dla projektu badawczego “Energetyczna Efektywność Środowisk Uruchomieniowych JavaScript”.

Uruchomienie na Windows (Scaphandre + windows-rapl-driver)

Pełnoprawny pomiar RAPL na Windows — bez konieczności Linuksa ani maszyny wirtualnej.

Wymagania jednorazowe

1. Włącz Windows Test Mode (wymagane dla sterownika, jeden restart):

# Uruchom jako Administrator
bcdedit.exe -set TESTSIGNING ON
bcdedit.exe -set nointegritychecks on
Restart-Computer

2. Zainstaluj windows-rapl-driver (z repozytorium hubblo-org/windows-rapl-driver):

# Pobierz DriverLoader.exe i ScaphandreDrv.sys
# Uruchom jako Administrator
.\DriverLoader.exe install
.\DriverLoader.exe start
 
# Weryfikacja:
driverquery /v | Select-String -Pattern "scaph"   # musi pokazać "Running"

3. Zainstaluj Scaphandre (hubblo-org/scaphandre, release dla Windows):

# Pobierz scaphandre.exe i dodaj do PATH lub ustaw:
$env:SCAPHANDRE_PATH = "C:\tools\scaphandre.exe"

4. Zainstaluj runtimes JS:

# Node.js 24 LTS
winget install OpenJS.NodeJS.LTS
 
# Deno 2
irm https://deno.land/install.ps1 | iex
 
# Bun 1
irm https://bun.sh/install.ps1 | iex

5. Zainstaluj Python + zależności:

pip install -r requirements.txt

Uruchomienie eksperymentów

cd projects\js-runtime-energy\code
 
# Pełny pipeline (EXP-2 → EXP-1 → EXP-3 → analiza):
.\experiments\run_all.ps1
 
# Lub ręcznie krok po kroku:
.\experiments\run_exp2.ps1                    # kalibracja JIT warm-up (~20 min)
python analysis\analyze_results.py warmup_n   # wyznacz WARMUP_N
.\experiments\run_exp1.ps1 -WarmupN 8 -Reps 30   # główny pomiar (~3-5h)
.\experiments\run_exp3.ps1 -SensitivitySweep  # TOPSIS
python analysis\analyze_results.py 1          # tabele LaTeX
python analysis\plot_results.py all           # wykresy PDF

Konfiguracja środowiska pomiarowego (zalecane)

# Wyłącz Turbo Boost (stabilność pomiarów)
# Intel: przez Intel XTU lub rejestr (zależy od sprzętu)
 
# Ustaw tryb wydajności CPU:
powercfg /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c  # High Performance
 
# Zamknij aplikacje w tle (Defender, Teams, itp.) przed pomiarem

Ograniczenia na Windows vs Linux

KryteriumLinux (bare-metal)Windows (Scaphandre)
Dostęp RAPLsysfs (dokładny)DeviceIoControl (dokładny)
Per-processPowerJoularScaphandre consumers
DRAM energy✅ (zależy od CPU)
Reproducibility✅ wysoka⚠ średnia (więcej bg noise)
Test Mode wymagany✅ (jednorazowy restart)
Porównywalność z lit.⚠ (inne środowisko OS)

Dla wyników do publikacji — zbierz dane też na bare-metal Linux i porównaj. Windows jest idealny do development i wstępnej walidacji metodologii.


Uruchomienie przez Docker (zalecane)

Docker izoluje środowisko i zapewnia powtarzalność. Wymaga Linux z Intel CPU (RAPL).

cd projects/js-runtime-energy/code
 
# 1. Zbuduj obrazy
bash docker_run.sh build
 
# 2. Przygotuj host (RAPL + turbo off) — raz na sesję
bash docker_run.sh prepare     # wymaga sudo
 
# 3. Sprawdź dostęp do RAPL
bash docker_run.sh check-rapl
 
# 4. Uruchom eksperymenty w kolejności
bash docker_run.sh exp2              # protokół warm-up (~15 min)
bash docker_run.sh exp1 30           # główny pomiar (~3-5h)
bash docker_run.sh exp3              # TOPSIS (~5 min)
 
# LUB wszystko naraz:
bash docker_run.sh all 30            # ~4-8h
 
# 5. Analiza i wykresy
bash docker_run.sh analyze

Wyniki trafiają do results/ i analysis/output/ na hoście (volume mount).

Uruchomienie bez Dockera (bare-metal)

# Runtimes (Linux)
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo bash - && sudo apt install nodejs
curl -fsSL https://deno.land/install.sh | sh
curl -fsSL https://bun.sh/install | bash
 
# Python
pip install -r requirements.txt
 
# PowerJoular — dla pomiaru per-proces
# https://github.com/joularjx/powerjoular
 
# Eksperymenty
bash experiments/run_exp2.sh cpu 100
bash experiments/run_exp1.sh 30 5
bash experiments/run_exp3.sh

Analiza i wykresy

python3 analysis/analyze_results.py 1        # statystyki + tabele LaTeX
python3 analysis/plot_results.py all         # wszystkie wykresy PDF

Wyniki LaTeX trafiają do analysis/output/*.tex — gotowe do \input{} w pracy.

Struktura

code/
├── experiments/
│   ├── run_exp1.ps1     — EXP-1: porównanie energii (Windows/Scaphandre)
│   ├── run_exp2.ps1     — EXP-2: protokół warm-up JIT (Windows)
│   ├── run_exp3.ps1     — EXP-3: model TOPSIS (Windows)
│   ├── run_all.ps1      — pełny pipeline (Windows)
│   ├── run_exp1.sh      — EXP-1 (Linux/Docker)
│   ├── run_exp2.sh      — EXP-2 (Linux/Docker)
│   ├── run_exp3.sh      — EXP-3 (Linux/Docker)
│   └── run_all.sh       — pełny pipeline (Linux/Docker)
├── workloads/
│   ├── cpu.js           — SHA-256, JSON, sorting
│   ├── io.js            — file I/O, HTTP fetch
│   ├── mixed.js         — REST handler (JSON→compute→JSON)
│   ├── memory.js        — large arrays, GC pressure
│   ├── ssr.js           — template rendering
│   └── coldstart.js     — zimny start (restart per rep)
├── utils/
│   ├── measure_energy.ps1 — Scaphandre wrapper (Windows)
│   ├── measure_energy.sh  — PowerJoular/RAPL wrapper (Linux)
│   └── echo_server.js     — lokalny HTTP server dla io.js
├── analysis/
│   ├── analyze_results.py  — statystyki + Mann-Whitney + LaTeX
│   ├── plot_results.py     — boxploty, heatmapy (300 DPI PDF)
│   └── topsis_model.py     — TOPSIS + analiza wrażliwości
└── results/             — surowe dane CSV (gitignored)

Uwagi

  • Uruchamiaj na bare-metal Linux z Intel CPU (RAPL access)
  • Wyłącz turbo boost: echo 1 | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo
  • CPU governor: sudo cpupower frequency-set -g performance
  • RAPL access: sudo modprobe intel_rapl_common