Facebook publică Hermit, un set de instrumente pentru execuția repetabilă a programelor

Facebook (interzis în Federația Rusă) a publicat codul pentru setul de instrumente Hermit, care creează un mediu de execuție deterministă a programelor, permițând diferite rulări pentru a obține același rezultat și repeta execuția folosind aceleași date de intrare. Codul proiectului este scris în Rust și este distribuit sub licența BSD.

În timpul execuției normale, rezultatul este influențat de o varietate de factori străini, cum ar fi ora curentă, programarea firelor, adresele de memorie virtuală, datele de la generatorul de numere pseudoaleatoare și diverși identificatori unici. Hermit vă permite să rulați un program într-un container în care acești factori rămân constanti pe parcursul rulărilor ulterioare. Execuția repetabilă, care reproduce în totalitate parametrii nepersistenti ai mediului, poate fi utilizată pentru diagnosticarea erorilor, depanare în mai multe etape cu rulări repetate, crearea unui mediu fix pentru teste de regresie, teste de stres, identificarea problemelor cu multithreading și în sistemele de construcție repetabile .

Facebook publică Hermit, un set de instrumente pentru execuția repetabilă a programelor

Un mediu reproductibil este creat prin interceptarea apelurilor de sistem, dintre care unele sunt înlocuite cu propriile lor handlere care produc un rezultat permanent, iar altele sunt redirecționate către kernel, după care rezultatul este șters de date nepersistente. Pentru a intercepta apelurile de sistem, se folosește cadrul de reverie, al cărui cod este publicat și de Facebook. Pentru a preveni modificarea sistemului de fișiere și a solicitărilor de rețea să afecteze progresul execuției, execuția este efectuată folosind o imagine FS fixă ​​și cu accesul la rețelele externe dezactivat. Când accesează generatorul de numere pseudoaleatoare, Hermit produce o secvență predefinită care se repetă de fiecare dată când este lansată.

Una dintre cele mai complexe influențe variabile asupra progresului execuției este planificatorul de fire, al cărui comportament depinde de mulți factori externi, cum ar fi numărul de nuclee CPU și prezența altor fire de execuție. Pentru a asigura un comportament repetabil al planificatorului, toate firele sunt executate în serie în legătură cu un singur nucleu CPU și menținând ordinea în care controlul este transferat către fire. Fiecărui thread i se permite să execute un număr fix de instrucțiuni, după care execuția se oprește și este transferată la un alt thread (pentru a limita CPU PMU (Performance Monitoring Unit), care oprește execuția după un anumit număr de ramuri condiționate).

Pentru a diagnostica problemele cu firele din cauza condițiilor de cursă, Hermit are un mod de identificare a operațiunilor a căror ordin de execuție a fost neregulat și a dus la o oprire anormală. Pentru identificarea unor astfel de probleme se face o comparație a stărilor în care s-au înregistrat funcționarea corectă și încetarea anormală a execuției.

Sursa: opennet.ru

Adauga un comentariu