Facebook publica Hermit, um kit de ferramentas para execução repetível de programas

O Facebook (banido na Federação Russa) publicou o código do kit de ferramentas Hermit, que cria um ambiente para execução determinística de programas, permitindo que diferentes execuções alcancem o mesmo resultado e repitam a execução usando os mesmos dados de entrada. O código do projeto é escrito em Rust e distribuído sob a licença BSD.

Durante a execução normal, o resultado é influenciado por vários fatores externos, como horário atual, agendamento de threads, endereços de memória virtual, dados do gerador de números pseudoaleatórios e vários identificadores exclusivos. O Hermit permite que você execute um programa em um contêiner no qual esses fatores permanecem constantes nas execuções subsequentes. A execução repetível, que reproduz totalmente os parâmetros não persistentes do ambiente, pode ser usada para diagnóstico de erros, depuração em várias etapas com execuções repetidas, criação de um ambiente fixo para testes de regressão, testes de estresse, identificação de problemas com multithreading e em sistemas de construção repetíveis .

Facebook publica Hermit, um kit de ferramentas para execução repetível de programas

Um ambiente reproduzível é criado pela interceptação de chamadas do sistema, algumas das quais são substituídas por seus próprios manipuladores que produzem um resultado permanente, e algumas são redirecionadas para o kernel, após o qual o resultado é limpo de dados não persistentes. Para interceptar chamadas do sistema, é utilizado o framework devaneio, cujo código também é publicado pelo Facebook. Para evitar que alterações no sistema de arquivos e nas solicitações de rede afetem o andamento da execução, a execução é realizada por meio de uma imagem FS fixa e com o acesso a redes externas desabilitado. Ao acessar o gerador de números pseudoaleatórios, o Hermit produz uma sequência predefinida que se repete toda vez que é iniciado.

Uma das variáveis ​​mais complexas que influenciam o progresso da execução é o escalonador de threads, cujo comportamento depende de muitos fatores externos, como o número de núcleos da CPU e a presença de outras threads em execução. Para garantir um comportamento repetível do escalonador, todas as threads são executadas serialmente em conexão com apenas um núcleo da CPU e mantendo a ordem na qual o controle é transferido para as threads. Cada thread tem permissão para executar um número fixo de instruções, após o qual a execução é interrompida e transferida para outro thread (para limitar a CPU PMU (Performance Monitoring Unit), que interrompe a execução após um determinado número de ramificações condicionais).

Para diagnosticar problemas com threads devido a condições de corrida, o Hermit possui um modo para identificar operações cuja ordem de execução estava fora de ordem e levou a um desligamento anormal. Para identificar tais problemas, é feita uma comparação dos estados em que foram registrados o funcionamento correto e o encerramento anormal da execução.

Fonte: opennet.ru

Adicionar um comentário