온프레미스 리눅스 AI 에이전트 런타임 비교: Node.js·Bun·Deno와 Rust 네이티브 바이너리의 기동·메모리·CPU·지연 측정
임재호· NextGen AI Co.
Abstract
온프레미스 리눅스에서 AI 에이전트를 돌릴 런타임으로 Node.js 계열과 Rust 네이티브 바이너리 중 무엇이 나은지에 대한 측정 근거는 부족하다. 기존 언어 비교 연구는 CPU 바운드 벤치마크를 다루며, LLM 응답 대기가 지배하는 에이전트 루프는 다루지 않았다. 이 연구는 대화 이력 전송, SSE 스트림 파싱, 도구 서브프로세스 실행으로 이루어진 같은 에이전트 루프를 JavaScript 한 벌(Node.js 24, Bun 1.4, Deno 2.9에서 실행)과 Rust 한 벌(tokio 다중·단일 스레드)로 구현하고, 모의 LLM 서버로 서버 시간을 분리해 aarch64 리눅스 컨테이너에서 측정했다. 1세션 기동 시간은 Rust 3.8 ms, Node.js 35.6 ms였다. 동시 500세션에서 Rust의 최대 RSS는 159.7 MB로 Bun 383.9 MB, Node.js 775.8 MB보다 작았고, 오케스트레이션 오버헤드 중앙값은 Rust(다중 스레드) 2.24 ms, Bun 174.09 ms, Node.js 299.58 ms였다. 세션 10개 수준에서는 차이가 작았다. musl 정적 바이너리는 1.44 MiB로 JavaScript 런타임 바이너리보다 50배 이상 작았다. 결과는 가상 머신 한 대에서 얻은 것이며 x86 베어메탈에서의 재현은 후속 과제다.
주요 기여
- 같은 프로토콜과 루프를 JavaScript 한 벌(세 런타임 공용)과 Rust 한 벌로 구현하고, 모의 LLM 서버로 서버 측 시간을 분리하는 측정 방법을 제시한다.
- 동시 세션 1–500에서 메모리, 오버헤드, CPU 시간을 측정해, 차이가 동시성에 따라 커지며 단일 스레드 Rust도 JavaScript 런타임보다 작은 오버헤드를 보임을 보고한다.
- 기동 시간, 장시간 상주 RSS, 배포 산출물 크기를 함께 보고하고, 사전에 정한 세 가설의 채택과 기각을 정리한다.
결론
LLM 대기가 지배하는 에이전트 루프에서도 런타임 선택은 동시 세션 수가 커질수록 측정 가능한 차이를 만들었다. 시험한 1–500세션에서 Rust 구현은 오케스트레이션 오버헤드 중앙값을 6.26 ms 이하로 유지했고, 기동 시간, 메모리, 턴당 CPU 시간, 배포 크기에서 모두 가장 작았다. JavaScript 런타임은 세션 10개 안팎에서는 오버헤드가 작았지만 100세션 이상에서 사전 기준을 넘었고, 그 정도는 Node.js, Bun, Deno 사이에서도 크게 달랐다. 후속 연구로는 x86 베어메탈 온프레미스 서버에서의 반복 측정, 실제 LLM 지연과 TLS를 포함한 작업, 수 시간 이상의 상주 측정, Node.js 다중 프로세스 구성과의 비교가 필요하다.
댓글 0
댓글을 불러오는 중…