프로세스 로그 파이프라인 벤치마크 (2026-09-19)¶
이 보고서는 로그 시스템 아키텍처가 요구하는 최초의 동기 대 비동기 프로세스 로그 비교를 기록합니다. 3회 시행의 중앙값을 보고합니다. 이는 이식 가능한 서비스 수준 보장이 아니라 개발 호스트에서의 측정치입니다.
환경¶
- 커밋:
4dbeb59e8726735c2ec8f55ef5ba86e74603fa3d - 후보:
feat/async-process-logging브랜치의 작업 트리 - OS: Linux 6.14.0-1015-nvidia, ARM64
- 논리 CPU: 20개
- 파일 디스크립터 한도: 500,000
- Rust: 1.97.1
- 빌드: release 프로파일
- 워크로드: keep-alive 연결 32개, 2초 워밍업, 10초 측정 구간, 1ms 고정 응답 지연을 갖는 로컬 모의 LLM 백엔드
- 스로틀된 싱크: 초당 4,096바이트
- 시행: 변형과 싱크별로 3회씩. 표는 그 중앙값을 보고합니다.
동기식 바이너리는 분리된(detached) 워크트리에서 위 커밋으로부터 빌드했습니다. 비동기식 바이너리는 작업 브랜치에서 빌드했습니다. 두 바이너리 모두 동일한 lockfile, release 프로파일, 프로파일 JSON, 모의 백엔드, 부하 드라이버를 사용했습니다.
결과¶
| 싱크 | 변형 | RPS | p95 | p99 | 오류 | 오류율 | 최대 RSS |
|---|---|---|---|---|---|---|---|
| 빠름 | 동기 | 9,663.8 | 4.493 ms | 5.316 ms | 0 | 0% | 38.770 MiB |
| 빠름 | 비동기 | 9,945.0 | 4.322 ms | 5.354 ms | 0 | 0% | 39.324 MiB |
| 스로틀됨 | 동기 | 16.0 | n/a | n/a | 160 | 100% | 19.090 MiB |
| 스로틀됨 | 비동기 | 9,918.3 | 4.524 ms | 5.525 ms | 0 | 0% | 42.152 MiB |
| 멈춤 | 동기 | 16.0 | n/a | n/a | 160 | 100% | 18.813 MiB |
| 멈춤 | 비동기 | 9,825.4 | 4.539 ms | 5.638 ms | 0 | 0% | 42.797 MiB |
빠른 싱크에서 비동기 후보는 이번 실행에서 초당 요청 수를 2.9% 더 처리했고 p95 지연 시간을 3.8% 줄였습니다. 스로틀되거나 멈춘 싱크 상태에서는 프로세스 파이프가 가득 찬 뒤 측정된 모든 동기 요청이 실패한 반면, 비동기 후보는 요청 실패 없이 약 9,825–9,918 RPS를 유지했습니다. 실패한 동기 케이스의 지연 시간 백분위수는 0이 아니라 의도적으로 측정 불가(n/a)로 보고됩니다.
성공적인 비동기 과부하 케이스에서 더 높게 나타난 RSS는 동일 조건의 서비스 용량 비교가 아닙니다. 동기 프로세스는 정상 상태(steady-state) 할당량에 도달하기 전에 요청 처리를 멈췄기 때문입니다. 비동기 큐 자체는 기본 설정에서 8,192개 레코드와 16 MiB의 보유 페이로드로 상한이 유지됩니다.
설정 가능한 큐 한도 적용 후 재실행¶
logging.queue_capacity와 logging.queue_capacity_bytes가 시작 경로 전체에 배선된 뒤, 동일한 바이너리, 워크로드, 싱크 속도, 3회 시행 중앙값 절차로 다시 실행했습니다. 후보는 기본값인 8,192개 레코드와 16 MiB 설정을 사용했습니다.
| 싱크 | 변형 | RPS | p95 | p99 | 오류 | 오류율 | 최대 RSS |
|---|---|---|---|---|---|---|---|
| 빠름 | 동기 | 9,889.8 | 4.224 ms | 5.342 ms | 0 | 0% | 39.180 MiB |
| 빠름 | 비동기 | 9,514.4 | 4.558 ms | 5.470 ms | 0 | 0% | 38.969 MiB |
| 스로틀됨 | 동기 | 16.0 | n/a | n/a | 160 | 100% | 19.563 MiB |
| 스로틀됨 | 비동기 | 9,850.4 | 4.599 ms | 5.715 ms | 0 | 0% | 42.246 MiB |
| 멈춤 | 동기 | 16.0 | n/a | n/a | 160 | 100% | 18.813 MiB |
| 멈춤 | 비동기 | 9,809.5 | 4.554 ms | 5.610 ms | 0 | 0% | 42.695 MiB |
빠른 싱크에서 후보는 동기 기준선 대비 처리량이 3.8% 낮았고 p95 지연 시간이 7.9% 높았으며 이는 10% 회귀 예산 이내였습니다. 스로틀되거나 멈춘 싱크 상태에서는 다시 한번 오류 없이 완료되었고 각각 자체 빠른 싱크 처리량의 103.5%와 103.1%를 기록한 반면, 측정된 모든 동기 요청은 실패했습니다. 모든 비교 게이트를 통과했습니다.
초기 회귀 예산¶
예약 실행기(scheduled runner)가 더 긴 이력을 축적하기 전까지, 이 구현의 검토 예산은 다음과 같습니다.
- 빠른 싱크의 중앙값은 처리량이나 p95 지연 시간 중 어느 쪽도 동기 기준선 대비 10%를 초과해 회귀해서는 안 됩니다.
- 스로틀되거나 멈춘 후보는 요청 실패 없이 완료되어야 합니다.
- 스로틀되거나 멈춘 상태의 처리량은 후보 자체의 빠른 싱크 처리량 대비 최소 80%를 유지해야 합니다.
- 큐 깊이는 8,192개 레코드를, 보유 큐 페이로드는 16 MiB를, 개별 포맷 레코드는 64 KiB를 초과해서는 안 됩니다.
이 한도들은 이 변경이 제거하고자 하는 실패 모드는 배제하면서도 공유 호스트에서 발생하는 변동에는 여지를 남겨 둡니다. 반복적인 예약 측정이 분산을 확립한 뒤에는 이를 실행기별 임계값으로 대체하십시오.
재현¶
동기 기준선으로부터 바이너리 하나를, 후보로부터 바이너리 하나를 빌드한 다음 다음을 실행합니다.
TRIALS=3 perf/compare-log-pipeline.sh \
/path/to/synchronous/continuum-router \
/path/to/asynchronous/continuum-router
이 하니스는 여섯 개의 기계 판독 가능한 결과 파일과 생성된 Markdown 비교 결과를 perf/results/log-pipeline/ 아래에 기록합니다. 이 디렉터리는 반복되는 로컬 및 예약 측정이 런타임 산출물이기 때문에 git에서 무시됩니다. 이 저장소에 커밋된 보고서는 검토를 거친 기준 실행 결과를 기록합니다.