본문으로 건너뛰기
Embedded Performance Engineering · 5/57

실시간 성능 분석 — WCET·Jitter·Deadline Miss 측정

· Hawk · 5분 읽기

#한 줄 요약

**“평균이 아니라 worst”**입니다. Real-time에서는 max ≤ deadline이 기준이며, 일반 시스템과 평가 기준 자체가 다릅니다.

#Real-Time의 핵심 지표

지표의미
WCETWorst-Case Execution Time
Deadline MissDeadline 넘긴 횟수
JitterLatency 변동
Tardiness늦은 정도 (deadline 넘긴 시간)
Release Jittertask 실행 시작 지연

#WCET — 측정 4 방법

#1. Static Analysis (정적 분석)

소스와 CPU 모델로부터 모든 path의 WCET를 계산합니다. 상용 도구로는 aiT(AbsInt)와 Bound-T가 있습니다.

WCETfunc=maxppathsWCET(p)\text{WCET}_{\text{func}} = \max_{p \in \text{paths}} \text{WCET}(p)

수학적 보장이 장점입니다. 다만 비싸고 setup이 복잡합니다.

#2. Measurement-Based

uint32_t max_cycles = 0;
for (int i = 0; i < N; i++) {
uint32_t t = DWT->CYCCNT;
work(input[i]);
uint32_t elapsed = DWT->CYCCNT - t;
if (elapsed > max_cycles) max_cycles = elapsed;
}
WCET_est = max_cycles * SAFETY_FACTOR; // 보통 1.2-1.5×

Coverage가 보장되지 않습니다. 측정하지 않은 path가 더 느릴 가능성이 있습니다.

#3. Hybrid

Static analysis로 bound를 계산하고 measurement로 typical case를 잡습니다. 정밀도와 비용의 균형이 좋습니다.

#4. Probabilistic WCET (pWCET)

확률 분포로 표현합니다. 예를 들어 “99.999% 확률로 80 µs 미만”처럼 말합니다. Extreme Value Theory를 활용하며, 자동차나 항공 분야에서 도입되고 있습니다.

#Jitter 분석

// 1ms 주기 task
TickType_t xLast = xTaskGetTickCount();
while (1) {
uint32_t t = DWT->CYCCNT;
process();
vTaskDelayUntil(&xLast, pdMS_TO_TICKS(1));
uint32_t period_actual = DWT->CYCCNT - t;
uint32_t period_expected = SystemCoreClock / 1000;
int32_t jitter = period_actual - period_expected;
log_jitter(jitter);
}

Jitter 분포를 보면서 기준 ±10% 안이면 OK로 판정합니다. 더 크면 원인을 추적합니다.

#Jitter 원인

  • Higher-priority preemption
  • ISR latency
  • Cache miss (Cortex-A)
  • DMA contention
  • Tickless wake delay

#Deadline Miss 카운트

void task(void *arg) {
TickType_t deadline = xTaskGetTickCount() + DEADLINE_TICKS;
while (1) {
if (xTaskGetTickCount() > deadline) {
miss_count++;
}
process();
deadline = xTaskGetTickCount() + DEADLINE_TICKS;
}
}

Counter를 누적하고 주기적으로 출력합니다. Production에서는 miss rate에 대한 alerting을 둡니다.

#Tardiness — 얼마나 늦었나

Deadline을 넘긴 시간을 의미합니다. 단순 miss count보다 정보량이 많습니다.

int32_t tardiness = (now - deadline); // > 0이면 늦음
log_tardiness(tardiness);

Tardiness 분포를 보면서 얼마나 심각한지를 판정합니다.

#Cyclictest — Linux RT 표준

Terminal window
sudo cyclictest -p 80 -t 1 -i 1000 -l 100000 -m
# T: 0 (12345) P:80 I:1000 C:100000 Min:5 Avg:7 Max:23

p99와 max latency를 측정합니다. PREEMPT_RT에서 worst-case를 검증할 때 씁니다. 핵심은 수일에 걸친 측정으로 outlier를 capture하는 것입니다.

#Latency Budget 분석

PID 1ms 주기, deadline 1ms
ISR latency : 50 ns
Scheduler latency: 2 µs
Context switch : 3 µs
PID compute : 95 µs (WCET)
Actuator write : 10 µs
────────────────────────
Total worst case: ~110 µs
여유 = 890 µs (89%) — 안전

Component별로 budget을 고정해 두고, 컴포넌트별로 WCET를 분석합니다.

#Hard vs Soft RT — 측정 차이

Hard RTSoft RT
Deadline miss0회 (모든 경우)<1%
측정 기간무한 (수학 증명)수일
WCET 산출Static analysisMeasurement + 1.5×
Test coverageMC/DCfunctional
인증DO-178C·ISO 26262 ASIL D없음

#Schedulability Analysis

WCET를 알면 전체 시스템의 schedulability를 증명할 수 있습니다.

#Utilization Bound (Liu-Layland)

i=1nCiTin(21/n1)\sum_{i=1}^{n} \frac{C_i}{T_i} \leq n \cdot (2^{1/n} - 1)

#Response Time Analysis (RTA)

각 task의 worst response time은 다음과 같이 구합니다.

Ri=Ci+jhp(i)RiTjCjR_i = C_i + \sum_{j \in hp(i)} \left\lceil \frac{R_i}{T_j} \right\rceil \cdot C_j

Iterative하게 풉니다. RiDiR_i \leq D_i(deadline)이면 schedulable입니다.

Cheddar와 SymTA/S 같은 도구가 이 과정을 자동화합니다.

#Release Jitter

Task가 정확히 release되어야 할 시점실제 시작 시점의 차이를 의미합니다.

이상: release at t=0, 5, 10, 15, ... ms (정확 5ms 주기)
실제: t=0.05, 5.12, 9.98, 15.30, ...
release jitter = 5.30 - 5.00 = 0.30 ms

원인으로는 tick granularity, higher-priority preemption, ISR latency가 있습니다.

#측정 시 함정

#Probe Effect

측정 코드 자체가 측정 대상에 영향을 줍니다. printf를 추가하면 1 ms가 지연되기도 합니다.

해결책은 light-weight tracing(DWT, GPIO, ring buffer)입니다.

#Thermal Drift

장시간 부하가 걸리면 온도가 상승하고 throttling이 일어납니다. 측정 후반부의 latency가 증가합니다.

해결책은 fan이나 heatsink를 두고 thermal sensor로 모니터링하는 것입니다.

#Stationarity

부팅 직후에는 시스템이 cold 상태였다가 점차 warm해집니다. 최소 1분 warmup 후에 측정합니다.

#자주 하는 실수

⚠️ Avg WCET 사용

평균은 WCET가 아닙니다. Max에 safety factor를 곱한 값을 씁니다.

⚠️ Single workload만

Worst-case를 유발하는 input은 다릅니다. 대표 input set을 준비해야 합니다.

⚠️ Lab 환경 = production

Production 환경에는 DMA, noise, thermal이 추가됩니다. 실 환경에서 측정해야 합니다.

⚠️ Linux mainline = real-time

Mainline은 best-effort입니다. PREEMPT_RT 패치만 RT-capable입니다.

#정리

  • Real-time에서는 WCET, jitter, deadline miss, tardiness를 측정합니다.
  • WCET 측정에는 4가지 방법이 있습니다. static, measurement, hybrid, probabilistic입니다.
  • Cyclictest가 Linux RT의 표준입니다.
  • Latency budget 분석으로 컴포넌트별 WCET 책임을 나눕니다.
  • Schedulability proof는 RTA와 WCET의 조합으로 가능합니다.

다음 편은 벤치마킹 기초입니다. 재현성과 warmup, 노이즈 제거를 다룹니다.

#관련 항목

Embedded Performance Engineering · 6 of 57

  1. 1Embedded Performance Engineering — 임베디드 성능 엔지니어링 시리즈 소개
  2. 2임베디드 성능 분석 방법론 — Measure → Analyze → Optimize 사이클
  3. 3성능 지표 정의 — Latency·Throughput·Utilization 분석
  4. 4성능 측정의 기본 — Wall-Clock·CPU Cycle·Instruction Count
  5. 5성능 데이터 통계적 분석 — Percentile·Histogram·평균의 함정
  6. 6실시간 성능 분석 — WCET·Jitter·Deadline Miss 측정
  7. 7임베디드 벤치마킹 기초 — 재현성·Warmup·노이즈 제거
  8. 8성능 모델링 — Amdahl·Gustafson·Roofline Model 적용
  9. 9프로파일링 기법 개요 — Sampling vs Instrumentation·PGO·LTO
  10. 10CPU 파이프라인 분석 — 5-stage·Cortex-M·Cortex-A 비교
  11. 11Pipeline Stall 분석 — Data·Structural·Control Hazard·Forwarding
  12. 12Branch Prediction 분석 — Static·2-bit·BTB·BHT·Mispredict 비용
  13. 13Speculative Execution 분석 — OoO·Reorder Buffer·Register Renaming
  14. 14CPU Cache 기초 — L1·L2·L3·Set Associative·Replacement Policy
  15. 15Cache Miss 3C Model 분석 — Compulsory·Capacity·Conflict
  16. 16Cache Line 최적화 — Alignment·Prefetch·False Sharing 처리
  17. 17메모리 대역폭 분석 — STREAM·Roofline·Bus Saturation 측정
  18. 18SIMD·NEON 활용 — 128-bit Vector·Auto-Vectorization·SVE/SVE2
  19. 19PMU·HPM 하드웨어 카운터 분석 — 정밀 성능 진단
  20. 20임베디드 Bus Architecture — AHB·AXI·CHI 진화와 5-Channel
  21. 21Bus Contention 진단 — Arbitration·QoS·Starvation 측정
  22. 22DMA 성능 최적화 — Burst·Scatter-Gather·Chain·Cache 일관성
  23. 23DMA vs CPU Copy 성능 비교 — Break-even·Setup Overhead 실측
  24. 24Interrupt Latency 분석 — 진입·종료·Tail-Chaining·Late Arrival
  25. 25Interrupt Storm 처리 — NAPI·Rate-Limit·Polling 전환
  26. 26MMIO 접근 성능 — Cache Policy·Write-Combining·Volatile·Barrier
  27. 27Peripheral Clock 분석 — PLL·Divider·Gating·DVFS
  28. 28Power vs Performance 트레이드오프 — DVFS·Race-to-Idle·Big.LITTLE
  29. 29Thermal Throttling 분석 — Junction Temp·Trip Point·냉각
  30. 30CXL Interconnect 분석 — AI 시대 메모리 대역폭 확장
  31. 31Concurrency 기초 — Concurrency vs Parallelism·Race·Memory Model
  32. 32False Sharing 진단 — Cache Line Ping-Pong·Padding·측정
  33. 33Lock Contention 분석 — Wait·Hold·Convoy·측정 기법
  34. 34Spinlock 성능 분석 — Spin-Wait vs Context Switch·Ticket·MCS
  35. 35Mutex 성능 분석 — Futex·Adaptive·Priority Inheritance
  36. 36Reader-Writer Lock 성능 — Reader/Writer Priority·RCU·Seqlock
  37. 37Lock-Free 자료구조 성능 — CAS·ABA·Hazard Pointer·Epoch Reclamation
  38. 38Memory Ordering 분석 — Acquire·Release·Seq-Cst·ARM Relaxed Model
  39. 39Cache Coherency 프로토콜 — MESI·MOESI·Snoop·Directory
  40. 40SMP 성능 분석 — Per-Core·Affinity·Load Balance·Scalability
  41. 41Linux perf 기초 — stat·record·report 활용
  42. 42Linux perf 고급 — Raw Event·Tracepoint·perf script
  43. 43ftrace 활용 — function·function_graph·latency tracer
  44. 44eBPF·bpftrace 동적 트레이싱 — 커널 무수정 관측
  45. 45Flamegraph 분석 — On-CPU·Off-CPU·Differential
  46. 46ARM DS·Lauterbach 분석 — Hardware Trace 전문 도구
  47. 47Bare-metal 프로파일링 — GPIO·DWT·SysTick·ITM 활용
  48. 48NVIDIA Nsight Systems — GPU·NPU 포함 시스템 분석
  49. 49모던 프로파일러 비교 — Tracy·Hotspot·uftrace·Coz
  50. 50연속 프로파일링 — Parca·Pixie·Pyroscope·Tetragon
  51. 51실전 사례 — ISR Latency 100µs Deadline Miss 추적
  52. 52실전 사례 — Matrix Multiply가 예상의 10배 느린 이유
  53. 53실전 사례 — 8-core가 4-core를 넘으면 throughput이 떨어지는 이유
  54. 54실전 사례 — 카메라 1080p 60fps가 30fps로 떨어지는 이유
  55. 55CXL.mem 지연·대역폭 실측 — Direct·Switch·Pooled 토폴로지 비교
  56. 56CXL 성능 프로파일링 도구 — cxl-cli·DAMON·perf-mem 활용
  57. 57실전 사례 — CXL.mem 추가로 LLM inference KV cache 처리량 회복