<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Simulator on Joulie</title><link>https://joulie-k8s.github.io/Joulie/versions/v0.0.4/docs/simulator/</link><description>Recent content in Simulator on Joulie</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://joulie-k8s.github.io/Joulie/versions/v0.0.4/docs/simulator/index.xml" rel="self" type="application/rss+xml"/><item><title>Workload and Power Simulator</title><link>https://joulie-k8s.github.io/Joulie/versions/v0.0.4/docs/simulator/simulator/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://joulie-k8s.github.io/Joulie/versions/v0.0.4/docs/simulator/simulator/</guid><description>&lt;p&gt;This document defines the Joulie simulator design and how it integrates with Joulie.&lt;/p&gt;
&lt;h2 id="architecture-at-a-glance"&gt;Architecture at a glance&lt;/h2&gt;
&lt;p&gt;The simulator extends the same control path used on real nodes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Operator writes desired node profile (&lt;code&gt;NodePowerProfile&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Agent reads desired state and sends control intents.&lt;/li&gt;
&lt;li&gt;Simulator emulates telemetry/control behavior per node and exposes HTTP endpoints.&lt;/li&gt;
&lt;li&gt;Next reconcile loop reacts to updated simulated state.&lt;/li&gt;
&lt;/ol&gt;
&lt;img src='https://joulie-k8s.github.io/Joulie/versions/v0.0.4/images/joulie-arch-simulator.png
' alt="Joulie simulator architecture overview"&gt;
&lt;p&gt;The diagram shows the end-to-end loop:&lt;/p&gt;</description></item><item><title>Workload Simulator</title><link>https://joulie-k8s.github.io/Joulie/versions/v0.0.4/docs/simulator/workload-simulator/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://joulie-k8s.github.io/Joulie/versions/v0.0.4/docs/simulator/workload-simulator/</guid><description>&lt;p&gt;This page documents the workload-side simulation model.&lt;/p&gt;
&lt;h2 id="scope"&gt;Scope&lt;/h2&gt;
&lt;p&gt;The workload simulator handles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;trace/job ingestion,&lt;/li&gt;
&lt;li&gt;pod creation and placement via real scheduler,&lt;/li&gt;
&lt;li&gt;per-job progress updates,&lt;/li&gt;
&lt;li&gt;completion and pod deletion,&lt;/li&gt;
&lt;li&gt;class inference from scheduling constraints.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Power/control dynamics are documented separately in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://joulie-k8s.github.io/Joulie/versions/v0.0.4/docs/simulator/power-simulator/"&gt;Power Simulator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="trace-driven-workload-model"&gt;Trace-driven workload model&lt;/h2&gt;
&lt;p&gt;Enable with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SIM_WORKLOAD_TRACE_PATH=/path/to/trace.jsonl&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The simulator loads &lt;code&gt;type=job&lt;/code&gt; records and schedules pods over time according to submit offsets.&lt;/p&gt;
&lt;p&gt;Helper tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;simulator/cmd/workloadgen&lt;/code&gt; (synthetic traces)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;simulator/cmd/traceextract&lt;/code&gt; (normalize/extract traces)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="per-job-execution-model"&gt;Per-job execution model&lt;/h2&gt;
&lt;p&gt;Each job tracks:&lt;/p&gt;</description></item><item><title>Power Simulator</title><link>https://joulie-k8s.github.io/Joulie/versions/v0.0.4/docs/simulator/power-simulator/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://joulie-k8s.github.io/Joulie/versions/v0.0.4/docs/simulator/power-simulator/</guid><description>&lt;p&gt;This page documents the power/control-side simulation model.&lt;/p&gt;
&lt;h2 id="scope"&gt;Scope&lt;/h2&gt;
&lt;p&gt;The power simulator handles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;node power-state variables,&lt;/li&gt;
&lt;li&gt;RAPL/DVFS control ingestion,&lt;/li&gt;
&lt;li&gt;frequency ramp dynamics,&lt;/li&gt;
&lt;li&gt;power computation and capping,&lt;/li&gt;
&lt;li&gt;energy integration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Workload execution model is documented separately in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://joulie-k8s.github.io/Joulie/versions/v0.0.4/docs/simulator/workload-simulator/"&gt;Workload Simulator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="per-node-state"&gt;Per-node state&lt;/h2&gt;
&lt;p&gt;Each simulated node tracks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CapWatts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TargetThrottlePct&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ThrottlePct&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FreqScale&lt;/code&gt; in &lt;code&gt;[f_min/f_max, 1]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CPUUtil&lt;/code&gt; in &lt;code&gt;[0,1]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CapSaturated&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="power-model"&gt;Power model&lt;/h2&gt;
&lt;p&gt;At update time:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;P = P_idle + (P_max - P_idle) * util^alpha * freqScale^beta&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Where:&lt;/p&gt;</description></item><item><title>Simulator Metrics</title><link>https://joulie-k8s.github.io/Joulie/versions/v0.0.4/docs/simulator/metrics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://joulie-k8s.github.io/Joulie/versions/v0.0.4/docs/simulator/metrics/</guid><description>&lt;p&gt;This page documents Prometheus metrics exposed by the simulator (&lt;code&gt;simulator/cmd/simulator/main.go&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Endpoint:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;path: &lt;code&gt;/metrics&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;address: simulator HTTP listen address (&lt;code&gt;SIM_ADDR&lt;/code&gt;, default &lt;code&gt;:18080&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Related debug endpoints (non-Prometheus):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/debug/nodes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/debug/events&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/debug/energy&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="httprequest-metrics"&gt;HTTP/request metrics&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;joulie_sim_requests_total{route,method,status}&lt;/code&gt; (counter)
&lt;ul&gt;
&lt;li&gt;total HTTP requests by route/method/status&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;joulie_sim_request_duration_seconds{route,method}&lt;/code&gt; (histogram)
&lt;ul&gt;
&lt;li&gt;request latency&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="control-path-metrics"&gt;Control-path metrics&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;joulie_sim_controls_total{node,action}&lt;/code&gt; (counter)
&lt;ul&gt;
&lt;li&gt;received control actions by node/action&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;joulie_sim_control_actions_total{node,action,result}&lt;/code&gt; (counter)
&lt;ul&gt;
&lt;li&gt;control action outcomes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;result&lt;/code&gt;: &lt;code&gt;applied|blocked|error&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="per-node-simulated-state-metrics"&gt;Per-node simulated state metrics&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;joulie_sim_node_cap_watts{node}&lt;/code&gt; (gauge)
&lt;ul&gt;
&lt;li&gt;current simulated effective cap&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;joulie_sim_node_rapl_cap_watts{node}&lt;/code&gt; (gauge)
&lt;ul&gt;
&lt;li&gt;simulated RAPL cap value&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;joulie_sim_node_throttle_pct{node}&lt;/code&gt; (gauge)
&lt;ul&gt;
&lt;li&gt;simulated DVFS throttle percent&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;joulie_sim_node_power_watts{node}&lt;/code&gt; (gauge)
&lt;ul&gt;
&lt;li&gt;simulated node power&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;joulie_sim_node_cpu_util{node}&lt;/code&gt; (gauge)
&lt;ul&gt;
&lt;li&gt;simulated CPU utilization&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;joulie_sim_node_freq_scale{node}&lt;/code&gt; (gauge)
&lt;ul&gt;
&lt;li&gt;simulated frequency scale&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;joulie_sim_node_running_pods{node}&lt;/code&gt; (gauge)
&lt;ul&gt;
&lt;li&gt;running pods observed on the node&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;joulie_sim_node_class_info{node,class}&lt;/code&gt; (gauge)
&lt;ul&gt;
&lt;li&gt;class assignment marker (&lt;code&gt;1&lt;/code&gt; on active class)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="workloadjob-metrics"&gt;Workload/job metrics&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;joulie_sim_job_submitted_total{class}&lt;/code&gt; (counter)
&lt;ul&gt;
&lt;li&gt;jobs submitted by class&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;joulie_sim_job_completed_total{class,node}&lt;/code&gt; (counter)
&lt;ul&gt;
&lt;li&gt;jobs completed by class and node&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;joulie_sim_job_completion_seconds&lt;/code&gt; (histogram)
&lt;ul&gt;
&lt;li&gt;job completion latency distribution&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="notes"&gt;Notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Prometheus metrics capture online simulator state and request/control behavior.&lt;/li&gt;
&lt;li&gt;Integrated node/cluster energy totals are exposed through &lt;code&gt;/debug/energy&lt;/code&gt; (JSON), not as Prometheus time series in the current implementation.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>