Facebook апублікаваў Hermit, інструментарый для паўтаранага выканання праграм

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

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

Facebook апублікаваў Hermit, інструментарый для паўтаранага выканання праграм

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

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

Для дыягностыкі праблем са струменямі з-за ўзнікнення стану гонкі ў Hermit маецца рэжым выяўлення аперацый, парадак выканання якіх быў парушаны і прывёў да аварыйнага завяршэння працы. Для выяўлення такіх праблем ажыццяўляецца параўнанне станаў, пры якіх фіксавалася карэктная работа і аварыйнае завяршэнне выканання.

Крыніца: opennet.ru

Дадаць каментар