Popraw wydajność połączeń SOAP

13

Mam problem z wydajnością Magento 2.1

W moim sklepie mam 90 000 produktów. Dodałem te produkty do mydła. Kiedy to zrobiłem, zajęło to około 7 sekund dla każdego artykułu (produktu?) (Zapytanie> Odpowiedź). Podsumowując, zainicjowanie wszystkich produktów zajęło kilka dni.

Teraz wszystkie produkty są w sklepie. Przez kilka tygodni muszę aktualizować niektóre artykuły (produkty). Kiedy robię to ponownie z mydłem, zajmuje to tyle samo czasu. Kiedy robię aktualizacje, sklep jest bezużyteczny. Przykładowe zapytanie i odpowiedź znajdują się tutaj: https://pastebin.com/aqnMJk98 https://pastebin.com/UAh0h8Zz

Mój serwer ma 12-rdzeniowy procesor, 24 GB pamięci RAM i dysk SSD. Działa z systemem Ubuntu 16.04 z Apache2 PHP7-fpm i MYSQL.

Kiedy oglądam proces aktualizacji, widzę, że 5 rdzeni z MySQL ma 100% PHP działa trochę, a reszta jest bezczynna. Baran jest tylko niewielką ilością użytą, iotopmówi, że mój dysk SSD się nudzi.

Obserwowałem wydajność bazy danych i zobaczyłem, że Magento wystrzelił w procesie dodawania tysiące poleceń do bazy danych. Czy to jest ok?

Kiedy aktualizuję go za pomocą importu Magento CSV, jest to znacznie szybsze.

Co mogę zrobić, aby przyspieszyć działanie Magento2? W tej sytuacji nie można dobrze współpracować z tym sklepem.

tadeus
źródło
Z jakich rozszerzeń korzystasz? Problem może być związany z jednym z twoich rozszerzeń.
Bunyamin Inan
@tadeus Czy rozwiązałeś problemy z prędkością w ciągu ostatnich 2 lat? Jeśli nie, OŚWIADCZENIE: Jestem autorem treści witryny wymienionej w moim profilu, profilu sieci, w którym mamy bezpłatne skrypty narzędziowe w celu poprawy wydajności i innych usług analitycznych.
Wilson Hauck

Odpowiedzi:

1

Import zbiorczy

kluczem jest użycie importu wsadowego, jak sam wspomniałeś:

Kiedy aktualizuję go za pomocą importu Magento CSV, jest to znacznie szybsze.

Zastanów się nad przemyśleniem interfejsu API SOAP i zmień go na tryb zbiorczy, np. Możesz utworzyć oprogramowanie pośrednie, które zaakceptuje dane produktu i wygenerować plik csv, który później można przesłać do Magento.

Istnieje kilka rozszerzeń stron trzecich, które pomagają w tym.

Ogólne porady dotyczące wydajności

Możesz spróbować przyspieszyć sam Magento, ale dostaniesz ~ 1-10% wzmocnienia z każdej poprawy, gdy wykonasz wiele z nich, korzyść jest zwielokrotniona:

  1. Upewnij się, że nie masz nieefektywnego kodu
    1. Sprawdź, czy Twój kod nie odradza powiadomień / błędów / ostrzeżeń
    2. Sprawdź, czy nie masz drogich detektorów zdarzeń w zainstalowanych rozszerzeniach (od strony trzeciej lub od siebie).
  2. Po zakończeniu usuwania powiadomień i ostrzeżeń - rozważ wyłączenie rejestrowania.
  3. Sprawdź, których Magento, a także rozszerzeń innych firm nie używasz i czy mogę wyłączyć, zobacz Który moduł mogę wyłączyć w Magento 2? na przykład.
  4. Jeśli serwer bazy danych znajduje się na tym samym komputerze co aplikacja Magento - upewnij się, że używasz gniazda linux zamiast połączenia TCP / IP.
  5. Jeśli Twój serwer bazy danych nie znajduje się na tym samym komputerze co aplikacja Magento - upewnij się, że PHP nie musi wykonywać rozpoznawania DNS za każdym razem, gdy wysyła zapytanie do bazy danych.
  6. Sprawdź porady dotyczące dostrajania wydajności bazy danych, artykuł o Perconie został już wymieniony w jednej z odpowiedzi, sprawdź również https://github.com/major/MySQLTuner-perl
  7. Sprawdź tryby indeksowania magento, przełącz się na indeks zgodnie z harmonogramem i przeprowadź reindeks co noc lub po zakończeniu importu, a nie po zapisaniu produktu. https://devdocs.magento.com/guides/v2.2/extension-dev-guide/indexing.html#m2devgde-indexing-modes

Jeśli wszystkie powyższe czynności zostały wykonane i potrzebujesz większej wydajności:

  • profiluj swoją aplikację za pomocą xDebug lub blackfire, zobacz, gdzie są szyjki butelek, spróbuj je wyeliminować.
  • zapytaj, ale dokładniej, wyjaśnij, co dokładnie próbujesz w tej chwili poprawić.
  • rozważ poproszenie partnera Magento lub certyfikowanego programisty Magento o pomoc.
Anton Boritskiy
źródło
0

Problem polega na tym, że połączenia SOAP są bardzo drogie. Jeśli uruchomisz żądanie SOAP, aby dodać / edytować / usunąć produkt, Magento musi dołączyć do wielu tabel, aby uzyskać wszystkie niezbędne informacje. Takie zachowanie w połączeniu z samym PHP spowalnia liczbę produktów lub danych, które chcesz przetworzyć.

Sam Magento zaleca 5-węzłowy klaster serwerów (1 x DB, 4 x Webserver) do obsługi ruchu.

Poleciłbym skalowanie w poziomie, na przykład za pomocą AWS. Może to mieć większy wpływ na Twoją firmę, ale IMHO nie będzie w stanie ulepszyć Magento, aby uzyskać lepszą wydajność.

W ramach AWS należy użyć funkcji grupy automatycznego skalowania, która odpowiada za liczbę uruchomionych serwerów. Za każdym razem, gdy dodajesz dane, uruchamiane są nowe serwery, aby poradzić sobie z presją. To samo można zrobić z AWS RDS (DB Service) bardzo łatwo i szybko.

W przypadku, gdy AWS nie jest opcją, możesz spróbować ulepszyć Magento i PHP. Polecam sprawdzić ustawienia:

David Lambauer
źródło
0

Ten link wyjaśnia, jak dostosować zużycie pamięci MySQL. Ponieważ masz tyle pamięci RAM, możesz zyskać na przydzieleniu większej ilości do MySQL. To może być łatwiejsze i mniej kosztowne ($) rozwiązanie niż budowa dedykowanego serwera bazy danych.

https://www.percona.com/blog/2016/05/03/best-practices-for-configuring-optimal-mysql-memory-usage/

Może się również okazać, że narzędzie MySQL Workbench jest pomocne w tym ulepszaniu, a także w monitorowaniu tego, co ogólnie robi MySQL. Narzędzie jest wykonane przez Oracle / MySQL; nie jest to żadna przypadkowa aplikacja shareware.

https://dev.mysql.com/downloads/workbench/

kretyn
źródło