성능 지표 정의 — Latency·Throughput·Utilization 분석
#한 줄 요약
“Latency·Throughput·Utilization” 세 축으로 성능을 그립니다. 임베디드에서는 jitter·deadline이 추가됩니다.
#3 핵심 지표
#Latency
한 작업이 완료되기까지 걸리는 시간을 의미합니다.
단위는 µs, ms, s입니다. 측정 방식은 single request 시간이거나 분포(p50·p99·max)입니다.
#Throughput
단위 시간당 처리량을 의미합니다.
초당 요청 수 (req/s)초당 byte 수 (MB/s, Gbps)초당 프레임 수 (FPS)단위는 req/s, bytes/s, ops/s입니다.
#Utilization
**자원 사용률(%)**을 의미합니다.
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)는 다음과 같습니다.
여기서 은 평균 대기 수, 는 도착률, 는 평균 대기 시간입니다.
자원 utilization이 100%에 근접하면 가 됩니다. 그래서 임베디드에서는 80% 한계를 권장합니다.
#Service Time vs Response Time
- 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가 크면 실시간 제어가 불가능합니다. 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
작업이 반드시 끝나야 할 시점을 의미합니다.
| Type | Miss 결과 |
|---|---|
| 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-caseHard 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 측정
80%를 넘으면 exponential하게 증가합니다. 그래서 70-80%가 안전 한계입니다.
#임베디드 추가 지표
#IPC (Instructions Per Cycle)
PMU CPU_CYCLES와 INST_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 DMIPSCortex-M4 @ 168 MHz: 350 DMIPSCortex-A53 @ 1.5 GHz: 3500 DMIPSDMIPS는 아주 거친 비교에만 적합합니다. 더 정밀하게 비교하려면 CoreMark나 EEMBC를 씁니다.
#CoreMark
비영리 EEMBC가 만든 임베디드 표준 벤치입니다. Standardized integer workload를 측정합니다.
Cortex-M0+ @ 50 MHz: 100 CoreMarkCortex-M4F @ 168 MHz: 850 CoreMarkRISC-V SiFive E31: 150 CoreMarkCoreMark/MHz가 효율(architecture 능력)을 비교하는 지표입니다.
#측정 — Time Source
| 시계 | 정밀도 | 사용 |
|---|---|---|
xTaskGetTickCount() | tick (1-10 ms) | task 단위 timing |
DWT->CYCCNT | 1 cycle | µs 단위 (Cortex-M) |
clock_gettime(CLOCK_MONOTONIC_RAW) | ns | Linux 정밀 |
| GPIO + 로직 분석기 | 1 ns | 외부 측정 (HW) |
| HW timer | clock 단위 | 임베디드 정밀 |
#Latency 분포 측정 예
#define BUCKETS 64static 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
- 1Embedded Performance Engineering — 임베디드 성능 엔지니어링 시리즈 소개
- 2임베디드 성능 분석 방법론 — Measure → Analyze → Optimize 사이클
- 3성능 지표 정의 — Latency·Throughput·Utilization 분석
- 4성능 측정의 기본 — Wall-Clock·CPU Cycle·Instruction Count
- 5성능 데이터 통계적 분석 — Percentile·Histogram·평균의 함정
- 6실시간 성능 분석 — WCET·Jitter·Deadline Miss 측정
- 7임베디드 벤치마킹 기초 — 재현성·Warmup·노이즈 제거
- 8성능 모델링 — Amdahl·Gustafson·Roofline Model 적용
- 9프로파일링 기법 개요 — Sampling vs Instrumentation·PGO·LTO
- 10CPU 파이프라인 분석 — 5-stage·Cortex-M·Cortex-A 비교
- 11Pipeline Stall 분석 — Data·Structural·Control Hazard·Forwarding
- 12Branch Prediction 분석 — Static·2-bit·BTB·BHT·Mispredict 비용
- 13Speculative Execution 분석 — OoO·Reorder Buffer·Register Renaming
- 14CPU Cache 기초 — L1·L2·L3·Set Associative·Replacement Policy
- 15Cache Miss 3C Model 분석 — Compulsory·Capacity·Conflict
- 16Cache Line 최적화 — Alignment·Prefetch·False Sharing 처리
- 17메모리 대역폭 분석 — STREAM·Roofline·Bus Saturation 측정
- 18SIMD·NEON 활용 — 128-bit Vector·Auto-Vectorization·SVE/SVE2
- 19PMU·HPM 하드웨어 카운터 분석 — 정밀 성능 진단
- 20임베디드 Bus Architecture — AHB·AXI·CHI 진화와 5-Channel
- 21Bus Contention 진단 — Arbitration·QoS·Starvation 측정
- 22DMA 성능 최적화 — Burst·Scatter-Gather·Chain·Cache 일관성
- 23DMA vs CPU Copy 성능 비교 — Break-even·Setup Overhead 실측
- 24Interrupt Latency 분석 — 진입·종료·Tail-Chaining·Late Arrival
- 25Interrupt Storm 처리 — NAPI·Rate-Limit·Polling 전환
- 26MMIO 접근 성능 — Cache Policy·Write-Combining·Volatile·Barrier
- 27Peripheral Clock 분석 — PLL·Divider·Gating·DVFS
- 28Power vs Performance 트레이드오프 — DVFS·Race-to-Idle·Big.LITTLE
- 29Thermal Throttling 분석 — Junction Temp·Trip Point·냉각
- 30CXL Interconnect 분석 — AI 시대 메모리 대역폭 확장
- 31Concurrency 기초 — Concurrency vs Parallelism·Race·Memory Model
- 32False Sharing 진단 — Cache Line Ping-Pong·Padding·측정
- 33Lock Contention 분석 — Wait·Hold·Convoy·측정 기법
- 34Spinlock 성능 분석 — Spin-Wait vs Context Switch·Ticket·MCS
- 35Mutex 성능 분석 — Futex·Adaptive·Priority Inheritance
- 36Reader-Writer Lock 성능 — Reader/Writer Priority·RCU·Seqlock
- 37Lock-Free 자료구조 성능 — CAS·ABA·Hazard Pointer·Epoch Reclamation
- 38Memory Ordering 분석 — Acquire·Release·Seq-Cst·ARM Relaxed Model
- 39Cache Coherency 프로토콜 — MESI·MOESI·Snoop·Directory
- 40SMP 성능 분석 — Per-Core·Affinity·Load Balance·Scalability
- 41Linux perf 기초 — stat·record·report 활용
- 42Linux perf 고급 — Raw Event·Tracepoint·perf script
- 43ftrace 활용 — function·function_graph·latency tracer
- 44eBPF·bpftrace 동적 트레이싱 — 커널 무수정 관측
- 45Flamegraph 분석 — On-CPU·Off-CPU·Differential
- 46ARM DS·Lauterbach 분석 — Hardware Trace 전문 도구
- 47Bare-metal 프로파일링 — GPIO·DWT·SysTick·ITM 활용
- 48NVIDIA Nsight Systems — GPU·NPU 포함 시스템 분석
- 49모던 프로파일러 비교 — Tracy·Hotspot·uftrace·Coz
- 50연속 프로파일링 — Parca·Pixie·Pyroscope·Tetragon
- 51실전 사례 — ISR Latency 100µs Deadline Miss 추적
- 52실전 사례 — Matrix Multiply가 예상의 10배 느린 이유
- 53실전 사례 — 8-core가 4-core를 넘으면 throughput이 떨어지는 이유
- 54실전 사례 — 카메라 1080p 60fps가 30fps로 떨어지는 이유
- 55CXL.mem 지연·대역폭 실측 — Direct·Switch·Pooled 토폴로지 비교
- 56CXL 성능 프로파일링 도구 — cxl-cli·DAMON·perf-mem 활용
- 57실전 사례 — CXL.mem 추가로 LLM inference KV cache 처리량 회복
관련 글
실시간 성능 분석 — WCET·Jitter·Deadline Miss 측정
Real-time 시스템의 측정 — 평균 아닌 worst-case. WCET 4 방법과 jitter·tardiness 분석.
CXL.mem 지연·대역폭 실측 — Direct·Switch·Pooled 토폴로지 비교
CXL.mem 토폴로지별 실측 — Direct attach·Single switch·Multi-host pool의 지연·대역폭 비용 측정.
실전 사례 — 카메라 1080p 60fps가 30fps로 떨어지는 이유
Cortex-A 보드의 카메라 캡처가 frame drop. CPU는 한가했고 진짜 범인은 DMA burst size와 AXI bus 효율이었다.