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.
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).
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.
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:
Maintenant, regardons les frais généraux du processeur:
Maintenant quelques exemples de mémoire (lisez le papier pour plus de détails, la mémoire peut être très délicate)
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:
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.
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