Facebook 發布 Hermit,一個可重複執行程序的工具包

Facebook(在俄羅斯聯邦被禁止)發布了 Hermit 工具包的程式碼,該工具包創建了一個確定性執行程序的環境,允許不同的運行獲得相同的結果,並使用相同的輸入資料重複執行。 該專案程式碼是用 Rust 編寫的,並在 BSD 許可證下分發。

在正常執行期間,結果受到各種無關因素的影響,例如當前時間、執行緒調度、虛擬記憶體位址、來自偽隨機數產生器的資料以及各種唯一識別碼。 Hermit 允許您在容器中運行程序,其中這些因素在後續運行中保持不變。 可重複執行,完全重現環境的非持久參數,可用於錯誤診斷、重複運行的多步驟偵錯、為回歸測試建立固定環境、壓力測試、識別多執行緒和可重複建置系統中的問題。

Facebook 發布 Hermit,一個可重複執行程序的工具包

透過攔截系統呼叫來創建可重現的環境,其中一些系統呼叫被替換為它們自己的處理程序,產生永久結果,一些被重定向到內核,然後清除結果中的非持久性資料。 為了攔截系統調用,使用了 reverie 框架,其程式碼也由 Facebook 發布。 為了防止檔案系統和網路請求的變化影響執行進度,使用固定的FS鏡像執行,並且禁止存取外部網路。 當存取偽隨機數產生器時,Hermit 會產生一個預先定義的序列,每次啟動時都會重複該序列。

對執行進度影響最複雜的變數之一是執行緒調度程序,其行為取決於許多外部因素,例如 CPU 核心的數量和其他執行緒的存在。 為了確保調度程序的可重複行為,所有執行緒僅與一個 CPU 核心相關地串列執行,並保持控制權轉移到執行緒的順序。 每個執行緒被允許執行固定數量的指令,之後執行停止並轉移到另一個執行緒(以限制CPU PMU(效能監控單元),它在指定數量的條件分支後停止執行)。

為了診斷由於競爭條件導致的執行緒問題,Hermit 有一個模式可以識別執行順序無序並導致異常關閉的操作。 為了識別此類問題,對記錄正確操作和異常終止執行的狀態進行比較。

來源: opennet.ru

添加評論