11.2.2.3 RMW 계층(Middleware Layer) 교체에 따른 바이너리 직렬화 오버헤드 붕괴

11.2.2.3 RMW 계층(Middleware Layer) 교체에 따른 바이너리 직렬화 오버헤드 붕괴

자율주행 자동차의 섀시 센서에서 발생한 CAN 버스 데이터가 융합되어 ROS2 망을 탈 때, 메시지는 C++ 혹은 Python 구조체 형태로 살아 숨 쉰다. 이 내부 구조체가 외부 인터넷망(TCP/UDP 소켓)으로 파견 나가기 위해서는 반드시 1차원적인 바이트(Byte)의 일렬 배열로 찌그러져야 하며, 이를 직렬화(Serialization) 부하(Overhead)라 칭한다.

시스템 통신 심장인 RMW를 DDS 미들웨어(rmw_fastrtps_cpp 등)에서 네이티브 Zenoh 미들웨어(rmw_zenoh_cpp)로 갈아치웠을 때 발생하는 진정한 화학적 아키텍처 격변은 이 직렬화 메커니즘의 차이에 기인한다. 본 절에서는 RMW 레이어 이식 수술 전후로 런타임 시스템이 겪게 되는 직렬화 패널티의 붕괴 속성과 그 프로파일링 데이터를 해부한다.

1. 레거시(CDR) 직렬화 엔진의 팽창적 메모리 낭비

DDS 기반 RMW 레이어는 2000년대의 군사 통신 및 장비 간 상호 운용성을 맞추기 위해 탄생한 무거운 제사상(OMG 표준 규격)에 맞춰 동작한다.
ROSS2 어플리케이션이 int32 count = 5 라는 불과 4바이트짜리 진성 페이로드(Payload)를 네트워크로 송출하고 싶다 하더라도, DDS 직렬화기(CDR 인코더)를 통과하는 순간 이 데이터는 지독하게 비만해진다.

CDR 엔진은 그 주변에 바이트 정렬 구조(Endianness 플래그), 패딩(Padding) 바이트 수, 도메인 ID 태그, 그리고 파편화 조립 번호 등 수십 바이트의 무거운 메타데이터(Meta-Data) 방탄복을 강제로 입힌 뒤에야 커널 소켓에 투하한다.
이는 개발 서버나 인프라 코어에서는 티가 안 나도, 수십 KB RAM 한계 상황에 놓인 소형 MCU 관절 제어기들 입장에서는 엄청난 메모리 복사 및 할당 오버헤드로 작용하며 통신 지연 사이클 타임(Tick)을 파괴해 버리는 원흉이 된다.

2. Zenoh 직렬화 플랜: 포인터 투사(Pointer Projection)와 무결점 Opaque 압축

반면 이식 수술을 끝마친 rmw_zenoh_cpp 구역에서는 데이터 조립의 사상이 180도 역전된다.
Zenoh 프로토콜의 와이어 체계(Wire Protocol)는 본질적으로 메시지의 “내용물“이 무엇이든 상관하지 않는 불투명한(Opaque) 화물열차 개념을 극대화한다.

ROS2 C++ 노드 엔진에서 publish()가 발동될 때, RMW는 어떠한 데이터 값의 재해석이나 강제 객체 캐스팅을 시도하지 않는다. 메모리상의 ROS 구조체 포인터 주소를 쥐고, 그 배열의 크기(Size)만큼의 바이트만 싹둑 베어내어 극단적으로 줄여놓은 소형 Zenoh 헤더 캡슐(1~3 바이트에 불과한 플래그 덩어리)에 직접 바느질해서(Payload Splice) 밀어 넣는다.

[직렬화 비교 페이즈]

[DDS: rmw_fastrtps] 
- Payload (4b) + CDR Header (16b) + RTPS Submsg Header (8b) + RTPS Header (20b)... 
-> 배보다 배꼽이 큰 오버헤드!

[Zenoh: rmw_zenoh_cpp]
- Payload (4b) + 가변 V-Byte 포맷 암호화 토픽 헤더 (Max 3b) 
-> 무결점에 가까운 극한의 O(1) 직렬화 통과!

이 엄청난 차이로 인해, CPU 내의 L1 데이터 캐시는 직렬화 라이브러리의 잦은 명령어 복사를 지옥처럼 버텨내야 했던 징역살이에서 풀려난다.

3. CPU 클럭 사이클 분해능 상승과 Throughput 파열음

RMW 엔진이 Zenoh로 교체된 환경에서 valgrind나 컴파일러 프로파일러(gprof)를 열고 C 명령 주기(Instruction Cycle) 표를 덤프해 보아라.

이전에는 프로세스 CPU 점유율의 무려 20~30%가 serialize_payload(), memcpy(), 혹은 std::vector 동적 할당 로직 주변에서 지뢰밭처럼 뿜어지고 있던 것을 목도할 수 있었다. 이것은 통신 엔진이 데이터를 처리하느라 바쁜 게 아니라 그저 형식을 이리저리 끼워 맞추며 포장지를 싸는(Packing) 행위에 서버의 노력을 강탈당하고 있던 것이다.
그러나 교체 직후, 이 직렬화 관련 C 함수 콜스택 박스들은 마치 마법처럼 리포트에서 증발해버린다.

줄어든 인코딩 시간 오버헤드는 그대로 시스템의 여력 대역폭, 즉 스루풋(Throughput; 초당 트랜잭션 빈도)을 300% 이상 증배시키는 압도적인 파열음으로 전환된다. 데이터 패킹의 수학적 사슬(Mathematical Chain)을 풀어헤치고 최소한의 권한 위임(Opaque Byte Handling) 철학을 장착한 자만이, 분산 인프라 레이턴시 병목의 최종 해방을 맛보게 될 것이다.