피드로 돌아가기
How I Built a C++ Market Data Parser That Processes 5.5 Million Messages/Sec
Dev.toDev.to
Backend

C++20 기반 5.5M msgs/sec 처리 및 P50 84ns 달성 초저지연 파서 설계

How I Built a C++ Market Data Parser That Processes 5.5 Million Messages/Sec

Piyush Kumar2026년 4월 26일4advanced

Context

고빈도 매매(HFT) 환경의 NASDAQ ITCH 5.0 등 대규모 바이너리 피드 처리 시 발생하는 I/O 복사 오버헤드와 메모리 할당의 비결정적 지연 시간 해결이 필요함. 표준 라이브러리의 힙 할당 및 Linked List 기반 자료구조로 인한 CPU 캐시 미스가 심각한 병목 지점으로 작용함.

Technical Solution

  • mmap 및 Direct Buffer Casting을 통한 Zero-Copy 구현으로 I/O 버퍼의 애플리케이션 구조체 복사 비용 제거
  • std::string_view 활용으로 문자열 처리 시 발생하는 힙 할당을 완전히 배제한 포인터 기반 참조 구조 설계
  • std::pmr::monotonic_buffer_resource 기반 Arena Allocator 도입으로 O(1) 메모리 할당 및 데이터 연속성 확보
  • Open-addressing 방식의 DenseMap 구현을 통해 Separate Chaining의 포인터 추적을 제거하고 L1/L2 캐시 적중률 극대화
  • Branch-free bitwise 연산을 통한 엔디안 변환으로 명령어 파이프라인 중단(Stall) 방지 및 처리 효율 향상

Impact

  • 처리량: NASDAQ ITCH 기준 초당 최대 5.5 Million messages(169 MB/s) 처리
  • 지연 시간: 메시지당 P50 Latency 84 nanoseconds 달성
  • 실제 데이터 처리: 11.24 GB 파일(약 3.68억 개 메시지)을 97.48초 만에 파싱 완료

Key Takeaway

하드웨어 특성을 이해하는 Mechanical Sympathy를 통해 OS 커널과 표준 힙의 개입을 최소화함으로써 단일 스레드 처리량을 극한으로 끌어올린 사례임.


- 고성능 파싱 필요 시 mmap과 reinterpret_cast를 이용한 Zero-Copy 구조 검토 - Hot-path 내 std::unordered_map 대신 캐시 효율적인 Open-addressing 해시맵 고려 - 런타임 할당 지연 제거를 위해 std::pmr 기반의 사전 할당 Arena 영역 활용 - 문자열 복사 최소화를 위해 std::string 대신 std::string_view 적용

원문 읽기