Facebook опублікував Hermit, інструментарій для виконання програм, що повторюється

Facebook (заборонений в РФ) опублікував код інструментарію Hermit, що формує оточення для детермінованого виконання програм, що дозволяє при різних запусках домогтися отримання незмінного результату та повторення ходу виконання при використанні тих самих вхідних даних. Код проекту написаний мовою Rust та поширюється під ліцензією BSD.

При звичайному виконанні результат впливають різноманітні сторонні фактори, такі як поточний час, особливості планування виконання потоків, адреси віртуальної пам'яті, дані від генератора псевдовипадкових чисел і різні унікальні ідентифікатори. Hermit дозволяє запустити програму в контейнері, в якому ці фактори залишаються постійними при наступних запусках. Повторюване виконання, при якому повністю відтворюються непостійні параметри оточення, може застосовуватися для діагностики помилок, багатоетапного налагодження з повторними запусками, створення фіксованого оточення для проведення регресійних тестів, стрес-тестування, виявлення проблем з багатопоточністю та в системах зборок, що повторюються.

Facebook опублікував Hermit, інструментарій для виконання програм, що повторюється

Відтворюване оточення створюється через перехоплення системних викликів, частина з яких підміняється на власні обробники, що видають постійний результат, а частина перенаправляється в ядро, після чого результат очищається від непостійних даних. Для перехоплення системних викликів використовується фреймворк reverie, код якого також опубліковано компанією Facebook. Для запобігання впливу на хід виконання змін у файловій системі та мережевих запитів виконання здійснюється з використанням фіксованого образу ФС і з відключенням доступу до зовнішніх мереж. При зверненні до генератора псевдовипадкових чисел Hermit видає певну послідовність, що повторюється під час кожного запуску.

З найбільш складних непостійних впливів на хід виконання виділяється планувальник потоків, поведінка якого залежить від багатьох зовнішніх факторів, таких як число ядер CPU та наявність інших потоків, що виконуються. Для забезпечення повторюваності поведінки планувальника всі потоки виконуються серіалізовано у прив'язці тільки до одного ядра CPU та зі збереженням порядку передачі керування потоками. Кожному потоку дозволено виконати фіксовану кількість інструкцій, після чого виконання зупиняється та передається іншому потоку (для обмеження використовується блок CPU PMU (Performance Monitoring Unit), який зупиняє виконання після заданої кількості умовних розгалужень).

Для діагностики проблем із потоками через виникнення стану гонки в Hermit є режим виявлення операцій, порядок виконання яких було порушено та привів до аварійного завершення роботи. Для виявлення подібних проблем здійснюється порівняння станів, за яких фіксувалася коректна робота та аварійне завершення виконання.

Джерело: opennet.ru

Додати коментар або відгук