피드로 돌아가기
Dev.toInfrastructure
원문 읽기
Tokio Runtime 분리를 통한 로봇 제어 루프 47ms 지터 완전 제거
I Spent 3 Months Tuning a Tokio Runtime for My Robot - Here's What No Tutorial Tells You
AI 요약
Context
#[tokio::main]의 기본 Work-stealing 스케줄러가 실시간 제어 태스크와 Background I/O 태스크를 동일한 Thread Pool에서 처리하며 간섭 발생. 이로 인해 제어 루프의 1ms 사이클 타임이 보장되지 않고 주기적인 프레임 드랍이 발생하는 구조적 한계 노출.
Technical Solution
tokio::runtime::Builder를 통한 Runtime 격리로 제어 루프와 지원 태스크의 실행 환경을 물리적으로 분리- 제어 전용 Runtime에
worker_threads(1)및ThreadPriority::Max를 설정하여 OS 레벨의 우선순위 확보 - Microsecond 단위의 짧은 Lock 점유 시간을 고려하여 Task Switching 오버헤드가 큰
tokio::sync::Mutex대신std::sync::Mutex채택 spawn_blocking의 Thread Pool 고갈 방지를 위해 Hot Path의 직렬화 작업을 전용std::thread::spawn으로 이전- WAL 기반의 Append-only 쓰기 구조를 가진 moteDB를 활용하여 인덱스 업데이트로 인한 스케줄러 블로킹 원천 차단
- 각 계층 간 통신에 Bounded capacity를 가진
tokio::sync::mpsc채널을 도입하여 Lock-free 데이터 흐름 설계
실천 포인트
- 실시간성이 중요한 태스크가 포함된 경우 #[tokio::main] 대신 Builder를 통한 Runtime 분리 검토 - Lock 점유 시간이 매우 짧은 경우 Async Mutex보다 Blocking Mutex의 성능 우위 확인 - Critical Path에서 `spawn_blocking` 남용 여부 및 Thread Pool 고갈 가능성 점검 - Storage Layer의 쓰기 경로가 런타임 스케줄러를 블로킹하는지 확인하고 비동기 인덱싱 구조 채택