pub struct PhaseSlice {Show 16 fields
pub phase_epoch: u32,
pub cpus_used: BTreeSet<usize>,
pub wake_latencies_ns: Vec<u64>,
pub wake_sample_total: u64,
pub timer_latencies_ns: Vec<u64>,
pub timer_sample_total: u64,
pub run_delay_ns: u64,
pub off_cpu_ns: u64,
pub wall_ns: u64,
pub migration_count: u64,
pub iterations: u64,
pub schedstat_cpu_time_ns: u64,
pub numa_pages: BTreeMap<usize, u64>,
pub vmstat_numa_pages_migrated: u64,
pub max_gap_ms: u64,
pub max_gap_cpu: usize,
/* private fields */
}Expand description
Per-phase telemetry for one backdrop worker over one scenario
step’s HOLD window [StepStart(k), StepEnd(k)). A backdrop worker
spans every phase, so it accumulates a fresh slice between each
parent-driven phase_epoch transition and finalizes it when the
epoch moves (drain-on-change). Carries the per-phase subset of
WorkerReport’s whole-run telemetry that has a host-side
per-cgroup carrier (PhaseCgroupStats), so the host can pool slices
across workers into per-epoch PhaseBuckets. Counter fields are
per-phase deltas (end_snap − start_snap, re-baselined at each
boundary); cpus_used and numa_pages are per-phase observations
(gauges). Excludes iteration_costs_ns — that reservoir has no
per-cgroup carrier at any level (it feeds only the run-level
benchmark gate).
Fields§
§phase_epoch: u32The 1-indexed phase this slice covers (scenario Step k → k+1;
0 = BASELINE, u32::MAX = inter-step gap). The host maps this
to a PhaseBucket.step_index; gap- and baseline-tagged slices
have no host bucket and are discarded.
cpus_used: BTreeSet<usize>CPUs this worker ran on DURING this phase.
wake_latencies_ns: Vec<u64>Per-wakeup latency samples (ns) recorded during this phase,
reservoir-clamped to at most MAX_PHASE_WAKE_SAMPLES — a
smaller cap than the whole-run MAX_WAKE_SAMPLES so a worker
spanning many phases stays within the report pipe. The host
re-caps the merged per-cgroup pool at the larger
MAX_WAKE_SAMPLES.
wake_sample_total: u64Total wake observations during this phase, INCLUDING any the reservoir dropped — the true population for unbiased cross-phase weighting.
timer_latencies_ns: Vec<u64>Per-timer-cycle latency samples (ns) recorded during this phase by a
crate::workload::WorkType::TimerLatency worker, reservoir-clamped to
MAX_PHASE_WAKE_SAMPLES (like wake_latencies_ns). Distinct carrier so
timer latency does not blur with wake latency.
timer_sample_total: u64Total timer-cycle observations during this phase, INCLUDING any the
reservoir dropped — the true population for unbiased cross-phase
weighting. Mirrors wake_sample_total for timer_latencies_ns.
run_delay_ns: u64/proc/self/schedstat run_delay (field 2) delta over this phase (ns).
off_cpu_ns: u64Off-CPU time during this phase (ns): wall_ns − cpu_time over
the phase. Paired with wall_ns so the host derives the
off-CPU fraction and skips the not-measured wall_ns == 0 case
rather than dividing by zero.
wall_ns: u64Wall-clock duration of this phase as the worker observed it
(ns) — the denominator for the off-CPU fraction. 0 for a
phase the worker never ran in (not-measured).
migration_count: u64CPU migrations observed during this phase.
iterations: u64Outer-loop iterations during this phase.
schedstat_cpu_time_ns: u64/proc/self/schedstat cpu_time (field 1, sum_exec_runtime)
delta over this phase (ns).
numa_pages: BTreeMap<usize, u64>Per-NUMA-node resident page counts observed at this phase’s end
(/proc/self/numa_maps). A gauge, not a delta.
vmstat_numa_pages_migrated: u64/proc/vmstat numa_pages_migrated delta over this phase
(system-wide counter; host folds as MAX across workers).
max_gap_ms: u64Longest checkpoint-to-checkpoint wall gap during this phase (ms).
max_gap_cpu: usizeCPU where this phase’s longest gap happened — coupled with
max_gap_ms as an argmax pair (a bare max would desync the gap
from its CPU).
Trait Implementations§
Source§impl Clone for PhaseSlice
impl Clone for PhaseSlice
Source§fn clone(&self) -> PhaseSlice
fn clone(&self) -> PhaseSlice
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for PhaseSlice
impl Debug for PhaseSlice
Source§impl Default for PhaseSlice
impl Default for PhaseSlice
Source§fn default() -> PhaseSlice
fn default() -> PhaseSlice
Source§impl<'de> Deserialize<'de> for PhaseSlice
impl<'de> Deserialize<'de> for PhaseSlice
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl PartialEq for PhaseSlice
impl PartialEq for PhaseSlice
Source§impl Serialize for PhaseSlice
impl Serialize for PhaseSlice
impl Eq for PhaseSlice
impl StructuralPartialEq for PhaseSlice
Auto Trait Implementations§
impl Freeze for PhaseSlice
impl RefUnwindSafe for PhaseSlice
impl Send for PhaseSlice
impl Sync for PhaseSlice
impl Unpin for PhaseSlice
impl UnwindSafe for PhaseSlice
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more