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가 사용됩니다.
--max-symlinks <MAX_SYMLINKS>
경로 확인 중 따라갈 심볼릭 링크의 최대 개수로,
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가 사용됩니다.
--max-symlinks <MAX_SYMLINKS>
경로 확인 중 따라갈 심볼릭 링크의 최대 개수로,
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
도움말을 출력합니다.