keybench es una herramienta de código abierto para medir el rendimiento de almacenes de clave-valor ordenados. Escrita en C y con cargas de trabajo definidas en Lua, ejecuta el mismo script contra varios motores de almacenamiento para que la comparación refleje los motores y no el propio banco de pruebas.
La aplicación se organiza en cinco componentes intercambiables. El motor de ejecución gestiona la concurrencia: crea los hilos de trabajo, reparte el presupuesto de operaciones entre ellos y los une, sin imponer bloqueos externos, de modo que un motor serializado se mide como tal y uno paralelo como paralelo. La carga de trabajo es una tabla Lua con funciones de carga (load) y de ejecución medida (run). El acceso al almacén se realiza a través de un conjunto unificado de ocho verbos (put, get, del, range, scan, mget, mput, mdel) que llegan al motor activo. Cada motor vive en backends/ como un plugin autorregistrado, por lo que añadir uno nuevo es solo un directorio y una vtable, sin tocar el núcleo. Por último, los reporters reciben metadatos, sondas y muestras en tiempo real, con implementaciones para consola, TSV y línea temporal.
En métricas, keybench separa workload units por segundo (wu/s), la tasa de operaciones completas definidas por el script, de operaciones primitivas por segundo (ops/s), la tasa de accesos individuales a claves. Para cada verbo registra una distribución de latencia con p50, p99, p99.9 y máximo, en lugar de un promedio. Cuando una unidad agrupa B toques a claves, ops/s equivale exactamente a wu/s por B, lo que hace visible el coste fijo por llamada repartido entre más claves.
La compilación por defecto solo requiere un compilador de C y pthreads, ya que la herramienta incluye su propia copia de Lua. El motor de referencia es un skiplist en memoria; los motores persistentes opcionales son RocksDB y TidesDB, activables con flags de make. Para evitar conflictos de asignadores, el sistema de compilación permite enlazar jemalloc o tcmalloc con la variable ALLOC.
Los casos de uso principales son la comparación objetiva entre motores y la caracterización de cargas realistas escritas en Lua. La principal limitación es que el resultado mide el motor junto con el script, por lo que un workload mal definido puede enmascarar el comportamiento real del motor.
