Facebook publie Hermit, une boîte à outils pour l'exécution de programmes reproductibles

Facebook (interdit en Fédération de Russie) a publié le code de la boîte à outils Hermit, qui crée un environnement pour l'exécution déterministe de programmes, permettant à différentes exécutions d'obtenir le même résultat et de répéter l'exécution en utilisant les mêmes données d'entrée. Le code du projet est écrit en Rust et est distribué sous licence BSD.

Lors d'une exécution normale, le résultat est influencé par divers facteurs externes, tels que l'heure actuelle, la planification des threads, les adresses de mémoire virtuelle, les données du générateur de nombres pseudo-aléatoires et divers identifiants uniques. Hermit vous permet d'exécuter un programme dans un conteneur dans lequel ces facteurs restent constants lors des exécutions ultérieures. L'exécution répétable, qui reproduit entièrement les paramètres non persistants de l'environnement, peut être utilisée pour le diagnostic des erreurs, le débogage en plusieurs étapes avec des exécutions répétées, la création d'un environnement fixe pour les tests de régression, les tests de résistance, l'identification des problèmes de multi-threading et en répétabilité. construire des systèmes.

Facebook publie Hermit, une boîte à outils pour l'exécution de programmes reproductibles

Un environnement reproductible est créé en interceptant les appels système, dont certains sont remplacés par leurs propres gestionnaires qui produisent un résultat permanent, et certains sont redirigés vers le noyau, après quoi le résultat est débarrassé des données non persistantes. Pour intercepter les appels système, on utilise le framework reverie, dont le code est également publié par Facebook. Pour éviter que les modifications du système de fichiers et les requêtes réseau n'affectent la progression de l'exécution, l'exécution est effectuée à l'aide d'une image FS fixe et avec l'accès aux réseaux externes désactivé. Lors de l'accès au générateur de nombres pseudo-aléatoires, Hermit produit une séquence prédéfinie qui se répète à chaque lancement.

L'une des variables les plus complexes qui influencent la progression de l'exécution est le planificateur de threads, dont le comportement dépend de nombreux facteurs externes, tels que le nombre de cœurs de processeur et la présence d'autres threads en cours d'exécution. Pour garantir un comportement reproductible du planificateur, tous les threads sont exécutés en série en connexion avec un seul cœur de processeur et en conservant l'ordre dans lequel le contrôle est transféré aux threads. Chaque thread est autorisé à exécuter un nombre fixe d'instructions, après quoi l'exécution s'arrête et est transférée à un autre thread (pour limiter le CPU PMU (Performance Monitoring Unit), qui arrête l'exécution après un nombre spécifié de branches conditionnelles).

Pour diagnostiquer les problèmes de threads dus à des conditions de concurrence critique, Hermit dispose d'un mode d'identification des opérations dont l'ordre d'exécution était dans le désordre et a conduit à un arrêt anormal. Pour identifier de tels problèmes, une comparaison est effectuée entre les états dans lesquels un fonctionnement correct et une fin anormale de l'exécution ont été enregistrés.

Source: opennet.ru

Ajouter un commentaire