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-Computer2. 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 | iex5. Zainstaluj Python + zależności:
pip install -r requirements.txtUruchomienie 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 PDFKonfiguracja ś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 pomiaremOgraniczenia na Windows vs Linux
| Kryterium | Linux (bare-metal) | Windows (Scaphandre) |
|---|---|---|
| Dostęp RAPL | sysfs (dokładny) | DeviceIoControl (dokładny) |
| Per-process | PowerJoular | Scaphandre 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 analyzeWyniki 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.shAnaliza i wykresy
python3 analysis/analyze_results.py 1 # statystyki + tabele LaTeX
python3 analysis/plot_results.py all # wszystkie wykresy PDFWyniki 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