performance - with - publish docker container




Qual é o custo de desempenho em tempo de execução de um contêiner do Docker? (2)

Aqui estão mais alguns benchmarks para o Docker based memcached server versus host native memcached server usando a ferramenta de benchmark Twemperf https://github.com/twitter/twemperf com 5000 conexões e taxa de conexão de 20k

A sobrecarga de tempo de conexão para o memcached baseado no docker parece concordar com o whitepaper acima em aproximadamente duas vezes a velocidade nativa.

Twemperf Docker Memcached

Connection rate: 9817.9 conn/s
Connection time [ms]: avg 341.1 min 73.7 max 396.2 stddev 52.11
Connect time [ms]: avg 55.0 min 1.1 max 103.1 stddev 28.14
Request rate: 83942.7 req/s (0.0 ms/req)
Request size [B]: avg 129.0 min 129.0 max 129.0 stddev 0.00
Response rate: 83942.7 rsp/s (0.0 ms/rsp)
Response size [B]: avg 8.0 min 8.0 max 8.0 stddev 0.00
Response time [ms]: avg 28.6 min 1.2 max 65.0 stddev 0.01
Response time [ms]: p25 24.0 p50 27.0 p75 29.0
Response time [ms]: p95 58.0 p99 62.0 p999 65.0

Twemperf Centmin Mod Memcached

Connection rate: 11419.3 conn/s
Connection time [ms]: avg 200.5 min 0.6 max 263.2 stddev 73.85
Connect time [ms]: avg 26.2 min 0.0 max 53.5 stddev 14.59
Request rate: 114192.6 req/s (0.0 ms/req)
Request size [B]: avg 129.0 min 129.0 max 129.0 stddev 0.00
Response rate: 114192.6 rsp/s (0.0 ms/rsp)
Response size [B]: avg 8.0 min 8.0 max 8.0 stddev 0.00
Response time [ms]: avg 17.4 min 0.0 max 28.8 stddev 0.01
Response time [ms]: p25 12.0 p50 20.0 p75 23.0
Response time [ms]: p95 28.0 p99 28.0 p999 29.0

Aqui está bencmarks usando ferramenta de benchmark memtier

memtier_benchmark docker Memcached

4         Threads
50        Connections per thread
10000     Requests per thread
Type        Ops/sec     Hits/sec   Misses/sec      Latency       KB/sec
------------------------------------------------------------------------
Sets       16821.99          ---          ---      1.12600      2271.79
Gets      168035.07    159636.00      8399.07      1.12000     23884.00
Totals    184857.06    159636.00      8399.07      1.12100     26155.79

memtier_benchmark Centmin Mod Memcached

4         Threads
50        Connections per thread
10000     Requests per thread
Type        Ops/sec     Hits/sec   Misses/sec      Latency       KB/sec
------------------------------------------------------------------------
Sets       28468.13          ---          ---      0.62300      3844.59
Gets      284368.51    266547.14     17821.36      0.62200     39964.31
Totals    312836.64    266547.14     17821.36      0.62200     43808.90

Gostaria de compreender de forma abrangente o custo de desempenho em tempo de execução de um contêiner do Docker. Eu encontrei referências ao networking sendo anedotamente ~ 100µs mais lento .

Também encontrei referências ao custo em tempo de execução como "insignificante" e "próximo de zero", mas gostaria de saber com mais precisão quais são esses custos. Idealmente, gostaria de saber o que o Docker está abstraindo com um custo de desempenho e coisas que são abstraídas 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 vs. virtualmente no Docker.


O Docker não é virtualização, como tal - em vez disso, é uma abstração sobre o suporte do kernel para namespaces de processo diferentes, namespaces de dispositivo, etc .; um namespace não é inerentemente mais caro ou ineficiente que outro, então o que realmente faz o Docker ter um impacto no desempenho é uma questão do que realmente está nesses namespaces.

As escolhas do Docker em termos de como ele configura namespaces para seus contêineres têm custos, mas esses custos são todos diretamente associados aos benefícios - você pode desistir deles, mas ao fazer isso você também desiste do benefício associado:

  • Os sistemas de arquivos em camadas são caros - exatamente quais são os custos variam de acordo com cada um (e o Docker suporta vários backends) e com seus padrões de uso (mesclar vários diretórios grandes ou mesclar um conjunto muito profundo de sistemas de arquivos será particularmente caro). não está livre. Por outro lado, uma grande parte da funcionalidade do Docker - ser capaz de criar convidados de outros hóspedes de uma maneira copy-on-write e obter as vantagens de armazenamento implícitas na mesma - depende do pagamento desse custo.
  • A DNAT se torna cara em grande escala - mas oferece a você o benefício de poder configurar a rede do seu convidado independentemente do seu host e ter uma interface conveniente para encaminhar apenas as portas que você deseja entre elas. Você pode substituir isso por uma ponte para uma interface física, mas, novamente, perder o benefício.
  • Ser capaz de executar cada pilha de software com suas dependências instaladas da maneira mais conveniente - independente da distro, libc e outras versões de biblioteca do host - é um grande benefício, mas precisa carregar bibliotecas compartilhadas mais de uma vez (quando suas versões diferem) tem o custo que você esperaria.

E assim por diante. O 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.







docker