Eu gostaria de entender de maneira abrangente o custo de desempenho em tempo de execução de um contêiner Docker. Eu encontrei referências a redes anedoticamente sendo ~ 100µs mais lentas .
Também achei referências ao custo em tempo de execução "desprezível" e "próximo de zero", mas gostaria de saber com mais precisão quais são esses custos. Idealmente, eu gostaria de saber o que o Docker está abstraindo com um custo de desempenho e as coisas abstratas sem um custo de desempenho. Rede, CPU, memória, etc.
Além disso, se houver custos de abstração, existem maneiras de contornar o custo de abstração. Por exemplo, talvez eu possa montar um disco diretamente versus virtualmente no Docker.
performance
docker
Luke Hoersten
fonte
fonte
Respostas:
Um excelente artigo de pesquisa da IBM para 2014 “ Uma comparação atualizada de desempenho de máquinas virtuais e contêineres Linux ” de Felter et al. fornece uma comparação entre contêineres bare metal, KVM e Docker. O resultado geral é: O Docker é quase idêntico ao desempenho nativo e mais rápido que o KVM em todas as categorias.
A exceção é o NAT do Docker - se você usar o mapeamento de portas (por exemplo,
docker run -p 8080:8080
), poderá esperar um pequeno acerto na latência, como mostrado abaixo. No entanto, agora você pode usar a pilha de rede do host (por exemplo,docker run --net=host
) ao iniciar um contêiner do Docker, que funcionará de maneira idêntica à coluna Nativa (como mostrado nos resultados de latência do Redis, abaixo).Eles também executaram testes de latência em alguns serviços específicos, como o Redis. Você pode ver que, acima de 20 encadeamentos do cliente, a sobrecarga de latência mais alta passa pelo NAT do Docker, depois pelo KVM e, então, um vínculo aproximado entre o host / nativo do Docker.
Só porque é um artigo realmente útil, aqui estão algumas outras figuras. Faça o download para obter acesso completo.
Analisando E / S de disco:
Agora, olhando para a sobrecarga da CPU:
Agora, alguns exemplos de memória (leia o artigo para obter detalhes, a memória pode ser mais complicada):
fonte
--net=host
(dois traços) e-p 8080:8080
(minúsculas 'p') para NAT.O Docker não é virtualização, como tal - em vez disso, é uma abstração sobre o suporte do kernel a diferentes espaços de nomes de processos, espaços de nomes de dispositivos, etc .; um espaço de nomes não é inerentemente mais caros ou ineficientes do que o outro, então o que realmente faz Docker ter um impacto no desempenho é uma questão do que é realmente em esses espaços para nome.
As opções do Docker em termos de como ele configura os namespaces para seus contêineres têm custos, mas todos esses custos estão diretamente associados aos benefícios - você pode desistir deles, mas ao fazê-lo, você também renuncia ao benefício associado:
E assim por diante. Quanto esses custos realmente afetam você em seu ambiente - com seus padrões de acesso à rede, restrições de memória etc. - é um item para o qual é difícil fornecer uma resposta genérica.
fonte
Aqui está mais alguns benchmarks de
Docker based memcached server
comparaçãohost native memcached server
usando a ferramenta de benchmark Twemperf https://github.com/twitter/twemperf com 5000 conexões e 20k taxa de conexãoO tempo de conexão excedido para o memcached baseado no docker parece concordar com o whitepaper acima, aproximadamente à velocidade nativa duas vezes.
Twemperf Docker Memcached
Twemperf Centmin Mod Memcached
Aqui estão as referências básicas usando a ferramenta de referência mais importante
memtier_benchmark docker Memcached
memtier_benchmark Centmin Mod Memcached
fonte
avg 200.5 min 0.6 max 263.2 stddev 73.85