Bencher CLI runner
El binario runner es el agente que ejecuta los Jobs de benchmark Bare Metal.
Es la referencia detallada para configurar un Runner Autoalojado.
El binario proporciona dos subcomandos:
runner up: Inicia el runner, sondeando y ejecutando Jobs de benchmark.runner run: Descarga una Image y la ejecuta una vez en el host local, para pruebas.
🐰 El binario
runneres distinto de los subcomandosbencher runner. El binariorunneropera un host Runner, mientras quebencher runnergestiona los recursos Runner a través de la API REST.
runner up
Inicia el runner, sondeando y ejecutando Jobs de benchmark. Este es el comando de larga duración usado para operar un Runner Autoalojado. El runner abre una única conexión WebSocket al servidor API, reclama Jobs que coincidan con sus Specs, los ejecuta, y reporta los resultados de vuelta. El runner escribe su registro en stderr como JSON, un objeto por línea, y registra la salida de un Job solo como conteos de bytes.
runner up [OPTIONS]Opciones
--host <HOST>
El servidor API de Bencher al que conectarse.
Por defecto, se usa https://api.bencher.dev.
También se puede establecer con la variable de entorno BENCHER_HOST.
--runner <RUNNER>
El UUID o slug del Runner como el que operar.
También se puede establecer con la variable de entorno BENCHER_RUNNER.
--key <KEY>
La clave de autenticación del Runner (bencher_runner_...)
devuelta cuando se creó el Runner.
También se puede establecer con la variable de entorno BENCHER_RUNNER_KEY.
--poll-timeout <POLL_TIMEOUT>
El tiempo de espera del long-poll en segundos mientras se espera un Job, entre 1 y 900.
Por defecto, se usa 55.
--state-dir <STATE_DIR>
El directorio de estado persistente del Runner.
Debe ser una ruta absoluta.
La jaula que confina el sandbox se crea dentro de este directorio,
y las jaulas que quedaron tras una salida no limpia se eliminan de él antes de cada Job con sandbox.
Cada jaula contiene un sistema de archivos raíz completo del huésped y una copia del binario de la microVM,
y un Runner ejecuta sus Jobs de uno en uno,
por lo que este directorio necesita capacidad real para una jaula.
Con --image-cache-size, también guarda la caché de Image, hasta ese tamaño.
Un host ejecuta un solo Runner a la vez, sea cual sea su directorio de estado:
un Runner iniciado como root mantiene el bloqueo /run/bencher/runner.lock mientras se ejecuta,
y un segundo iniciado como root sale de inmediato con un error que nombra ese bloqueo; un Runner que no es root no puede abrir el bloqueo y se ejecuta sin él.
Al arrancar, y de nuevo antes de cada Job con sandbox, un Runner iniciado como root termina cualquier proceso que siga ejecutándose en un cgroup bajo /sys/fs/cgroup/bencher, como la sandbox de un Runner terminado a mitad de un Job, sea cual sea el directorio de estado de ese Runner.
Se admite y se recomienda un sistema de archivos dedicado o un montaje tmpfs:
mantiene esa carga de escritura fuera del disco del sistema,
y se acepta un sistema de archivos recién creado aunque llegue con un directorio lost+found.
El sistema de archivos no debe estar montado con nodev ni noexec, como suelen estarlo /tmp, /dev/shm y /run, así que monte para él un tmpfs sin esas opciones.
El propio directorio de estado puede ser un enlace simbólico creado por root hacia un sistema de archivos así,
como /var/lib/bencher-runner apuntando a un disco dedicado.
El enlace solo se sigue cuando el directorio que lo contiene solo puede ser escrito por root,
apunta directamente a su destino final,
y ese destino ya existe en una ruta que solo root puede escribir;
un enlace cuyo destino aún no existe se rechaza, así que cree primero el destino.
Por defecto, se usa /var/lib/bencher-runner.
También se puede establecer con la variable de entorno BENCHER_STATE_DIR.
--jail-uid <JAIL_UID>
El ID de usuario sin privilegios al que cambia el proceso del sandbox.
Por defecto, se usa 61016.
No puede ser 0.
Un proceso del host que sea propietario de ese ID de usuario puede enviar señales al sandbox,
así que asígnele un ID que el host no destine a ninguna otra cosa.
También se puede establecer con la variable de entorno BENCHER_JAIL_UID.
--jail-gid <JAIL_GID>
El ID de grupo sin privilegios al que cambia el proceso del sandbox.
Por defecto, se usa 61016.
No puede ser 0.
También se puede establecer con la variable de entorno BENCHER_JAIL_GID.
--danger-allow-no-sandbox
Permite ejecutar Jobs sin un Sandbox.
Sin este flag, un Job cuyo Spec no tenga Sandbox se rechaza en tiempo de ejecución.
Los Jobs sin sandbox se ejecutan directamente en el host, así que solo habilita esto para cargas de trabajo de confianza.
También se puede establecer con la variable de entorno BENCHER_DANGER_ALLOW_NO_SANDBOX.
--sandbox-log-level <SANDBOX_LOG_LEVEL>
El nivel de log para el proceso del sandbox.
Por defecto, se usa warning.
--no-raid-pause
Seguir aceptando Jobs mientras un array RAID md del host se resincroniza, se recupera, se verifica, se repara o se remodela. Por defecto, el Runner revisa sus arrays md antes de pedir cada Job, y mientras alguno de ellos ejecuta una de estas operaciones se pausa: no acepta ningún Job nuevo hasta que termine la sincronización, y nunca detiene un Job que ya se está ejecutando. Un Runner pausado sigue conectado y se sigue actualizando a sí mismo.
--no-auto-update
Desactiva las actualizaciones automáticas desde el servidor.
Por defecto, el runner se actualiza a sí mismo entre Jobs cuando el servidor ofrece una nueva versión.
También se puede establecer con la variable de entorno BENCHER_NO_AUTO_UPDATE.
--update-channel <UPDATE_CHANNEL>
El canal de actualización para las actualizaciones automáticas, ya sea stable o canary.
Por defecto, se usa stable.
El canal stable actualiza a releases versionadas.
El canal canary sigue la compilación canary continua,
que se reconstruye cada vez que el runner cambia en un despliegue de Bencher Cloud.
También se puede establecer con la variable de entorno BENCHER_UPDATE_CHANNEL.
Entra en conflicto con --no-auto-update.
--max-download-size <MAX_DOWNLOAD_SIZE>
El tamaño máximo de descarga en bytes para los binarios de auto-actualización.
Por defecto, se usan 500 MiB.
Entra en conflicto con --no-auto-update.
--image-cache-size <IMAGE_CACHE_SIZE>
El tamaño máximo en bytes de los blobs de Image que el Runner conserva entre Jobs.
El Runner conserva los blobs de configuración y de capas de cada Image que descarga en blobs, dentro de su --state-dir,
de modo que un Job descarga solo los blobs que el Runner aún no tiene,
aunque sigue obteniendo el manifiesto de su Image del registro cada vez.
Entre Jobs, el Runner elimina los blobs usados hace más tiempo hasta que el resto cabe en este tamaño.
Al iniciar, el Runner crea el almacén y lo hace suyo, y si no puede, termina de inmediato con un error que nombra el directorio.
Por defecto, o con 0, el Runner no conserva blobs entre Jobs y elimina los que haya conservado antes.
También se puede establecer con la variable de entorno BENCHER_IMAGE_CACHE_SIZE.
--max-output-size <MAX_OUTPUT_SIZE>
El tamaño máximo en bytes para stdout y stderr recolectados.
Por defecto, se usan 25 MiB.
--max-file-count <MAX_FILE_COUNT>
El número máximo de archivos de salida a decodificar.
Por defecto, se usa 255.
--max-symlinks <MAX_SYMLINKS>
El número máximo de symlinks a seguir durante la resolución de rutas,
coincidiendo con el límite MAXSYMLINKS del kernel de Linux.
Por defecto, se usa 40.
Solo se usa en modo sin sandbox.
Ajuste del Host
Antes de cada benchmark, el runner aplica ajustes al host para reducir el ruido de medición.
Por defecto, desactiva ASLR, el watchdog NMI, SMT / hyper-threading, y turbo boost;
establece el governor de escalado de CPU a performance, swappiness a 10, y perf_event_paranoid a -1.
En un host al que el runner no ha aplicado ajustes desde su último reinicio, los flags de abajo mantienen las optimizaciones individuales en sus valores por defecto del host en su lugar.
El ajuste del host persiste hasta que el host se reinicia: cada ajuste es una escritura solo en tiempo de ejecución que el runner no revierte al salir, excepto la retención de los C-states, que termina cuando el runner sale.
Tras una ejecución con ajustes, un flag que omite cualquier otro ajuste surte efecto a partir del siguiente reinicio: hasta entonces, el ajuste conserva su valor ajustado, y el runner registra ese valor al iniciarse.
Reinicie un host compartido después de quitar el runner.
--no-tuning
Desactiva todas las optimizaciones de ajuste del host.
--aslr
No desactiva ASLR (por defecto: desactivado para benchmarks).
--nmi-watchdog
No desactiva el watchdog NMI (por defecto: desactivado para benchmarks).
--smt
No desactiva SMT / hyper-threading (por defecto: desactivado para benchmarks).
--turbo
No desactiva turbo boost (por defecto: desactivado para benchmarks).
--numa-balancing
No desactiva el balanceo NUMA automático (por defecto: desactivado para benchmarks).
--timer-migration
No desactiva la migración de temporizadores (por defecto: desactivada para benchmarks).
--soft-watchdog
No desactiva el watchdog de soft lockup (por defecto: desactivado para benchmarks).
--ksm
No desactiva KSM, kernel samepage merging (por defecto: desactivado para benchmarks).
--cstates
No desactiva los C-states profundos (por defecto: desactivados para benchmarks).
--no-irq-steering
No dirige las IRQ de los dispositivos ni las workqueues del kernel a los núcleos de housekeeping.
--no-cpuset-partition
No separa los núcleos de benchmark del planificador mediante una partición cpuset aislada.
--swappiness <SWAPPINESS>
Establece el valor de swappiness.
Por defecto, se usa 10.
--governor <GOVERNOR>
Establece el governor de escalado de CPU.
Por defecto, se usa performance.
--perf-event-paranoid <PERF_EVENT_PARANOID>
Establece el valor de perf_event_paranoid.
Por defecto, se usa -1.
--thp <THP>
Establece el modo de transparent hugepage del host: never, madvise, always o leave.
Use leave para mantener el modo actual del host.
Por defecto, se usa never.
--help
Imprime la ayuda.
runner run
Descarga una Image, crea un rootfs, y la ejecuta una vez en el host local.
A diferencia de runner up, esto no se conecta a un servidor API ni reclama un Job.
Ejecuta una única Image directamente, lo cual es útil para probar y depurar un host Runner
o una Image antes de enviar Jobs reales.
La salida de la Image va a stdout y stderr tal cual, y el registro propio del runner va a stderr como JSON, un objeto por línea.
runner run --image <IMAGE> [OPTIONS]Opciones
--image <IMAGE>
La Image OCI a ejecutar, como una ruta local o una referencia de registro.
--token <TOKEN>
Un token JWT para autenticación de registro al descargar la Image.
--sandbox <SANDBOX>
El modo de sandbox para la ejecución del benchmark.
Usa firecracker para una microVM de Firecracker (solo Linux).
Omítelo para ejecución en el host sin sandbox.
--timeout <TIMEOUT>
El tiempo de espera de ejecución en segundos, compartido por todas las iteraciones desde el inicio de la ejecución.
Por defecto, se usa 300.
--state-dir <STATE_DIR>
El directorio de estado persistente del Runner.
Debe ser una ruta absoluta.
La jaula que confina el sandbox se crea dentro de este directorio,
y las jaulas que quedaron tras una salida no limpia se eliminan de él antes de cada Job con sandbox.
Cada jaula contiene un sistema de archivos raíz completo del huésped y una copia del binario de la microVM,
y un Runner ejecuta sus Jobs de uno en uno,
por lo que este directorio necesita capacidad real para una jaula.
Un host ejecuta un solo Runner a la vez, sea cual sea su directorio de estado:
un Runner iniciado como root mantiene el bloqueo /run/bencher/runner.lock mientras se ejecuta,
y un segundo iniciado como root sale de inmediato con un error que nombra ese bloqueo; un Runner que no es root no puede abrir el bloqueo y se ejecuta sin él.
Al arrancar, y de nuevo antes de cada Job con sandbox, un Runner iniciado como root termina cualquier proceso que siga ejecutándose en un cgroup bajo /sys/fs/cgroup/bencher, como la sandbox de un Runner terminado a mitad de un Job, sea cual sea el directorio de estado de ese Runner.
Se admite y se recomienda un sistema de archivos dedicado o un montaje tmpfs:
mantiene esa carga de escritura fuera del disco del sistema,
y se acepta un sistema de archivos recién creado aunque llegue con un directorio lost+found.
El sistema de archivos no debe estar montado con nodev ni noexec, como suelen estarlo /tmp, /dev/shm y /run, así que monte para él un tmpfs sin esas opciones.
El propio directorio de estado puede ser un enlace simbólico creado por root hacia un sistema de archivos así,
como /var/lib/bencher-runner apuntando a un disco dedicado.
El enlace solo se sigue cuando el directorio que lo contiene solo puede ser escrito por root,
apunta directamente a su destino final,
y ese destino ya existe en una ruta que solo root puede escribir;
un enlace cuyo destino aún no existe se rechaza, así que cree primero el destino.
Por defecto, se usa /var/lib/bencher-runner.
También se puede establecer con la variable de entorno BENCHER_STATE_DIR.
--jail-uid <JAIL_UID>
El ID de usuario sin privilegios al que cambia el proceso del sandbox.
Por defecto, se usa 61016.
No puede ser 0.
Un proceso del host que sea propietario de ese ID de usuario puede enviar señales al sandbox,
así que asígnele un ID que el host no destine a ninguna otra cosa.
También se puede establecer con la variable de entorno BENCHER_JAIL_UID.
--jail-gid <JAIL_GID>
El ID de grupo sin privilegios al que cambia el proceso del sandbox.
Por defecto, se usa 61016.
No puede ser 0.
También se puede establecer con la variable de entorno BENCHER_JAIL_GID.
--iter <ITER>
El número de iteraciones de benchmark a ejecutar.
Por defecto, se usa 1.
--allow-failure
Permite un fallo de benchmark sin cortocircuitar las iteraciones restantes. Si se agota el tiempo, la ejecución termina igualmente por tiempo de espera agotado. Una Image que no se puede descargar ni preparar también termina la ejecución.
--entrypoint <ENTRYPOINT>
Sobrescribe el entrypoint del contenedor. Puede especificarse múltiples veces.
--cmd <CMD>
Sobrescribe el comando del contenedor. Puede especificarse múltiples veces.
--env <ENV>
Establece una variable de entorno en formato KEY=VALUE.
Puede especificarse múltiples veces.
--network
Habilita el acceso a la red dentro de la VM.
--output <OUTPUT>
Una ruta de archivo de salida dentro del guest a recolectar. Puede especificarse múltiples veces.
--vcpus <VCPUS>
Sobrescribe el número de vCPUs (para pruebas).
--memory <MEMORY>
Sobrescribe la memoria en MiB (para pruebas).
--disk <DISK>
Sobrescribe el tamaño de disco en MiB (para pruebas).
--max-output-size <MAX_OUTPUT_SIZE>
El tamaño máximo en bytes para stdout y stderr recolectados.
Por defecto, se usan 25 MiB.
--max-file-count <MAX_FILE_COUNT>
El número máximo de archivos de salida a decodificar.
Por defecto, se usa 255.
--max-symlinks <MAX_SYMLINKS>
El número máximo de symlinks a seguir durante la resolución de rutas,
coincidiendo con el límite MAXSYMLINKS del kernel de Linux.
Por defecto, se usa 40.
Solo se usa en modo sin sandbox, así que entra en conflicto con --sandbox.
--sandbox-log-level <SANDBOX_LOG_LEVEL>
El nivel de log para el proceso del sandbox.
Requiere --sandbox.
Por defecto, se usa warning.
Ajuste del Host
Antes de cada benchmark, el runner aplica ajustes al host para reducir el ruido de medición.
Por defecto, desactiva ASLR, el watchdog NMI, SMT / hyper-threading, y turbo boost;
establece el governor de escalado de CPU a performance, swappiness a 10, y perf_event_paranoid a -1.
En un host al que el runner no ha aplicado ajustes desde su último reinicio, los flags de abajo mantienen las optimizaciones individuales en sus valores por defecto del host en su lugar.
El ajuste del host persiste hasta que el host se reinicia: cada ajuste es una escritura solo en tiempo de ejecución que el runner no revierte al salir, excepto la retención de los C-states, que termina cuando el runner sale.
Tras una ejecución con ajustes, un flag que omite cualquier otro ajuste surte efecto a partir del siguiente reinicio: hasta entonces, el ajuste conserva su valor ajustado, y el runner registra ese valor al iniciarse.
Reinicie un host compartido después de quitar el runner.
--no-tuning
Desactiva todas las optimizaciones de ajuste del host.
--aslr
No desactiva ASLR (por defecto: desactivado para benchmarks).
--nmi-watchdog
No desactiva el watchdog NMI (por defecto: desactivado para benchmarks).
--smt
No desactiva SMT / hyper-threading (por defecto: desactivado para benchmarks).
--turbo
No desactiva turbo boost (por defecto: desactivado para benchmarks).
--numa-balancing
No desactiva el balanceo NUMA automático (por defecto: desactivado para benchmarks).
--timer-migration
No desactiva la migración de temporizadores (por defecto: desactivada para benchmarks).
--soft-watchdog
No desactiva el watchdog de soft lockup (por defecto: desactivado para benchmarks).
--ksm
No desactiva KSM, kernel samepage merging (por defecto: desactivado para benchmarks).
--cstates
No desactiva los C-states profundos (por defecto: desactivados para benchmarks).
--no-irq-steering
No dirige las IRQ de los dispositivos ni las workqueues del kernel a los núcleos de housekeeping.
--no-cpuset-partition
No separa los núcleos de benchmark del planificador mediante una partición cpuset aislada.
--swappiness <SWAPPINESS>
Establece el valor de swappiness.
Por defecto, se usa 10.
--governor <GOVERNOR>
Establece el governor de escalado de CPU.
Por defecto, se usa performance.
--perf-event-paranoid <PERF_EVENT_PARANOID>
Establece el valor de perf_event_paranoid.
Por defecto, se usa -1.
--thp <THP>
Establece el modo de transparent hugepage del host: never, madvise, always o leave.
Use leave para mantener el modo actual del host.
Por defecto, se usa never.
--help
Imprime la ayuda.