Chciałbym kompleksowo zrozumieć koszt wydajności w czasie wykonywania kontenera Docker. Znalazłem odniesienia do anegdotycznego bycia w sieci o ~ 100µs wolniej .
Znalazłem również odniesienia do kosztów w czasie wykonywania, które są „znikome” i „bliskie zeru”, ale chciałbym wiedzieć dokładniej, jakie są te koszty. Idealnie chciałbym wiedzieć, co abstrakuje Docker kosztem wydajności i rzeczy, które są abstrakcyjne bez kosztu wydajności. Sieć, procesor, pamięć itp.
Ponadto, jeśli istnieją koszty abstrakcji, czy istnieją sposoby na obejście kosztów abstrakcji. Na przykład być może uda mi się zamontować dysk bezpośrednio vs. wirtualnie w Docker.
performance
docker
Luke Hoersten
źródło
źródło
Odpowiedzi:
Doskonały artykuł badawczy IBM z 2014 r. „ Zaktualizowane porównanie wydajności maszyn wirtualnych i kontenerów Linux ” autorstwa Feltera i in. zapewnia porównanie między czystym metalem, KVM i pojemnikami Docker. Ogólny wynik jest następujący: Docker jest prawie identyczny z wydajnością natywną i szybszy niż KVM w każdej kategorii.
Wyjątkiem jest NAT Dockera - jeśli używasz mapowania portów (np.
docker run -p 8080:8080
), Możesz spodziewać się niewielkiego trafienia z opóźnieniem, jak pokazano poniżej. Możesz jednak teraz użyć stosu sieci hosta (np.docker run --net=host
) Podczas uruchamiania kontenera Docker, który będzie działał identycznie jak kolumna Native (jak pokazano w wynikach opóźnienia Redis poniżej).Przeprowadzili także testy opóźnień dla kilku konkretnych usług, takich jak Redis. Widać, że powyżej 20 wątków klienta najwyższe opóźnienie przypada na NAT Docker, następnie KVM, a następnie szorstki związek między hostem / natywnym Docker.
Tylko dlatego, że jest to bardzo przydatny papier, oto kilka innych liczb. Pobierz go, aby uzyskać pełny dostęp.
Spojrzenie na dyskowe operacje we / wy:
Teraz patrząc na obciążenie procesora:
Teraz kilka przykładów pamięci (przeczytaj artykuł, szczegóły mogą być bardzo trudne):
źródło
--net=host
(dwa myślniki) i-p 8080:8080
(małe litery „p”) dla NAT.Docker nie jest wirtualizacją jako taką - zamiast tego jest abstrakcją nad obsługą jądra dla różnych przestrzeni nazw procesów, przestrzeni nazw urządzeń itp .; jedna przestrzeń nazw nie jest z natury droższa ani nieefektywna od innej, więc to, co faktycznie powoduje, że Docker ma wpływ na wydajność, zależy od tego, co faktycznie znajduje się w tych przestrzeniach nazw.
Wybory Dockera pod względem konfiguracji przestrzeni nazw dla jego kontenerów wiążą się z kosztami, ale wszystkie te koszty są bezpośrednio związane z korzyściami - możesz je zrezygnować, ale robiąc to, rezygnujesz również z powiązanych korzyści:
I tak dalej. Jak bardzo te koszty wpływają na Ciebie w twoim środowisku - z twoimi wzorcami dostępu do sieci, ograniczeniami pamięci itp. - jest elementem, na który trudno jest udzielić ogólnej odpowiedzi.
źródło
Oto kilka testów porównawczych w
Docker based memcached server
porównaniu zhost native memcached server
użyciem narzędzia do testów porównawczych Twemperf https://github.com/twitter/ przedstawperf z 5000 połączeń i szybkością połączenia 20kNarzut czasu połączenia dla memcached na podstawie dokera wydaje się zgadzać z powyższym oficjalnym dokumentem z prędkością około dwa razy natywną.
Twemperf Docker Memcached
Twemperf Centmin Mod Memcached
Oto bencmark za pomocą narzędzia do testów memtier
memtier_benchmark docker Memcached
memtier_benchmark Centmin Mod Memcached
źródło
avg 200.5 min 0.6 max 263.2 stddev 73.85