Facebook (verboden in Rusland) heeft de code gepubliceerd voor de Hermit-toolkit, die een omgeving creëert voor deterministische programma-uitvoering. Dit zorgt voor consistente resultaten en herhaalbare uitvoering bij gebruik van dezelfde invoergegevens in verschillende runs. De projectcode is geschreven in Rust en wordt gedistribueerd onder de BSD-licentie.
Tijdens normale uitvoering wordt de uitvoer beïnvloed door diverse externe factoren, zoals de huidige tijd, thread-scheduling, virtuele geheugenadressen, gegevens van pseudo-random number generators en diverse unieke identificatiegegevens. Met Hermit kunt u een programma uitvoeren in een container waarin deze factoren constant blijven bij opeenvolgende uitvoeringen. Herhaalbare uitvoering, die niet-constante omgevingsparameters volledig reproduceert, kan worden gebruikt voor foutdiagnose, multi-stage debugging met herhaalde uitvoeringen, het creëren van een vaste omgeving voor regressietests, stresstests, het identificeren van multithreading-problemen en in herhaalbare buildsystemen.

De reproduceerbare omgeving wordt gecreëerd door systeemaanroepen te onderscheppen, waarvan sommige worden vervangen door hun eigen handlers die een constant resultaat opleveren, en andere worden omgeleid naar de kernel, waarna het resultaat wordt ontdaan van vluchtige gegevens. Het Reverie-framework wordt gebruikt om systeemaanroepen te onderscheppen, waarvan de code ook door Facebook wordt gepubliceerd. Om te voorkomen dat wijzigingen in het bestandssysteem en netwerkverzoeken het uitvoeringsproces beïnvloeden, wordt de uitvoering uitgevoerd met behulp van een vaste FS-image en is de toegang tot externe netwerken uitgeschakeld. Bij het benaderen van de pseudo-random number generator genereert Hermit een vooraf gedefinieerde reeks die bij elke start wordt herhaald.
Een van de meest complexe, niet-constante invloeden op het uitvoeringsproces is de threadscheduler, waarvan het gedrag afhankelijk is van vele externe factoren, zoals het aantal CPU-cores en de aanwezigheid van andere threads die worden uitgevoerd. Om de herhaalbaarheid van het gedrag van de scheduler te garanderen, worden alle threads serieel uitgevoerd, gekoppeld aan slechts één CPU-core en met behoud van de volgorde van de controleoverdracht naar de threads. Elke thread mag een vast aantal instructies uitvoeren, waarna de uitvoering wordt gestopt en overgedragen aan een andere thread (het CPU PMU-blok (Performance Monitoring Unit) wordt gebruikt om de uitvoering te beperken en te stoppen na een bepaald aantal voorwaardelijke vertakkingen).
Om problemen met threads te diagnosticeren die het gevolg zijn van een raceconditie, beschikt Hermit over een modus voor het identificeren van bewerkingen waarvan de uitvoeringsvolgorde is geschonden en die hebben geleid tot een abnormale beëindiging van het werk. Om dergelijke problemen te identificeren, wordt een vergelijking gemaakt tussen de statussen waarin een correcte bewerking en een abnormale beëindiging van de uitvoering werden geregistreerd.
Bron: opennet.ru
