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

성능 지표 정의 — Latency·Throughput·Utilization 분석

· Hawk · 6분 읽기

#한 줄 요약

“Latency·Throughput·Utilization” 세 축으로 성능을 그립니다. 임베디드에서는 jitter·deadline이 추가됩니다.

#3 핵심 지표

#Latency

한 작업이 완료되기까지 걸리는 시간을 의미합니다.

요청부터 응답까지의 latency 구간

단위는 µs, ms, s입니다. 측정 방식은 single request 시간이거나 분포(p50·p99·max)입니다.

#Throughput

단위 시간당 처리량을 의미합니다.

초당 요청 수 (req/s)
초당 byte 수 (MB/s, Gbps)
초당 프레임 수 (FPS)

단위는 req/s, bytes/s, ops/s입니다.

#Utilization

**자원 사용률(%)**을 의미합니다.

UCPU=tbusyttotal,Umem=umtotal,Ubus=cactivectotalU_{CPU} = \frac{t_{busy}}{t_{total}}, \quad U_{mem} = \frac{u}{m_{total}}, \quad U_{bus} = \frac{c_{active}}{c_{total}}

100%에 도달하면 saturation 상태가 되고, queueing이 발생하면서 latency가 증가합니다.

#Latency vs Throughput — 상호 의존

작은 시스템에서는 보통 trade-off거나 직교 관계입니다.

초기 (utilization 낮음): throughput↑ → latency 거의 변화 X
중간 (50-70%): throughput↑ → latency 살짝 증가
포화 (90%+): throughput 한계 → latency 폭증

Queueing Theory (Little’s Law)는 다음과 같습니다.

L=λWL = \lambda \cdot W

여기서 LL은 평균 대기 수, λ\lambda는 도착률, WW는 평균 대기 시간입니다.

자원 utilization이 100%에 근접하면 WW \to \infty가 됩니다. 그래서 임베디드에서는 80% 한계를 권장합니다.

#Service Time vs Response Time

Service time과 Response time의 관계 — queue 대기 시간 포함 여부

  • Service Time은 실제 처리 시간입니다(queue 제외).
  • Response Time대기와 처리를 합한 시간이며, 사용자가 체감하는 값입니다.

평균 service time이 좋아도 queue 적체가 일어나면 response time이 폭증합니다.

#임베디드 — Jitter

Latency의 변동성을 의미합니다.

주기적 1ms PID task:
실제 wake: 1.000, 1.001, 0.998, 1.003, 0.997 ...

Jitter=maxmin=6 μs\text{Jitter} = \max - \min = 6\ \mu s

평균이 양호한데 jitter가 크면 실시간 제어가 불가능합니다. Audio, motor, camera 동기처럼 동기화가 핵심인 영역에서는 치명적입니다.

#Jitter 측정

TickType_t xLastWake = xTaskGetTickCount();
while (1) {
do_work();
vTaskDelayUntil(&xLastWake, period);
uint32_t actual = DWT->CYCCNT;
uint32_t expected = xLastWake * CYCLES_PER_TICK;
log_jitter(actual - expected);
}

Histogram을 누적하면서 분포를 분석합니다.

#임베디드 — Deadline

작업이 반드시 끝나야 할 시점을 의미합니다.

TypeMiss 결과
Hard시스템 실패 (브레이크, 인공호흡기)
Firm결과 무효 (실시간 거래)
Soft품질 저하 (비디오 frame drop)

Latency 대신 deadline 만족 여부가 metric이 됩니다. 즉, *deadline 안에 들어왔는가? 몇 % 들어왔는가?*를 봅니다.

#Percentile 표기

p50 (median) — 절반은 더 빠름
p90 — 10% 케이스만 더 느림
p99 — 1% 케이스만 더 느림
p999 — 0.1% (1000 중 1)
p9999 — 0.01%
max — worst-case

Hard real-time은 max ≤ deadline을 요구합니다. Soft는 p99·p999 ≤ deadline이면 됩니다.

#Long Tail

Histogram:

  • ▓▓▓▓▓▓▓▓
  • ▓ ▓▓▓▓▓▓▓▓▓
  • ▓ ▓ ▓▓▓▓▓▓▓▓▓ ▓ ▓ ▓ ← long tail
  • 1 10 100 1000 ms

평균 10 ms, p99 100 ms, max 1 s인 분포입니다. 사용자 체감을 결정하는 것은 long tail입니다.

원인으로는 cache miss, GC, context switch, bus contention이 있습니다. RAS(Reliability·Availability·Serviceability) 도구로 추적합니다.

#Saturation 측정

Resource 사용률과 응답 시간의 관계 — 80% 이상에서 exponential 증가

80%를 넘으면 exponential하게 증가합니다. 그래서 70-80%가 안전 한계입니다.

#임베디드 추가 지표

#IPC (Instructions Per Cycle)

PMU CPU_CYCLESINST_RETIRED의 ratio입니다.

IPC = 0.5 — 스트레스 (memory bound, stall)
IPC = 1.0 — 정상
IPC = 2.0+ — 슈퍼스칼라 활용

IPC가 낮으면 왜 낮은지 분석합니다. 원인은 cache miss, branch mispredict, stall 등입니다.

#Cache Hit Rate

double hit_rate = 1.0 - (cache_miss / cache_access);

L1은 보통 95-99%, L2는 80-95%, L3는 60-80%입니다. *임베디드(1-2 KB L1)*에서는 작은 working set을 가정합니다.

#MIPS / DMIPS

옛 단위입니다. MIPS는 millions of instructions per second입니다. DMIPS는 Dhrystone MIPS 벤치마크입니다.

Cortex-M0+ @ 50 MHz: 45 DMIPS
Cortex-M4 @ 168 MHz: 350 DMIPS
Cortex-A53 @ 1.5 GHz: 3500 DMIPS

DMIPS는 아주 거친 비교에만 적합합니다. 더 정밀하게 비교하려면 CoreMark나 EEMBC를 씁니다.

#CoreMark

비영리 EEMBC가 만든 임베디드 표준 벤치입니다. Standardized integer workload를 측정합니다.

Cortex-M0+ @ 50 MHz: 100 CoreMark
Cortex-M4F @ 168 MHz: 850 CoreMark
RISC-V SiFive E31: 150 CoreMark

CoreMark/MHz가 효율(architecture 능력)을 비교하는 지표입니다.

#측정 — Time Source

시계정밀도사용
xTaskGetTickCount()tick (1-10 ms)task 단위 timing
DWT->CYCCNT1 cycleµs 단위 (Cortex-M)
clock_gettime(CLOCK_MONOTONIC_RAW)nsLinux 정밀
GPIO + 로직 분석기1 ns외부 측정 (HW)
HW timerclock 단위임베디드 정밀

#Latency 분포 측정 예

#define BUCKETS 64
static uint32_t hist[BUCKETS];
static uint32_t max_val = 0;
void log_latency_us(uint32_t us) {
int idx;
// log2 bucket
if (us < 1) idx = 0;
else if (us < 4096) idx = 32 - __clz(us);
else idx = BUCKETS - 1;
hist[idx]++;
if (us > max_val) max_val = us;
}
// 주기적 출력
void print_hist(void) {
for (int i = 0; i < BUCKETS; i++)
if (hist[i]) printf("%d-%d us: %u\n", 1<<i, (1<<(i+1))-1, hist[i]);
printf("max: %u us\n", max_val);
}

#자주 하는 실수

⚠️ 평균만 보고 OK 판정

Median이 좋아도 long tail은 보이지 않습니다. 항상 p99·max를 함께 봅니다.

⚠️ Utilization 90%+ 목표

Queueing latency가 폭증합니다. 70-80%가 한계입니다.

⚠️ Tick rate으로 µs 측정 시도

1 kHz tick으로 µs latency를 측정하면 0 또는 1 ms로만 보입니다. 이때는 DWT 또는 hw timer를 씁니다.

⚠️ Throughput만 최적화

Throughput을 2배 빠르게 했는데 p99 latency가 3배 느려지면 사용자에게는 오히려 느려진 셈입니다. Trade-off를 인지해야 합니다.

#정리

  • 3 핵심 지표는 Latency, Throughput, Utilization입니다.
  • 임베디드에서는 Jitter와 Deadline이 추가됩니다.
  • Service time과 Response time은 다릅니다(queueing 영향).
  • Percentile과 max로 long tail을 추적합니다.
  • Utilization은 70-80%가 한계이며, 그 위에서는 queueing이 폭발합니다.
  • IPC와 CoreMark가 아키텍처 효율을 비교합니다.

다음 편은 측정의 기본입니다. wall-clock, CPU cycle, instruction count를 다룹니다.

#관련 항목

Embedded Performance Engineering · 3 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 처리량 회복