Facebook pubblica Hermit, un toolkit per l'esecuzione ripetibile del programma

Facebook (vietato nella Federazione Russa) ha pubblicato il codice del toolkit Hermit, che costituisce un ambiente per l'esecuzione deterministica del programma, che consente di ottenere lo stesso risultato e di ripetere l'avanzamento dell'esecuzione utilizzando gli stessi dati di input a diversi lanci. Il codice del progetto è scritto in Rust e distribuito con licenza BSD.

Durante la normale esecuzione, vari fattori estranei influiscono sul risultato, come l'ora corrente, le funzionalità di pianificazione dei thread, gli indirizzi di memoria virtuale, i dati del generatore di numeri pseudo-casuali e vari identificatori univoci. Hermit ti consente di eseguire il programma in un contenitore in cui questi fattori rimangono costanti nelle esecuzioni successive. L'esecuzione ripetibile, che riproduce completamente le impostazioni dell'ambiente volatile, può essere utilizzata per la diagnosi degli errori, il debug in più fasi con ripetizioni, la creazione di un ambiente fisso per test di regressione, stress test, risoluzione dei problemi di multithreading e sistemi di compilazione ripetibili.

Facebook pubblica Hermit, un toolkit per l'esecuzione ripetibile del programma

Un ambiente riproducibile viene creato intercettando le chiamate di sistema, alcune delle quali vengono sostituite con i propri gestori che producono un risultato costante e alcune vengono reindirizzate al kernel, dopodiché il risultato viene cancellato dai dati non persistenti. Per intercettare le chiamate di sistema viene utilizzato il framework reverie, il cui codice è pubblicato anche da Facebook. Per evitare che le modifiche al file system e le richieste di rete influenzino l'avanzamento dell'esecuzione, l'esecuzione viene eseguita utilizzando un'immagine FS fissa e con l'accesso alle reti esterne disabilitato. Quando si accede al generatore di numeri pseudo-casuali, Hermit produce una sequenza predefinita che viene ripetuta ogni volta che viene eseguita.

Tra le influenze non permanenti più complesse sull'esecuzione c'è il thread scheduler, il cui comportamento dipende da molti fattori esterni, come il numero di core della CPU e la presenza di altri thread in esecuzione. Per garantire un comportamento ripetibile dello scheduler, tutti i thread vengono serializzati, associati a un solo core della CPU e nell'ordine in cui il controllo viene passato ai thread. Ogni thread può eseguire un numero fisso di istruzioni, dopodiché l'esecuzione si interrompe e viene trasferita a un altro thread (per limitare, viene utilizzata la CPU PMU (Performance Monitoring Unit), che interrompe l'esecuzione dopo un determinato numero di salti condizionali).

Per diagnosticare i problemi con i thread dovuti a una condizione di competizione, Hermit ha una modalità per rilevare le operazioni che erano fuori servizio e hanno portato a un arresto anomalo. Per individuare tali problematiche si confrontano gli stati in cui si sono registrati il ​​corretto funzionamento e il completamento anomalo dell'esecuzione.

Fonte: opennet.ru

Aggiungi un commento