Facebook vydává Hermit, sadu nástrojů pro opakovatelné spouštění programů

Facebook (v Ruské federaci zakázaný) zveřejnil kód sady nástrojů Hermit, která tvoří prostředí pro deterministické spouštění programu, které umožňuje získat stejný výsledek a opakovat průběh provádění pomocí stejných vstupních dat při různých spuštěních. Kód projektu je napsán v Rustu a distribuován pod licencí BSD.

Během normálního provádění ovlivňují výsledek různé vnější faktory, jako je aktuální čas, funkce plánování vláken, adresy virtuální paměti, data z generátoru pseudonáhodných čísel a různé jedinečné identifikátory. Hermit vám umožňuje spouštět program v kontejneru, ve kterém tyto faktory zůstávají při dalších spuštěních konstantní. Opakovatelné spouštění, které plně reprodukuje nestálá nastavení prostředí, lze použít pro diagnostiku chyb, vícefázové ladění s opakovaným spuštěním, vytvoření pevného prostředí pro regresní testy, zátěžové testování, řešení problémů s vícevlákny a opakovatelné sestavovací systémy.

Facebook vydává Hermit, sadu nástrojů pro opakovatelné spouštění programů

Reprodukovatelné prostředí je vytvořeno zachycením systémových volání, z nichž některá jsou nahrazena svými vlastními ovladači, které produkují konstantní výsledek, a některá jsou přesměrována do jádra, načež je výsledek vyčištěn od neperzistentních dat. K odposlechu systémových hovorů slouží reverie framework, jehož kód zveřejňuje i Facebook. Aby změny v systému souborů a síťové požadavky neovlivnily průběh provádění, provádění se provádí pomocí pevného obrazu FS a se zakázaným přístupem k externím sítím. Při přístupu ke generátoru pseudonáhodných čísel Hermit vytváří předdefinovanou sekvenci, která se opakuje při každém spuštění.

Mezi nejsložitější nestálé vlivy na provádění patří plánovač vláken, jehož chování závisí na mnoha vnějších faktorech, jako je počet jader CPU a přítomnost dalších běžících vláken. Aby bylo zajištěno opakovatelné chování plánovače, jsou všechna vlákna serializována, vázána pouze na jedno jádro CPU a v pořadí, ve kterém je řízení předáno vláknům. Každému vláknu je povoleno provádět pevně stanovený počet instrukcí, po kterých se provádění zastaví a přenese se do jiného vlákna (pro omezení se používá CPU PMU (Performance Monitoring Unit), která zastaví provádění po zadaném počtu podmíněných větví).

Pro diagnostiku problémů s vlákny v důsledku sporu má Hermit režim pro detekci operací, které byly mimo provoz a vedly k havárii. K identifikaci takových problémů se provádí porovnání stavů, ve kterých byla zaznamenána správná operace a abnormální dokončení provedení.

Zdroj: opennet.ru

Přidat komentář