Bencher runner CLI


runner 바이너리는 Bare Metal 벤치마크 Job을 실행하는 에이전트입니다. Self-Hosted Runner를 설정하기 위한 심층 참조 자료입니다. 이 바이너리는 두 개의 하위 명령을 제공합니다:

  • runner up: Runner를 시작하여 벤치마크 Job을 폴링하고 실행합니다.
  • runner run: Image를 풀(pull)하여 로컬 호스트에서 한 번 실행합니다(테스트용).

🐰 runner 바이너리는 bencher runner 하위 명령과 다릅니다. runner 바이너리는 Runner 호스트를 운영하는 반면, bencher runner는 REST API를 통해 Runner 리소스를 관리합니다.


runner up

Runner를 시작하여 벤치마크 Job을 폴링하고 실행합니다. Self-Hosted Runner를 운영하는 데 사용하는 장기 실행 명령입니다. Runner는 API 서버로 단일 WebSocket 연결을 열고, 자신의 Spec과 일치하는 Job을 청구(claim)하고, 실행한 후, 결과를 다시 보고합니다. Runner는 자신의 로그를 한 줄에 객체 하나씩 JSON으로 stderr에 기록하며, Job의 출력은 바이트 수로만 기록합니다.

runner up [OPTIONS]

옵션

--host <HOST>

연결할 Bencher API 서버입니다. 기본적으로 https://api.bencher.dev가 사용됩니다. BENCHER_HOST 환경 변수로도 설정할 수 있습니다.

--runner <RUNNER>

운영할 Runner의 UUID 또는 슬러그입니다. BENCHER_RUNNER 환경 변수로도 설정할 수 있습니다.

--key <KEY>

Runner를 생성할 때 반환된 Runner 인증 키(bencher_runner_...)입니다. BENCHER_RUNNER_KEY 환경 변수로도 설정할 수 있습니다.

--poll-timeout <POLL_TIMEOUT>

Job을 기다리는 동안의 롱 폴(long-poll) 타임아웃(초)으로, 1에서 900 사이입니다. 기본적으로 55가 사용됩니다.

--state-dir <STATE_DIR>

Runner의 영구 상태 디렉터리입니다. 절대 경로여야 합니다. 샌드박스를 가두는 jail이 이 디렉터리 아래에 생성되며, 비정상 종료로 남겨진 jail은 각 샌드박스 Job 실행 전에 이곳에서 정리됩니다. 각 jail은 게스트의 전체 루트 파일 시스템과 microVM 바이너리 사본을 보관하며, Runner는 Job을 한 번에 하나씩 실행하므로, 이 디렉터리에는 jail 하나만큼의 실제 용량이 필요합니다. --image-cache-size를 지정하면 그 크기까지 Image 캐시도 보관합니다. 상태 디렉터리와 관계없이 한 호스트에서는 한 번에 하나의 Runner만 실행됩니다. root로 시작한 Runner는 실행되는 동안 잠금 /run/bencher/runner.lock을 보유하며, root로 시작한 두 번째 Runner는 그 잠금을 명시한 오류와 함께 즉시 종료됩니다. root가 아닌 Runner는 잠금을 열 수 없으므로 잠금 없이 실행됩니다. root로 시작한 Runner는 시작할 때와 각 샌드박스 Job 전에, Job 도중 강제 종료된 Runner의 샌드박스처럼 /sys/fs/cgroup/bencher 아래의 cgroup에서 아직 실행 중인 프로세스를 그 Runner의 상태 디렉터리와 관계없이 모두 종료합니다. 전용 파일 시스템이나 tmpfs 마운트가 지원되며 권장됩니다. 쓰기 부하를 시스템 디스크에서 분리할 수 있습니다. 새로 만든 파일 시스템은 lost+found 디렉터리가 있어도 허용됩니다. 이 파일 시스템은 nodev나 noexec로 마운트되어 있으면 안 됩니다. /tmp, /dev/shm, /run은 흔히 그렇게 마운트되므로, tmpfs를 쓸 때는 이 옵션 없이 전용으로 마운트하세요. 상태 디렉터리 자체를 그런 파일 시스템을 가리키는 root 소유의 심볼릭 링크로 둘 수도 있습니다. 예를 들어 /var/lib/bencher-runner가 전용 디스크를 가리키는 형태입니다. 링크는 링크가 있는 디렉터리에 root만 쓸 수 있고, 링크가 최종 대상을 직접 가리키며, 그 대상이 root만 쓸 수 있는 경로에 이미 존재할 때에만 따라갑니다. 대상이 아직 없는 링크는 거부되므로 대상을 먼저 만드세요. 기본적으로 /var/lib/bencher-runner가 사용됩니다. BENCHER_STATE_DIR 환경 변수로도 설정할 수 있습니다.

--jail-uid <JAIL_UID>

샌드박스 프로세스가 전환할 비특권 사용자 ID입니다. 기본적으로 61016이 사용됩니다. 0은 지정할 수 없습니다. 이 사용자 ID를 소유한 호스트의 프로세스는 샌드박스에 시그널을 보낼 수 있으므로, 호스트가 다른 용도로 할당하지 않는 ID를 지정하십시오. BENCHER_JAIL_UID 환경 변수로도 설정할 수 있습니다.

--jail-gid <JAIL_GID>

샌드박스 프로세스가 전환할 비특권 그룹 ID입니다. 기본적으로 61016이 사용됩니다. 0은 지정할 수 없습니다. BENCHER_JAIL_GID 환경 변수로도 설정할 수 있습니다.

--danger-allow-no-sandbox

Sandbox 없이 Job 실행을 허용합니다. 이 플래그가 없으면, Sandbox가 없는 Spec의 Job은 런타임에 거부됩니다. 샌드박스 없는 Job은 호스트에서 직접 실행되므로, 신뢰할 수 있는 워크로드에만 활성화하세요. BENCHER_DANGER_ALLOW_NO_SANDBOX 환경 변수로도 설정할 수 있습니다.

--sandbox-log-level <SANDBOX_LOG_LEVEL>

샌드박스 프로세스의 로그 레벨입니다. 기본적으로 warning이 사용됩니다.

--no-raid-pause

호스트의 md RAID 어레이가 재동기화, 복구, 검사, 수리 또는 재구성 중일 때도 계속 Job을 받습니다. 기본적으로 Runner는 각 Job을 요청하기 전에 md 어레이를 확인하고, 그중 하나라도 이러한 작업을 실행하는 동안에는 일시 중지합니다. 동기화가 끝날 때까지 새 Job을 받지 않으며, 이미 실행 중인 Job은 절대 중지하지 않습니다. 일시 중지된 Runner는 연결을 유지하며 계속 스스로 업데이트합니다.

--no-auto-update

서버로부터의 자동 업데이트를 비활성화합니다. 기본적으로, 서버가 새 버전을 제공하면 Runner는 Job 사이에 스스로 업데이트합니다. BENCHER_NO_AUTO_UPDATE 환경 변수로도 설정할 수 있습니다.

--update-channel <UPDATE_CHANNEL>

자동 업데이트에 사용할 업데이트 채널로, stable 또는 canary입니다. 기본적으로 stable이 사용됩니다. stable 채널은 버전이 지정된 릴리스로 업데이트합니다. canary 채널은 롤링 canary 빌드를 추적하며, 이 빌드는 Bencher Cloud 배포에서 Runner가 변경될 때마다 다시 빌드됩니다. BENCHER_UPDATE_CHANNEL 환경 변수로도 설정할 수 있습니다. --no-auto-update와 충돌합니다.

--max-download-size <MAX_DOWNLOAD_SIZE>

자체 업데이트 바이너리의 최대 다운로드 크기(바이트)입니다. 기본적으로 500 MiB가 사용됩니다. --no-auto-update와 충돌합니다.

--image-cache-size <IMAGE_CACHE_SIZE>

Runner가 Job 간에 보관하는 Image blob의 최대 크기(바이트)입니다. Runner는 풀(pull)한 각 Image의 config 및 layer blob을 --state-dir 아래의 blobs에 보관하므로, Job은 Runner가 아직 보관하지 않은 blob만 다운로드하지만, Image 매니페스트는 매번 레지스트리에서 가져옵니다. Job 사이에 Runner는 나머지가 이 크기 안에 들어올 때까지 가장 오래전에 사용된 blob부터 제거합니다. Runner는 시작할 때 이 저장소를 만들어 자신의 것으로 삼으며, 그럴 수 없으면 디렉터리를 밝히는 오류와 함께 즉시 종료합니다. 기본적으로, 또는 0으로 설정하면 Runner는 Job 간에 blob을 보관하지 않으며 이전에 보관한 blob을 제거합니다. BENCHER_IMAGE_CACHE_SIZE 환경 변수로도 설정할 수 있습니다.

--max-output-size <MAX_OUTPUT_SIZE>

수집된 stdout 및 stderr의 최대 크기(바이트)입니다. 기본적으로 25 MiB가 사용됩니다.

--max-file-count <MAX_FILE_COUNT>

디코딩할 출력 파일의 최대 개수입니다. 기본적으로 255가 사용됩니다.

경로 확인 중 따라갈 심볼릭 링크의 최대 개수로, Linux 커널의 MAXSYMLINKS 제한과 일치합니다. 기본적으로 40이 사용됩니다. 샌드박스 없는 모드에서만 사용됩니다.

호스트 튜닝

각 벤치마크 전에, runner는 측정 노이즈를 줄이기 위해 호스트 튜닝을 적용합니다. 기본적으로 ASLR, NMI 워치독, SMT / 하이퍼스레딩, 터보 부스트를 비활성화하고, CPU 스케일링 거버너를 performance로, swappiness를 10으로, perf_event_paranoid를 -1로 설정합니다. 마지막 부팅 이후 runner가 튜닝하지 않은 호스트에서는, 아래 플래그가 개별 최적화를 대신 호스트 기본값으로 유지합니다.

호스트 튜닝은 호스트가 재부팅될 때까지 유지됩니다. 각 설정은 런타임 전용 쓰기이며, runner는 종료할 때 이를 되돌리지 않습니다. 단, C-state 유지는 runner가 종료될 때 해제됩니다. 튜닝된 실행 이후에는, 그 밖의 설정을 건너뛰는 플래그가 다음 재부팅부터 적용됩니다. 그때까지 해당 설정은 튜닝된 값을 유지하며, runner는 시작할 때 그 값을 로그로 남깁니다. 공유 호스트는 runner를 제거한 후 재부팅하세요.

--no-tuning

모든 호스트 튜닝 최적화를 비활성화합니다.

--aslr

ASLR을 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--nmi-watchdog

NMI 워치독을 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--smt

SMT / 하이퍼스레딩을 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--turbo

터보 부스트를 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--numa-balancing

자동 NUMA 밸런싱을 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--timer-migration

타이머 마이그레이션을 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--soft-watchdog

소프트 락업 워치독을 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--ksm

KSM(커널 동일 페이지 병합)을 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--cstates

깊은 C-state를 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--no-irq-steering

디바이스 IRQ와 커널 워크큐를 하우스키핑 코어로 보내지 않습니다.

--no-cpuset-partition

격리된 cpuset 파티션을 통해 벤치마크 코어를 스케줄러에서 분리하지 않습니다.

--swappiness <SWAPPINESS>

swappiness 값을 설정합니다. 기본적으로 10이 사용됩니다.

--governor <GOVERNOR>

CPU 스케일링 거버너를 설정합니다. 기본적으로 performance가 사용됩니다.

--perf-event-paranoid <PERF_EVENT_PARANOID>

perf_event_paranoid 값을 설정합니다. 기본적으로 -1이 사용됩니다.

--thp <THP>

호스트의 transparent hugepage 모드를 never, madvise, always, leave 중 하나로 설정합니다. leave를 사용하면 호스트의 현재 모드를 유지합니다. 기본적으로 never가 사용됩니다.

--help

도움말을 출력합니다.


runner run

Image를 풀(pull)하고, rootfs를 생성한 후, 로컬 호스트에서 한 번 실행합니다. runner up과 달리, 이 명령은 API 서버에 연결하거나 Job을 청구하지 않습니다. 단일 Image를 직접 실행하며, 실제 Job을 제출하기 전에 Runner 호스트나 Image를 테스트하고 디버깅하는 데 유용합니다. Image의 출력은 그대로 stdout과 stderr로 가고, Runner 자신의 로그는 한 줄에 객체 하나씩 JSON으로 stderr에 기록됩니다.

runner run --image <IMAGE> [OPTIONS]

옵션

--image <IMAGE>

실행할 OCI Image로, 로컬 경로 또는 레지스트리 참조입니다.

--token <TOKEN>

Image를 풀할 때 레지스트리 인증에 사용하는 JWT 토큰입니다.

--sandbox <SANDBOX>

벤치마크 실행을 위한 샌드박스 모드입니다. Firecracker microVM(Linux 전용)을 사용하려면 firecracker를 사용하세요. 샌드박스 없는 호스트 실행을 위해서는 생략하세요.

--timeout <TIMEOUT>

실행 시작부터 모든 반복이 공유하는 실행 타임아웃(초)입니다. 기본적으로 300이 사용됩니다.

--state-dir <STATE_DIR>

Runner의 영구 상태 디렉터리입니다. 절대 경로여야 합니다. 샌드박스를 가두는 jail이 이 디렉터리 아래에 생성되며, 비정상 종료로 남겨진 jail은 각 샌드박스 Job 실행 전에 이곳에서 정리됩니다. 각 jail은 게스트의 전체 루트 파일 시스템과 microVM 바이너리 사본을 보관하며, Runner는 Job을 한 번에 하나씩 실행하므로, 이 디렉터리에는 jail 하나만큼의 실제 용량이 필요합니다. 상태 디렉터리와 관계없이 한 호스트에서는 한 번에 하나의 Runner만 실행됩니다. root로 시작한 Runner는 실행되는 동안 잠금 /run/bencher/runner.lock을 보유하며, root로 시작한 두 번째 Runner는 그 잠금을 명시한 오류와 함께 즉시 종료됩니다. root가 아닌 Runner는 잠금을 열 수 없으므로 잠금 없이 실행됩니다. root로 시작한 Runner는 시작할 때와 각 샌드박스 Job 전에, Job 도중 강제 종료된 Runner의 샌드박스처럼 /sys/fs/cgroup/bencher 아래의 cgroup에서 아직 실행 중인 프로세스를 그 Runner의 상태 디렉터리와 관계없이 모두 종료합니다. 전용 파일 시스템이나 tmpfs 마운트가 지원되며 권장됩니다. 쓰기 부하를 시스템 디스크에서 분리할 수 있습니다. 새로 만든 파일 시스템은 lost+found 디렉터리가 있어도 허용됩니다. 이 파일 시스템은 nodev나 noexec로 마운트되어 있으면 안 됩니다. /tmp, /dev/shm, /run은 흔히 그렇게 마운트되므로, tmpfs를 쓸 때는 이 옵션 없이 전용으로 마운트하세요. 상태 디렉터리 자체를 그런 파일 시스템을 가리키는 root 소유의 심볼릭 링크로 둘 수도 있습니다. 예를 들어 /var/lib/bencher-runner가 전용 디스크를 가리키는 형태입니다. 링크는 링크가 있는 디렉터리에 root만 쓸 수 있고, 링크가 최종 대상을 직접 가리키며, 그 대상이 root만 쓸 수 있는 경로에 이미 존재할 때에만 따라갑니다. 대상이 아직 없는 링크는 거부되므로 대상을 먼저 만드세요. 기본적으로 /var/lib/bencher-runner가 사용됩니다. BENCHER_STATE_DIR 환경 변수로도 설정할 수 있습니다.

--jail-uid <JAIL_UID>

샌드박스 프로세스가 전환할 비특권 사용자 ID입니다. 기본적으로 61016이 사용됩니다. 0은 지정할 수 없습니다. 이 사용자 ID를 소유한 호스트의 프로세스는 샌드박스에 시그널을 보낼 수 있으므로, 호스트가 다른 용도로 할당하지 않는 ID를 지정하십시오. BENCHER_JAIL_UID 환경 변수로도 설정할 수 있습니다.

--jail-gid <JAIL_GID>

샌드박스 프로세스가 전환할 비특권 그룹 ID입니다. 기본적으로 61016이 사용됩니다. 0은 지정할 수 없습니다. BENCHER_JAIL_GID 환경 변수로도 설정할 수 있습니다.

--iter <ITER>

실행할 벤치마크 반복 횟수입니다. 기본적으로 1이 사용됩니다.

--allow-failure

남은 반복을 중단(short-circuit)하지 않고 벤치마크 실패를 허용합니다. 시간이 다 되면 실행은 여전히 타임아웃으로 종료됩니다. Image를 풀(pull)하거나 준비할 수 없는 경우에도 실행은 종료됩니다.

--entrypoint <ENTRYPOINT>

컨테이너 엔트리포인트를 재정의합니다. 여러 번 지정할 수 있습니다.

--cmd <CMD>

컨테이너 명령을 재정의합니다. 여러 번 지정할 수 있습니다.

--env <ENV>

KEY=VALUE 형식으로 환경 변수를 설정합니다. 여러 번 지정할 수 있습니다.

--network

VM 내부에서 네트워크 액세스를 활성화합니다.

--output <OUTPUT>

수집할 게스트 내부의 출력 파일 경로입니다. 여러 번 지정할 수 있습니다.

--vcpus <VCPUS>

vCPU 개수를 재정의합니다(테스트용).

--memory <MEMORY>

메모리(MiB)를 재정의합니다(테스트용).

--disk <DISK>

디스크 크기(MiB)를 재정의합니다(테스트용).

--max-output-size <MAX_OUTPUT_SIZE>

수집된 stdout 및 stderr의 최대 크기(바이트)입니다. 기본적으로 25 MiB가 사용됩니다.

--max-file-count <MAX_FILE_COUNT>

디코딩할 출력 파일의 최대 개수입니다. 기본적으로 255가 사용됩니다.

경로 확인 중 따라갈 심볼릭 링크의 최대 개수로, Linux 커널의 MAXSYMLINKS 제한과 일치합니다. 기본적으로 40이 사용됩니다. 샌드박스 없는 모드에서만 사용되므로, --sandbox와 충돌합니다.

--sandbox-log-level <SANDBOX_LOG_LEVEL>

샌드박스 프로세스의 로그 레벨입니다. --sandbox가 필요합니다. 기본적으로 warning이 사용됩니다.

호스트 튜닝

각 벤치마크 전에, runner는 측정 노이즈를 줄이기 위해 호스트 튜닝을 적용합니다. 기본적으로 ASLR, NMI 워치독, SMT / 하이퍼스레딩, 터보 부스트를 비활성화하고, CPU 스케일링 거버너를 performance로, swappiness를 10으로, perf_event_paranoid를 -1로 설정합니다. 마지막 부팅 이후 runner가 튜닝하지 않은 호스트에서는, 아래 플래그가 개별 최적화를 대신 호스트 기본값으로 유지합니다.

호스트 튜닝은 호스트가 재부팅될 때까지 유지됩니다. 각 설정은 런타임 전용 쓰기이며, runner는 종료할 때 이를 되돌리지 않습니다. 단, C-state 유지는 runner가 종료될 때 해제됩니다. 튜닝된 실행 이후에는, 그 밖의 설정을 건너뛰는 플래그가 다음 재부팅부터 적용됩니다. 그때까지 해당 설정은 튜닝된 값을 유지하며, runner는 시작할 때 그 값을 로그로 남깁니다. 공유 호스트는 runner를 제거한 후 재부팅하세요.

--no-tuning

모든 호스트 튜닝 최적화를 비활성화합니다.

--aslr

ASLR을 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--nmi-watchdog

NMI 워치독을 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--smt

SMT / 하이퍼스레딩을 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--turbo

터보 부스트를 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--numa-balancing

자동 NUMA 밸런싱을 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--timer-migration

타이머 마이그레이션을 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--soft-watchdog

소프트 락업 워치독을 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--ksm

KSM(커널 동일 페이지 병합)을 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--cstates

깊은 C-state를 비활성화하지 않습니다(기본값: 벤치마크에서는 비활성화).

--no-irq-steering

디바이스 IRQ와 커널 워크큐를 하우스키핑 코어로 보내지 않습니다.

--no-cpuset-partition

격리된 cpuset 파티션을 통해 벤치마크 코어를 스케줄러에서 분리하지 않습니다.

--swappiness <SWAPPINESS>

swappiness 값을 설정합니다. 기본적으로 10이 사용됩니다.

--governor <GOVERNOR>

CPU 스케일링 거버너를 설정합니다. 기본적으로 performance가 사용됩니다.

--perf-event-paranoid <PERF_EVENT_PARANOID>

perf_event_paranoid 값을 설정합니다. 기본적으로 -1이 사용됩니다.

--thp <THP>

호스트의 transparent hugepage 모드를 never, madvise, always, leave 중 하나로 설정합니다. leave를 사용하면 호스트의 현재 모드를 유지합니다. 기본적으로 never가 사용됩니다.

--help

도움말을 출력합니다.



Published: Fri, June 19, 2026 at 8:00:00 AM UTC | Last Updated: Fri, October 9, 2026 at 3:22:48 PM UTC