O Hermit, como um contêiner reprodutível, dá uma ideia de como seria se a pilha do sistema fornecesse repetibilidade como uma abstração
Facebook revelado recentemente através de uma publicação, o lançamento de Eremita, que forma um ambiente para execução de programas determinísticos, o que permite obter o mesmo resultado e repetir o processo de execução em diferentes inicializações usando os mesmos dados de entrada.
Durante a execução normal, vários fatores estranhos afetam a saída, como a hora atual, funções de agendamento de encadeamento, endereços de memória virtual, dados de um gerador de números pseudo-aleatórios e vários identificadores exclusivos.
Hermit permite executar o programa em um contêiner onde esses fatores permanecem constantes nas execuções subsequentes. Execução repetível, que reproduz totalmente a configuração do ambiente volátil, pode ser usado para diagnóstico de erros, depuração várias etapas com iterações, criando um ambiente fixo para testes de regressão, testes de estresse, solução de problemas multiencadeados e sistemas de construção repetíveis.
O Hermit força a execução determinística de programas arbitrários e atua como um invólucro reproduzível. Ou seja, isola hermeticamente o programa de fontes de não determinismo, como temporização, intercalação de threads, geração de números aleatórios, etc. O determinismo garantido é uma ferramenta poderosa e serve como base para vários aplicativos, incluindo testes de estresse de simultaneidade, gravação/reprodução, compilações reproduzíveis e diagnóstico automático de erros de simultaneidade e muito mais.
O Hermit não pode isolar o programa convidado de fontes de não determinismo, como alterações no sistema de arquivos ou respostas de redes externas. Em vez disso, para fornecer determinismo total, o usuário deve fornecer uma imagem base do sistema de arquivos fixo (por exemplo, com Docker) e desabilitar as redes externas.
Sobre o Eremita
Eremita permite energia cria um ambiente reproduzível interceptando chamadas do sistema, algumas das quais são substituídas por seus próprios manipuladores que produzem uma saída constante e algumas das quais são redirecionadas para o kernel, após o que os dados não persistentes são removidos da saída.
Para interceptar chamadas Ao sistema, quadro é usado devaneio, cujo código também é publicado pelo Facebook. Para evitar que alterações no sistema de arquivos e solicitações de rede afetem o andamento da execução, a execução é realizada usando uma imagem estática do sistema de arquivos e com acesso a redes externas desabilitado. Ao acessar o gerador de números pseudoaleatórios, o Hermit produz uma sequência predefinida que se repete cada vez que é executada.
A fonte mais complexa de não determinismo está no escalonador de threads. A maneira como o kernel agenda os threads depende de muitos fatores externos, incluindo o número de CPUs físicas ou outros threads em execução no sistema que requerem tempo de CPU.
Das influências não permanentes mais complexas sobre o desempenho, agendador de threads de destaque, cujo comportamento depende de muitos fatores externos, como o número de núcleos da CPU e a presença de outros encadeamentos em execução.
Para garantir um comportamento repetível do agendador, todos os threads são serializados, vinculados a um único núcleo de CPU e na ordem em que o controle é passado para os threads. Cada thread pode executar um número fixo de instruções, após o que a execução é interrompida e transferida para outro thread (para limitação, é usada a CPU PMU (Performance Monitoring Unit), que interrompe a execução após um número especificado de ramificações condicionais).
Diagnosticar problemas com threads devido a uma condição de corrida, Hermit tem um modo para detectar operações que estavam fora de ordem e causou um bloqueio. Para identificar tais problemas, é feita uma comparação entre os estados em que foi registrada a operação correta e o término anormal da execução.
Finalmente, se você está interessado em aprender mais sobre isso, você deve saber que o código do projeto é escrito em Rust e é distribuído sob a licença BSD.
Você pode conferir os detalhes em o seguinte link.