fb pixel

Docker na Maca ssie? Przyspieszamy synchronizację plików Mutagenem

|

Docker bez dwóch zdań jest świetnym narzędziem i zrewolucjonizował developerkę (i nie tylko) w wielu dziedzinach. Niestety, to co na Linuksie działa jak marzenie, na pozostałych systemach ma mniejsze lub większe problemy. Twórcy Dockera zdają sobie z tego sprawę i nawet w roadmapie na 2020 r. pojawiły się dwie największe bolączki:

[Docker Desktop] Improve Mac File system performance
[Docker Desktop] Investigate Mac CPU performance

Jeżeli chodzi o ten drugi problem, czyli bardzo częste maksymalne obciążenie procesora, to też niestety miałem okazję na niego bardzo często trafić. Można nawet było ubić wszystkie kontenery, a Docker for Mac radośnie orał 100% CPU bez litości. Tutaj często pomagał klasyczny lek w IT, czyli „Have you tried to turn it off and on again”.

Dzisiaj chciałbym zająć się pierwszym problemem, czyli beznadziejną wydajność jeżeli chodzi o synchronizację plików między naszym laptopem hostem, a kontenerami w Dockerze. Jest naprawdę makabrycznie wolno.

W czym problem?

Nie chcę wchodzić w technikalia problemu, bo po prostu od strony dewelopera „to ma działać”, niemniej warto nakreślić same podstawy. Docker na Maca oczywiście musi korzystać z maszyny wirtualnej, żeby dostarczyć odpowiednie Dockerowi środowisko. (Tutaj polecam artykuł „Under the Hood: Demystifying Docker For Mac CE Edition” – który rozbiera architekturę Docker for Mac na czynniki pierwsze).

Do współdzielenia plików między taką maszyną i docelowo naszymi kontenerami, a systemem na MacOS korzysta z osxfs – współdzielonym systemem plików stworzonym specjalnie dla Dockera. Bardzo dobry opis tego rozwiązania znajdziecie w dokumentacji i tam też jest cały podrozdział tłumaczący dlaczego to rozwiązanie powoduje takie problemy wydajnościowe i jakie są pomysły aby ten stan rzeczy zmienić.

Czy i kiedy to się uda – nie wiadomo. Robota nie poczeka, na razie musimy sobie dać radę sami w inny sposób.

Możliwe rozwiązania

Jest kilka rozwiązań tego problemu, niestety część z nich jest moim zdaniem nadal nieakceptowalna i daleka od jakkolwiek komfortowej pracy. Po kolei przejdziemy przez:

– podstawowa „natywna” konfiguracja Docker for Mac
– woluminy montowane z opcją :cached i :delegated
– docker-sync
– mutagen.io

Dodam tylko, że istnieje jeszcze opcja współdzielenia plików przez NFS, którą z góry pomijam – niestety wydajność tego rozwiązania jest równie kiepska jak podstawowy wariant.

I jeszcze jedna uwaga: polecam sprawdzić wydania deweloperskie Dockera dla Maca czyli tzw. Edge. Zanotowałem zauważalną poprawę wydajności najnowszych wydań, niestety to jest nadal daleko od przyzwoitości. Niestety trzeba liczyć się z niestabilnością takich wydań co miałem okazję doświadczyć – w jednym z ostatnich wydań padło ipv6 co oczywiście skutkowało brakiem działania wielu kontenerów.

Nagły zwrot akcji

Pierwotnie w tym miejscu chciałem omówić po kolei wszystkie sposoby na przyspieszenie synchronizacji plików wraz z wykonaniem prostych testów, a w szczególności pokazanie różnic pomiędzy standardową instalacją, docker-sync i Mutagenem. Taki był plan jeszcze miesiąc temu, ale w międzyczasie wydarzył się „game changer” – owa deweloperska wersja Docker on Mac Edge została wydana z testową integracją z Mutagenem! I co więcej: ta integracja jest wyraźnie szybsza niż stawianie sobie Mutagena osobno i samodzielne zgranie go z naszymi kontenerami!

Docker on Mac Edge z Mutagenem

Na filmie test tej integracji na przykładzie frameworka Symfony w PHP. Beta wersja dockera z włączoną synchronizacją przez Mutagena urywa conajmniej połowę z czasów!

Podsumowanie

Jak widać integracja z mutagenem jest niezwykle obiecująca. Oczywiście na razie niestety nie jest zbytnio stabilna – w czasie testów udało mi się trafić na problemy z synchronizacją przynajmniej kilka razy, w tym zupełnie wszystko mi padło w czasie nagrywania tego materiału – cóż, złośliwość rzeczy martwych 😉

Poza stabilnością mam nadzieję także na większe możliwości konfiguracji tej synchronizacji. Obecnie możemy ustawić tylko cale katalogi, a przydało by się mieć przynajmniej wykluczenia (co by też mogło nieco pomóc w czasach synchronizacji, gdybyśmy mogli sobie wykluczyć podkatalogi których totalnie nie ma sensu synchronizować, a które mogą zawierać tysiące plików).1

Zobacz też:


  1. Tutaj uwaga, że w najnowszej becie została dodana opcja czytania konfiguracji z pliku mutagen.yml co oznacza, że najprawdopodobniej będzie można już wykluczyć sobie jakieś katalogi z tej synchronizacji. ↩︎

Dodaj na LinkedIn
Mirosław Okoński
Przede wszystkim admin, potem webdeveloper choć kiedyś było odwrotnie. Obecnie Full Stack Engineer, CTO i System Architect. Po godzinach fan dobrych seriali, których nigdy nie ma czasu obejrzeć. Kawożłop. Miłośnik piwa i Metaxy. W czasie pomiędzy kontuzjami biega.