Qual è il costo delle prestazioni di runtime di un contenitore Docker

Mi piacerebbe comprendere in modo completo il costo delle prestazioni in fase di esecuzione di un container Docker. Ho trovato riferimenti al networking che in realtà è più lento di ~ 100μs .

Ho anche trovato riferimenti al costo di esecuzione “trascurabile” e “vicino allo zero”, ma mi piacerebbe sapere con maggiore precisione quali sono questi costi. Idealmente mi piacerebbe sapere cosa sta facendo Docker con un costo di prestazioni e cose che sono astratte senza un costo di prestazioni. Rete, CPU, memoria, ecc.

Inoltre, se ci sono costi di astrazione, ci sono modi per aggirare il costo di astrazione. Ad esempio, forse posso montare un disco direttamente rispetto a virtualmente in Docker.

Ecco un eccellente documento di ricerca IBM del 2014 intitolato “Un confronto aggiornato delle prestazioni di macchine virtuali e contenitori Linux” di Felter et al. che fornisce un confronto tra bare metal, contenitori KVM e Docker. Il risultato generale è che Docker è quasi identico alle prestazioni native e più veloce di KVM in ogni categoria.

L’eccezione è rappresentata dal NAT di Docker: se si utilizza la mapping delle porte (es. Docker docker run -p 8080:8080 ), è ansible che si verifichi un lieve errore di latenza, come illustrato di seguito. Tuttavia, ora è ansible utilizzare lo stack di rete host (ad es. docker run --net=host ) quando si avvia un contenitore Docker, che si comporterà in modo identico alla colonna Native (come mostrato nei risultati di latenza di Redis in basso).

Sovraccarico NAT Docker

Hanno anche eseguito test di latenza su alcuni servizi specifici, come Redis. Puoi vedere che sopra i 20 thread del client, il sovraccarico di latenza più elevato va a Docker NAT, quindi a KVM, quindi a un legame approssimativo per l’host / nativo Docker.

finestra mobile redis latenza ambientale

Solo perché è una carta veramente utile, ecco alcune altre figure. Si prega di scaricarlo per l’accesso completo.

Diamo un’occhiata al disco IO:

IO docker vs kvm vs nativo

Ora guardando il sovraccarico della CPU:

cpu overhead della docker

Ora alcuni esempi di memoria (leggi la carta per i dettagli, la memoria può essere più complicata)

confronto della memoria docker

Docker non è virtualizzazione, in quanto tale – invece, è un’astrazione in cima al supporto del kernel per diversi spazi dei nomi di processo, spazi dei nomi dei dispositivi, ecc .; uno spazio dei nomi non è intrinsecamente più costoso o inefficiente di un altro, quindi ciò che rende effettivamente Docker un impatto sulle prestazioni è una questione di ciò che è effettivamente in quegli spazi dei nomi.


Le scelte del Docker in termini di configurazione degli spazi dei nomi per i relativi contenitori hanno dei costi, ma tali costi sono tutti direttamente associati ai vantaggi: è ansible rinunciarvi, ma in tal modo si rinuncia ai benefici associati:

  • I filesystem a livelli sono costosi – esattamente quanto i costi variano con ciascuno (e Docker supporta più backend) e con i tuoi pattern di utilizzo (unendo più directory di grandi dimensioni, o un set di filesystem molto profondo sarà particolarmente costoso), ma Non sono libero. D’altra parte, una grande quantità di funzionalità di Docker – essere in grado di build ospiti dagli altri ospiti in modo copy-on-write e ottenere vantaggi di storage impliciti nello stesso – cavalcare a pagare questo costo.
  • DNAT diventa costoso su larga scala, ma ti dà il vantaggio di poter configurare la rete del tuo ospite indipendentemente dall’host e avere una comoda interfaccia per inoltrare solo le porte che vuoi tra di loro. È ansible sostituirlo con un bridge su un’interfaccia fisica, ma, di nuovo, perdere il vantaggio.
  • Essere in grado di eseguire ogni stack di software con le sue dipendenze installate nel modo più conveniente, indipendentemente dalla distribuzione dell’host, dalla libc e da altre versioni di librerie, è un grande vantaggio, ma è necessario caricare le librerie condivise più di una volta (quando le loro versioni differire) ha il costo che ti aspetteresti.

E così via. Quanto questi costi abbiano effettivamente impatto sul tuo ambiente – con i tuoi schemi di accesso alla rete, i tuoi limiti di memoria, ecc. – è un articolo per il quale è difficile fornire una risposta generica.

Ecco alcuni altri punti di riferimento per Docker based memcached server e Docker based memcached server host native memcached server utilizzando lo strumento di benchmark Twemperf https://github.com/twitter/twemperf con 5000 connessioni e velocità di connessione 20k

L’overhead del tempo di connessione per memcached basato su docker sembra essere d’accordo con il whitepaper di sopra a circa due volte la velocità 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 

Ecco i bencmarks che utilizzano lo strumento benchmark di 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