web-dev-qa-db-fra.com

Quel est le coût des performances d'exécution d'un conteneur Docker?

J'aimerais comprendre de manière exhaustive le coût des performances d'exécution d'un conteneur Docker. J'ai trouvé des références à la mise en réseau étant anecdotique d'environ 100µs plus lente .

J'ai également trouvé des références aux coûts d'exécution "négligeables" et "proches de zéro", mais j'aimerais savoir plus précisément quels sont ces coûts. Idéalement, j'aimerais savoir ce que Docker fait pour résumer avec un coût de performance et des éléments abstraits sans coût de performance. Mise en réseau, processeur, mémoire, etc.

En outre, s’il existe des coûts d’abstraction, existe-t-il des moyens de contourner le coût d’abstraction? Par exemple, je peux peut-être monter un disque directement ou virtuellement dans Docker.

432
Luke Hoersten

Here est un excellent document de recherche IBM publié en 2014 et intitulé "Comparaison des performances mises à jour des machines virtuelles et des conteneurs Linux" par Felter et al. qui fournit une comparaison entre les conteneurs nus, KVM et Docker. Le résultat général est que Docker est presque identique à la performance native et plus rapide que KVM dans toutes les catégories.

La seule exception à cette règle est NAT de Docker. Si vous utilisez le mappage de ports (par exemple, docker run -p 8080:8080), vous pouvez vous attendre à un succès mineur en temps de latence, comme indiqué ci-dessous. Cependant, vous pouvez maintenant utiliser la pile réseau de l'hôte (par exemple docker run --net=Host) lors du lancement d'un conteneur Docker, qui fonctionnera de manière identique à la colonne Native (comme indiqué dans les résultats de latence Redis plus bas).

Docker NAT overhead

Ils ont également effectué des tests de latence sur quelques services spécifiques, tels que Redis. Vous pouvez voir qu'au-dessus de 20 threads client, le temps système de latence le plus élevé passe au NAT Docker, puis au KVM, puis à un lien approximatif entre l'hôte/le natif Docker.

docker Redis latency overhead

Juste parce que c'est un article vraiment utile, voici quelques autres chiffres. Veuillez le télécharger pour un accès complet.

Jetons un coup d'œil à Disk IO:

IO docker vs kvm vs native

Maintenant, regardons les frais généraux du processeur:

docker cpu overhead

Maintenant quelques exemples de mémoire (lisez le papier pour plus de détails, la mémoire peut être très délicate)

docker memory comparison

389
Hamy

Docker n'est pas une virtualisation en tant que telle - c'est plutôt une abstraction venant s'ajouter à la prise en charge par le noyau de différents espaces de noms de processus, espaces de noms de périphériques, etc. un espace de noms n’est pas intrinsèquement plus coûteux ou inefficace qu’un autre, aussi ce qui donne à Docker un impact sur les performances dépend de ce qui est réellement in ces espaces de noms.


Les choix de Docker en termes de configuration des espaces de noms pour ses conteneurs ont des coûts, mais ces coûts sont tous directement associés à des avantages - vous pouvez les abandonner, mais ce faisant, vous renoncez également aux avantages associés:

  • Les systèmes de fichiers en couches coûtent cher - les coûts varient vraiment d’un pays à l’autre (Docker prend en charge plusieurs systèmes), et selon vos habitudes n'êtes pas libre. D'autre part, une grande partie des fonctionnalités de Docker - être capable de créer des invités à partir de clients de manière copie sur écriture et d'obtenir les avantages de stockage implicites dans les mêmes fonctions - permettent de payer ce coût.
  • DNAT coûte cher à l'échelle - mais vous offre l'avantage de pouvoir configurer la mise en réseau de votre invité indépendamment de celle de votre hôte et de disposer d'une interface pratique pour transférer uniquement les ports souhaités entre eux. Vous pouvez remplacer ceci par un pont vers une interface physique, mais là encore, vous perdez l'avantage.
  • Pouvoir exécuter chaque pile de logiciels avec ses dépendances installées de la manière la plus pratique - indépendamment de la distribution de l’hôte, de la libc et des autres versions de la bibliothèque - est un avantage considérable, mais il est nécessaire de charger plusieurs bibliothèques partagées diffère) a le coût que vous attendez.

Et ainsi de suite. L’impact de ces coûts sur votre environnement (avec les schémas d’accès au réseau, les contraintes de mémoire, etc.) est un élément pour lequel il est difficile de fournir une réponse générique.

86
Charles Duffy

Voici quelques autres benchmarks pour Docker based memcached server par rapport à Host native memcached server en utilisant l’outil de benchmark Twemperf https://github.com/Twitter/twemperf avec 5000 connexions et 20k taux de connexion

La surcharge de temps de connexion pour les membres basés sur un menu fixe semble être en accord avec le livre blanc ci-dessus à une vitesse environ deux fois supérieure.

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

Voici bencmarks utilisant l'outil memtier benchmark

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
18
p4guru