Hermit, una herramienta para pruebas controladas y detección de errores

noviembre 23, 2022 0 Comments

Hermit Facebook

Hermit, como contenedor reproducible, brinda una idea de cómo sería si la pila del sistema proporcionara repetibilidad como una abstracción

Facebook dio a conocer hace poco mediante una publicación, el lanzamiento de Hermit, que forma un entorno para la ejecución determinista del programa, lo que permite lograr el mismo resultado y repetir el proceso de ejecución en diferentes lanzamientos utilizando los mismos datos de entrada.

Durante la ejecución normal, varios factores extraños afectan el resultado, como la hora actual, las funciones de programación de subprocesos, las direcciones de memoria virtual, los datos de un generador de números pseudoaleatorios y varios identificadores únicos.

Hermit permite ejecutar el programa en un contenedor en el que estos factores permanecen constantes en ejecuciones posteriores. La ejecución repetible, que reproduce completamente la configuración del entorno volátil, se puede utilizar para el diagnóstico de errores, la depuración de varios pasos con repeticiones, la creación de un entorno fijo para las pruebas de regresión, las pruebas de estrés, la resolución de problemas de subprocesos múltiples y los sistemas de compilación repetibles.

Hermit fuerza la ejecución determinista de programas arbitrarios y actúa como un contenedor reproducible. Es decir, aísla herméticamente el programa de fuentes de no determinismo como el tiempo, el entrelazado de subprocesos, la generación de números aleatorios, etc. El determinismo garantizado es una herramienta poderosa y sirve como base para una serie de aplicaciones, incluidas las pruebas de estrés de concurrencia, grabación/reproducción, compilaciones reproducibles y diagnóstico automático de errores de concurrencia, y más.

Hermit no puede aislar el programa invitado de fuentes de no determinismo, como cambios en el sistema de archivos o respuestas de redes externas. En cambio, para proporcionar un determinismo completo, el usuario debe proporcionar una imagen base del sistema de archivos fijo (por ejemplo, con Docker) y deshabilitar las redes externas.

Sobre Hermit

Hermit permite poder crea un entorno reproducible al interceptar las llamadas al sistema, algunas de las cuales se reemplazan con sus propios controladores que producen un resultado constante, y algunas se redireccionan al núcleo, después de lo cual se eliminan los datos no persistentes del resultado.

Para interceptar llamadas al sistema, se utiliza el marco de reverie, cuyo código también es publicado por Facebook. Para evitar que los cambios en el sistema de archivos y las solicitudes de red afecten el progreso de la ejecución, la ejecución se realiza utilizando una imagen fija del sistema de archivos y con el acceso a redes externas deshabilitado. Al acceder al generador de números pseudoaleatorios, Hermit produce una secuencia predefinida que se repite cada vez que se ejecuta.

La fuente más compleja de no determinismo está en el programador de subprocesos. La forma en que el kernel programa los subprocesos depende de muchos factores externos, incluida la cantidad de CPU físicas u otros subprocesos que se ejecutan en el sistema que requieren tiempo de CPU

De las influencias no permanentes más complejas en la ejecución, destaca el planificador de subprocesos, cuyo comportamiento depende de muchos factores externos, como la cantidad de núcleos de CPU y la presencia de otros subprocesos en ejecución.

Para garantizar el comportamiento repetible del programador, todos los subprocesos se serializan, se vinculan a un solo núcleo de CPU y en el orden en que se pasa el control a los subprocesos. A cada subproceso se le permite ejecutar un número fijo de instrucciones, después de lo cual la ejecución se detiene y se transfiere a otro subproceso (para limitar, se usa la CPU PMU (Unidad de Monitoreo de Rendimiento), que detiene la ejecución después de un número específico de bifurcaciones condicionales).

Para diagnosticar problemas con subprocesos debido a una condición de carrera, Hermit tiene un modo para detectar operaciones que estaban fuera de servicio y provocaron un bloqueo. Para identificar dichos problemas, se hace una comparación de los estados en los que se registraron el funcionamiento correcto y la terminación anormal de la ejecución.

Finalmente, si estás interesado en poder conocer más al respecto, debes saber que el código del proyecto está escrito en Rust y se distribuye bajo la licencia BSD.

Puedes consultar los detalles en el siguiente enlace.


Some say he’s half man half fish, others say he’s more of a seventy/thirty split. Either way he’s a fishy bastard.