π English Abstract
This article provides a comprehensive troubleshooting guide for resolving GStreamer buffer bottlenecks and latency accumulation in multi-channel RTSP intelligent surveillance systems using NVIDIA Jetson Orin and DeepStream SDK. It covers architectural optimizations for NVMM Zero-Copy memory handling, TensorRT engine quantization (INT8/FP16), dynamic batching, and custom pipeline queue properties. Implementing these low-level performance tuning strategies ensures stable real-time AI inference and minimizes frame drops across high-density IP camera streams.
μ€λ§νΈ μν°, κ΄μ μΌν° λ° μ°μ νμ₯μμ μλν¬μΈνΈ μ£μ§ λλ°μ΄μ€(Edge Device)λ₯Ό νμ©ν λ€μ±λ μ€μκ° μμ λΆμ μμ€ν κ΅¬μΆ μμκ° κΈμ¦νκ³ μμ΅λλ€. νΉν NVIDIA Jetson Orin μ리μ¦μ DeepStream SDKμ μ‘°ν©μ κ³ μ±λ₯ AI μΆλ‘ λͺ¨λΈκ³Ό λ―Έλμ΄ νμ΄νλΌμΈ μ²λ¦¬λ₯Ό λ¨μΌ μ£μ§ μμ€ν μμ κ°λ₯νκ² λ§λλ μ΅μ μ μ νμ§λ‘ νκ°λ°μ΅λλ€.
κ·Έλ¬λ μ€μ νμ₯μ λ€μ±λ(16μ±λ μ΄μ) RTSP(Real-Time Streaming Protocol) μΉ΄λ©λΌ μ€νΈλ¦Όμ μ°λν΄λ³΄λ©΄, μμ€ν μ΄μ μκ°μ΄ μ§λ¨μ λ°λΌ μμ μ§μ°(Latency Accumulation)μ΄ μ μ μ¬κ°ν΄μ§κ±°λ νΉμ μ±λμμ νλ μ λλ½(Frame Drop), μ¬μ§μ΄ νμ΄νλΌμΈμ΄ λ©μΆλ(Pipeline Stall) νΈλ¬λΈμν μν©μ μμ£Ό μ§λ©΄ν©λλ€. μ΄λ¬ν λ¬Έμ μ κ·Όλ³Έ μμΈμ λλΆλΆ GStreamer λ²νΌ κ΄λ¦¬(Buffer Management) λΆκ· ν, λ©λͺ¨λ¦¬ λ³΅μ¬ λΉμ©(Memory Copy Overhead), κ·Έλ¦¬κ³ λ₯λ¬λ μΆλ‘ μμ§μΈ TensorRT λ°°μΉ μ²λ¦¬(Batching) λ―Έμ΅μ νμμ λ°μν©λλ€.
λ³Έ ν¬μ€ν μμλ NVIDIA Jetson Orin μν€ν μ² νκ²½μμ DeepStream κΈ°λ° λ€μ±λ RTSP κ΄μ μμ€ν μ μ΄μ©ν λ λ°μνλ μ§μ° λ³λͺ© νμμ 체κ³μ μΌλ‘ λΆμνκ³ , μ΄λ₯Ό κ·Όλ³Έμ μΌλ‘ ν΄κ²°νκΈ° μν NVMM Zero-Copy μ΅μ ν, GStreamer ν(Queue) λ²νΌ μ μ΄, κ·Έλ¦¬κ³ TensorRT μΆλ‘ μμ§ νλ λ°©λ²μ μ€λ¬΄ κ΄μ μμ μμΈν κΈ°μ ν©λλ€.
1. GStreamer νμ΄νλΌμΈ λ²νΌ λ³λͺ© λ° μ§μ° λ°μ μμΈ λΆμ
λ€μ±λ RTSP λΉλμ€ μ€νΈλ¦¬λ°μ μ²λ¦¬ν λ νμ΄νλΌμΈ λ΄λΆμμ μ§μ°μ΄ μμ΄λ μ£Όμ μμΈμ λΉλκΈ° λ€νΈμν¬ μμ μλμ λμ½λ© λ° AI μΆλ‘ μλ κ°μ λΆκ· ν(Speed Mismatch) λλ¬Έμ λλ€. GStreamer νμ΄νλΌμΈμ μ¬λ¬ μμ(Elements)κ° μ°κ²°λμ΄ λ°μ΄ν°λ₯Ό μ λ¬νλ ꡬ쑰μΈλ°, νΉμ ꡬκ°μμ μ²λ¦¬κ° λ¦μ΄μ§λ©΄ μμ λ²νΌκ° λ΄λΆ ν(Queue)μ μμ΄κ² λ©λλ€.
κ°. RTSP μμ λΆμ λμ½λ νλμ¨μ΄ κ°μ λ³λͺ©
κΈ°λ³Έ rtspsrc νλ¬κ·ΈμΈμ λ€νΈμν¬ ν¨ν· μμ€ μ μ¬μ μ‘ μμ²(RTCP) λ° μ§ν° λ²νΌ(Jitter Buffer)λ₯Ό νμ±νν©λλ€. μ΄ κ³Όμ μμ λ€νΈμν¬ λκΈ°ν μ§μ°μ΄ λ°μνλ©΄ λμ½λ(nvv4l2decoder)λ‘ μ
λ ₯λλ λΉλμ€ νλ μμ΄ μΌμμ μΌλ‘ μ§μ°λ©λλ€. μ΄ν νκΊΌλ²μ λ°λ € λ€μ΄μ€λ λ²νΌ(Burst Traffic)λ₯Ό λμ½λκ° μ λ μλΉνμ§ λͺ»νλ©΄, λ΄λΆ λ©λͺ¨λ¦¬ ν λΉ μ νμΌλ‘ μΈν΄ μ 체 νμ΄νλΌμΈ μ€λ λκ° λΈλ‘νΉ(Blocking) μνμ λΉ μ§λλ€.
λ. GStreamer ν(Queue) μ€μ λ―Έν‘μΌλ‘ μΈν μ§μ° λμ
νμ΄νλΌμΈ κ° μ€λ λ κ° μμΆ© μμ©μ νλ queue μμμ κΈ°λ³Έ μ€μ κ°μ λ²νΌ κ°μ(max-size-buffers=200) λλ μκ°(max-size-time=1000000000) κΈ°λ°μΌλ‘ ν¬κ² μ‘ν μλ κ²½μ°κ° λ§μ΅λλ€. μ€μκ° κ°μ μμ€ν
μμ λ°±λ‘κ·Έ(Backlog) λ²νΌλ₯Ό 무μ νμΌλ‘ μμλκ² λλ©΄, νμ¬ μ€μκ° νλ©΄λ³΄λ€ μμ΄μμ μμμ΄ λ€μ³μ§ κ³Όκ±° νλ μμ λ€λ¦κ² μΆλ‘ νκ² λλ μ€μκ°μ± μμ€ νμμ΄ λ°μν©λλ€.
- λ€νΈμν¬ μ§ν°(Network Jitter): RTSP ν¨ν· λλ¬ μκ°μ λΆκ·μΉμ±μΌλ‘ μΈν λμ½λ λ²νΌλ§ λ°μ
- λμ½λ© μ€λ λ λ³λͺ©: NVDEC(NVIDIA Hardware Decoder)μ λ©ν°μ±λ κ°μ νκ³ μ΄κ³Ό λ° λ©λͺ¨λ¦¬ λμν λΆμ‘±
- ν λ²νΌ μ€λ²νλ‘μ°: λμ λ μ νλ μ λ²νΌκ° GPU λ©λͺ¨λ¦¬λ₯Ό μ μ νμ¬ μ 체 μμ€ν μλ΅μ± μ ν
2. NVMM Zero-Copy λ©λͺ¨λ¦¬ μν€ν μ² μ΅μ ν
NVIDIA Jetson μμ€ν μν€ν μ²λ CPU(Host System RAM)μ GPU(Device RAM)κ° λ¬Όλ¦¬μ μΌλ‘ λμΌν SoC λ΄μ DRAMμ 곡μ νλ ν΅ν© λ©λͺ¨λ¦¬ ꡬ쑰(Unified Memory Architecture)λ₯Ό κ°μ§λλ€. νμ§λ§ μννΈμ¨μ΄ κ³μΈ΅μμ μ΄λ₯Ό μ λλ‘ νμ©νμ§ μμΌλ©΄ CPUμ GPU κ° λΆνμν λ©λͺ¨λ¦¬ 볡μ¬κ° λ°λ³΅μ μΌλ‘ μΌμ΄λ νμ΄νλΌμΈ λ³λͺ©μ κ²°μ μ μμΈμ΄ λ©λλ€.
κ°. NVMM(NVIDIA Video Memory Management)μ ν΅μ¬ κ°λ
GStreamer κΈ°λ³Έ νμ΄νλΌμΈμ νλ μ λ²νΌλ₯Ό μμ€ν
λ©λͺ¨λ¦¬ 곡κ°(video/x-raw)μ ν λΉν©λλ€. λ°λ©΄ DeepStream νλ¬κ·ΈμΈλ€μ NVIDIA κ³ μ μ NVMM λ©λͺ¨λ¦¬(video/x-raw(memory:NVMM)) ν¬λ§·μ μ¬μ©νμ¬ νλ μ λ°μ΄ν°λ₯Ό GPU μ μ© νλμ¨μ΄ λΈλ‘(NVDEC, VIC, NVENC, Tensor Core) μ¬μ΄μμ λ©λͺ¨λ¦¬ λ³΅μ¬ μμ΄ ν¬μΈν° λ³κ²½λ§μΌλ‘ μ λ¬νλ μ λ‘ μΉ΄νΌ(Zero-Copy)λ₯Ό μνν©λλ€.
λ. λ©μΈ λ©λͺ¨λ¦¬ λ³ν μ΅μν μ λ΅
νμ΄νλΌμΈ λ΄λΆ μμ κ° λ°μ΄ν° μ λ¬ μ CapsFilterλ₯Ό μ€μ ν λ λ°λμ NVMM λ©λͺ¨λ¦¬λ₯Ό μ μ§νλλ‘ κ°μ ν΄μΌ ν©λλ€. CPU λ©λͺ¨λ¦¬λ‘μ μ°ν λ³ν(Format Conversion)μ μμ λ κ²μ΄ ν΅μ¬μ λλ€.
| κ΅¬λΆ | μΌλ° GStreamer νμ΄νλΌμΈ | DeepStream NVMM Zero-Copy |
|---|---|---|
| λ©λͺ¨λ¦¬ ν λΉ μμΉ | CPU Host System RAM | NVMM (Unified Device Memory) |
| νλ μ μ λ¬ λ°©μ | CPU-GPU κ° λ³΅μ¬ (cudaMemcpy) |
νλμ¨μ΄ ν¬μΈν° μ λ¬ (Zero-Copy) |
| CPU μ μ μ¨ λ° Latency | λμ CPU μ¬μ©λ / μ§μ° κΈμ¦ | μ΅μ CPU μ¬μ©λ / κ·Ήλ¨μ μ§μ° κ°μ |
C/C++ λλ Python κΈ°λ° DeepStream μμ© νλ‘κ·Έλ¨ κ°λ° μ, λ©νλ°μ΄ν°μ μ κ·Όν λλ νλ μ μ΄λ―Έμ§ μ체λ₯Ό 볡μ¬νλ NvBufSurface λ©λͺ¨λ¦¬ μ κ·Ό λμ NvDsBatchMeta ν¬μΈν° 체μΈλ§ μ°Έμ‘°νλ λ°©μμΌλ‘ ꡬνν΄μΌ CPU μ λ‘ μΉ΄νΌ μμΉμ΄ μ μ§λ©λλ€.
3. TensorRT μμ§ μ°λ λ° λ€μ±λ λ°°μΉ(Batching) μ΅μ ν
Jetson Orinμ Tensor Core μ±λ₯μ 100% μ΄λμ΄λ΄κΈ° μν΄μλ ONNX λͺ¨λΈμ Jetson Orin νκ² νλμ¨μ΄μ λ§μΆ° TensorRT μμ§(Plan File)μΌλ‘ μ λ°νκ² μ»΄νμΌνκ³ , DeepStreamμ nvstreammux λ° nvinfer λͺ¨λμ μ‘°νλ‘κ² μ μ΄ν΄μΌ ν©λλ€.
κ°. INT8 μμν(Quantization) λ° μΊλ¦¬λΈλ μ΄μ
Jetson Orinμ FP32 μ°μ° λλΉ INT8 μ λ°λ μ¬μ© μ λν ν₯μλ TOPS(Trillion Operations Per Second) μ±λ₯μ μ 곡ν©λλ€. nvinfer κ΅¬μ± νμΌ(Config)μμ INT8 μΊλ¦¬λΈλ μ΄μ
μΊμ(Calibration Cache)λ₯Ό μ μ©νμ¬ μ λ°λ μμ€μ μ΅μννλ©΄μ μΆλ‘ μλλ₯Ό 2λ°° μ΄μ λμ΄μ¬λ¦΄ μ μμ΅λλ€.
λ. dynamic batching λ° nvstreammux νλ
16μ±λ μ€νΈλ¦Όμ λ
립μ μΌλ‘ μΆλ‘ νλ©΄ GPU νμΌλ§ λ° μ»€λ λ°μΉ μ€λ²ν€λκ° μ»€μ§λλ€. nvstreammux νλ¬κ·ΈμΈμ μ¬μ©νμ¬ Nκ° μ±λμ λΉλμ€ νλ μμ νλλ‘ λ¬Άμ΄(Batch) TensorRTμ 곡κΈν΄μΌ ν©λλ€.
- batch-size: μ 체 RTSP μ±λ μμ λμΌνκ² μ€μ (μ: 16)
- batched-push-timeout: νλ μμ΄ λͺ¨λ λͺ¨μΌ λκΉμ§ κΈ°λ€λ¦¬λ μ΅λ μκ°(Microsecond λ¨μ). λ§μ½ 30fps νκ²½μ΄λΌλ©΄
33000(33ms) λ΄μΈλ‘ μ€μ νμ¬ μΌλΆ μ±λμ νλ μ μ κ³ κ° λ¦μ΄μ§λλΌλ μ ν μκ° λ΄ λ°λ‘ μΆλ‘ μ μ§ννλλ‘ κ°μ ν¨ (μ§μ° λ°©μ§ ν΅μ¬ νλΌλ―Έν°) - nvbuf-memory: Jetson Orin νκ²½μμλ
nvbuf-memory=0(Default NVMM) λλnvbuf-memory=4(Unified) μ ν
4. μ€λ¬΄ νΈλ¬λΈμν : μ§μ° μ κ±°λ₯Ό μν νμ΄νλΌμΈ ꡬ체 μ€μ
μ€μ λ€μ±λ RTSP κ΄μ νμ΄νλΌμΈμμ λ²νΌ λ°λ¦Ό νμμ λ°©μ§νλ ν΅μ¬ κΈ°λ²μ 'μ€μκ° λ²νΌ λλ‘ μ λ΅(Leaky Queue)'κ³Ό 'RTSP λ λλ§ λκΈ°ν ν΄μ 'μ λλ€.
κ°. Leaky Queue μ μ©μ ν΅ν μ€μκ° νλ μ μ μ§
λ€νΈμν¬ λΆμμ μ΄λ μκ°μ μΈ μΆλ‘ λ³λͺ©μΌλ‘ νλ μμ΄ μμΌ λ, μ νλ μμ λ²λ¦¬κ³ κ°μ₯ μ΅κ·Ό νλ μλ§ μ μ§νλλ‘ ν μμ±μ λ³κ²½ν©λλ€.
queue leaky=2 max-size-buffers=1 max-size-bytes=0 max-size-time=0
μ μ€μ μμ leaky=2 (downstream/downstream-leaky) λλ leaky=1 (upstream) μμ±μ μ§μ νλ©΄ νκ° κ°λ μ°Όμ λ μ€λλ λ²νΌλ₯Ό μ¦μ λλ‘(Drop)νμ¬ μ§μ° μ μ
μ 물리μ μΌλ‘ μ°¨λ¨ν©λλ€.
λ. RTSP μμ λΆ(rtspsrc) μ΅μ ν νλΌλ―Έν°
RTSP μμ€ λ¨μμλΆν° μ§μ°μ μ΅λλ‘ μ€μ΄κΈ° μν΄ λ€μ νλ¬κ·ΈμΈ μμ± μ‘°μ μ κΆμ₯ν©λλ€.
- latency=0: RTSP μ§ν° λ²νΌ ν¬κΈ°λ₯Ό μ΅μννμ¬ μ€μκ° ν¨ν· μ μ‘ μμ
- drop-on-latency=true: μ§μ λ λΌν μ μ΄κ³Ό μ νλ μ λλ‘ νμ©
- protocols=tcp: UDP μμ μ λ°μνλ ν¨ν· μ μ€λ‘ μΈν νλ©΄ κΉ¨μ§ λ° λμ½λ μ¬λκΈ°ν μ§μ° λ°©μ§λ₯Ό μν΄ μμ μ μΈ TCP μ μ‘ κ°μ
λ€. DeepStream latency μΈ‘μ λꡬ νμ©
μμ€ν
μ μ νν μ§μ° λ³λͺ© ꡬκ°μ μ°ΎκΈ° μν΄ DeepStreamμμ μ 곡νλ Latency Measurement APIλ₯Ό νμ±νν©λλ€. νκ²½ λ³μλ‘ NVDS_ENABLE_LATENCY_MEASUREMENT=1μ μμΆ(Export)ν ν μ€ννλ©΄ κ° νλ¬κ·ΈμΈ μμ(Dec -> Mux -> Infer -> OSD)λ³ μ²΄λ₯ μκ°μ λ°λ¦¬μ΄(ms) λ¨μλ‘ μ νν λ‘κΉ
ν μ μμ΅λλ€.
5. κ²°λ‘ λ° μ΅μ ν μμ½
NVIDIA Jetson Orinκ³Ό DeepStream SDK κΈ°λ°μ λ€μ±λ RTSP μμ€ν κ΅¬μΆ μ λ°μνλ νμ΄νλΌμΈ μ§μ° νμμ λ¨μν HW μ±λ₯ λΆμ‘± λλ¬Έμ΄ μλλΌ, μννΈμ¨μ΄ λ©λͺ¨λ¦¬ νμ΄νλΌμΈμ λΆνμν Copy λ° λ²νΌ μ μ΄ λ―Έν‘μμ λΉλ‘―λλ κ²½μ°κ° λλΆλΆμ λλ€.
- NVMM Zero-Copy κ°μ : νμ΄νλΌμΈ μ ꡬκ°μμ
video/x-raw(memory:NVMM)ν¬λ§·μ μ μ§νμ¬ CPU/GPU λ©λͺ¨λ¦¬ λ³΅μ¬ μ΅μν - Leaky Queue λμ
: λμ½λ μ΄ν λ° Muxer μ΄μ λ¨κ³μ
leaky=2 max-size-buffers=1κΈ°λ° νλ₯Ό λ°°μΉνμ¬ μ€μκ° νλ μ λκΈ° μ μ§ - nvstreammux νμμμ μ μ΄:
batched-push-timeoutμμ±μ μ€μκ° νλ μλ μ΄νΈμ λ§μΆ° μΆμ μ€μ νμ¬ μΆλ‘ λκΈ° μ§μ° λ°©μ§ - TensorRT INT8 μμν: μμ§ μ λ°λ μ νμ ν΅ν μΆλ‘ μλ κ·Ήλνλ‘ νλ₯(Downstream) λ³λͺ© ν΄μ
μμ μν€ν μ² κ°μ΄λλ₯Ό μμ€ν νμ΄νλΌμΈ μ€κ³ λ° νΈλ¬λΈμν κ³Όμ μ μ μ©νλ€λ©΄, 16μ±λ μ΄μμ κ³ λ°λ IP μΉ΄λ©λΌ μ€νΈλ¦Ό κ΄μ νκ²½μμλ νλ μ μ§μ° μλ μμ μ μΈ μ€μκ° AI κ΄μ μμ€ν μ μ±κ³΅μ μΌλ‘ μ΄μ©ν μ μμ΅λλ€.