Problem z wydajnością w witrynach / sklepach od 1 do 10 tys

9

Próbuję znaleźć sposób na poprawę wydajności Magento, gdy liczba stron / sklepów przekracza 1k, a moim celem jest około 10k. Oto kilka pytań; wszelkie wskazówki / pomoc są bardzo mile widziane!

  1. Dodawanie nowych stron / sklepów jest powolne;
    Komentuję $ this-> cleanModelCache () w _afterSave () w Mage_Core_Model_Abstract i sytuacja wydaje się lepsza, ale staje się coraz wolniejsza wraz ze wzrostem liczby stron / sklepów. I nie wiem, co wpłynęłoby na cały system w przyszłości.

  2. Połączenia API stają się wolne.
    Jednym z głównych procesów jest składanie zamówień; mój dostosowany model zajmuje się tym przez przetwarzanie niektórych danych, a przede wszystkim za pomocą modeli sprzedaż / oferta i modele sprzedaż / obsługa_wysyłka. Proces rozpoczyna się od Oauth. Zarówno Oauth, jak i składanie zamówień trwa dłużej, gdy rośnie liczba witryn / sklepów, a zużycie pamięci wydaje się większe. Czy to ma coś wspólnego z tym, że Mage ładuje plik XML konfiguracji, a fakt, że dane konfiguracyjne stają się większe wraz ze wzrostem liczby stron internetowych?

  3. Otwieranie n98-magerun dev: konsola trwa dłużej; nie znam przyczyny.

  4. Zapisywanie konfiguracji z panelu administracyjnego trwa dłużej; nie wiem jak to poprawić.

Czy można zrekonstruować sposób, w jaki Magento generuje i ładuje dane konfiguracyjne, aby zmniejszyć zużycie pamięci? Czy to jeden z czynników powodujących problemy z wydajnością w mojej sytuacji?

Obecna instancja Magento: Wersja = Magento EE 1.14.2.4;
Skonfiguruj pamięć podręczną; inne buforowanie wyłączone;
Korzystanie z Mysql 5.6 i MongoDB (dla katalog_kategorii_cena, katalog_produktu_produkcja, strona_rdzenia);
liczba stron internetowych = liczba sklepów = liczba wyświetleń = 1024;
liczba produktów = 4501;

Z góry dziękuję wszystkim!

Jack.W
źródło
2
dlaczego wsparcie magento nie może ci pomóc ???
MagenX
Jak uzyskać od nich pomoc? Jestem nowy w społeczności .. dzięki!
Jack.W
1
masz wersję Enterprise, nie wiem, skąd ją masz, ale jeśli nie ma za nią wsparcia Magento, po prostu marnuj pieniądze i czas. musisz dobrze uderzyć ich w kule, aby biegły jak króliki, które ci pomagają. jaki jest sens posiadania wersji Enterprise ???
MagenX
1
ale oczywistą odpowiedzią na twoje zapytanie jest - oddzielne sklepy Magento z osobnymi bazami danych, takie jak partie na 10-20 sklepów ...
MagenX
Ach racja .. Poproszę szefa o konto .. haha.
Jack.W

Odpowiedzi:

3

Jednym z powodów, dla których zwalnia, jest to, że konfiguracja dla każdego sklepu jest zduplikowana z / config / sites i / config / global, a kod do tego nie jest co najmniej wydajny. Każda zmiana ustawienia może spowodować kilka 10 minut, jeśli nie godzin, zmniejszonej wydajności i przepustowości. Zwiększenie wydajności będzie zasadniczo oznaczało, że Ben Marks przyjdzie za tobą ... i nie w dobry sposób.

JEŻELI zamierzasz zejść tą drogą, najłatwiej byłoby mieć 10k instalacji Magento i mieć jakiegoś pośrednika, który deleguje zapytania na odpowiednią stronę internetową. Oczywiście będzie to zależeć od rzeczywistego przypadku użycia.

[dodany]

W zależności od przypadku użycia możesz używać kategorii jako pseudo sklepów. Technicznie możesz następnie użyć układu XML, aby zmienić temat na sklep. Ale wtedy wpadniesz na ograniczenie kasy. Wszystkie sklepy będą musiały udostępnić kasę.

Tak czy inaczej, 10k sklepów Magento jest wykonalnych, ponieważ nie jest to niemożliwe. Ale będzie to trudna droga, niezależnie od wybranej ścieżki.

Kevin Schroeder
źródło
Cześć Kevin, dziękuję za odpowiedź! Tak, widzę kod aktualizujący drzewo konfiguracji, którym jest loadToXml (), jeśli się nie mylę. Mam na myśli; i powiedziałeś, że modyfikowanie go nie jest dobrym pomysłem? Co masz na myśli mówiąc, że Ben Marks idzie za mną? Wygląda też na to, że każde żądanie HTTP, które przychodzi do Magento, ostatecznie załaduje drzewo konfiguracji, czy to prawda? W jakikolwiek sposób mogę zmniejszyć jego rozmiar? Powinienem chyba pomyśleć o uzyskaniu 10 000 instancji Magento ... jakieś przemyślenia na temat tego, ile zasobów będzie potrzebować? Dziękuję bardzo Kevin!
Jack.W
Ale posiadanie 10 tys. Instalacji Magento oznacza 10 tys. Instancji mysql, prawda? Nie mam pojęcia, jak to zrobić, czy jest to dobry pomysł ..
Jack.W
1
Nie, oznaczałoby to posiadanie 10 tys. Baz danych mysql, ale wszystkie 10 tys. Z nich może znajdować się w jednej instancji mysql.
Christian
1
„Ben Marks”, który pojawia się po tobie, jest odniesieniem do tego camo.githubusercontent.com/…
Kevin Schroeder
1
10 tys. Instalacji Magento oznacza 10 tys. Baz danych MySQL, które jednak zostałyby rozłożone. Byłoby O wiele łatwiej skryptu wdrożyć 10 000 indywidualnych instalacji Magento, niż gdyby istniejący kod podstawowy działał z 10 000 sklepów.
Kevin Schroeder
1

Możesz spróbować zhakować rdzeń i włączyć podział pamięci podręcznej witryny. Możesz spróbować zhakować bazę danych i zapisać informacje o konfiguracji w pamięci. Możesz spróbować zamienić pamięć podręczną konfiguracji na coś mądrzejszego - powiedzmy buforowanie informacji z plików xml [które są statyczne i dotyczą wszystkich stron internetowych i sklepów] podczas dynamicznego pobierania danych zastępujących.

Jestem facetem od serwera, więc poszedłbym do zepsucia bazy danych. Zwłaszcza, że ​​jest to trywialne.

Jeśli masz kontrolę nad serwerem bazy danych: Zmień nazwę tabeli core_config_data na core_config_data_offline Utwórz nową tabelę core_config_data za pomocą silnika pamięci MEMORY http://dev.mysql.com/doc/refman/5.7/en/memory-storage-engine.html Skopiuj wszystkie dane z core_config_data_offline do core_config_data

Skonfiguruj zadanie cron, aby sprawdzić, czy istnieje core_config_data, czy kopiuje stamtąd wszystkie dane do core_config_data_offline. Jeśli nie, utwórz go i skopiuj wszystko z core_config_data_offline do core_config_data

Wyłącz pamięć podręczną konfiguracji. Gdy pamięć podręczna konfiguracji jest włączona, zwiększa się wydajność tylko przy pierwszym czytaniu danych konfiguracji z bazy danych - po tym są one w pamięci podręcznej i cierpisz. Z drugiej strony pliki xml nie są już buforowane, więc wymieniono uderzenie wydajności odserializowania ogromnych danych konfiguracyjnych na uderzenie wydajności podczas analizowania kilku plików xml.

Możesz także poeksperymentować ze zmianą pliku Mage / Core / Model / Config.php i włączyć indywidualne pamięci podręczne witryn. Domyślnie dane konfiguracji każdego sklepu są buforowane indywidualnie. Wszystkie dane konfiguracyjne serwisu są buforowane w jednym obiekcie.

Zauważ, że dotyczy to tylko konfiguracji zastępującej [ustawienia administratora]. Więc jeśli wykonasz wszystkie zmiany konfiguracji na poziomie sklepu, który już ustawiłeś. Jeśli używasz „dziedziczenia z witryny” i dokonujesz większości zmian konfiguracji specyficznych dla sklepu na poziomie witryny - pamięć podręczna zawiera każdą witrynę. Dzieląc go możesz znacznie lepiej go wyłamać. chroniony $ _cacheSections = array ('admin' => 0, 'adminhtml' => 0, 'crontab' => 0, 'install' => 0, 'przechowuje' => 1, 'strony internetowe => 0);

do

protected $_cacheSections = array(
    'admin'     => 0,
    'adminhtml' => 0,
    'crontab'   => 0,
    'install'   => 0,
    'stores'    => 1,
    'websites'  => 1
); 
Gary Mort
źródło
Cześć Gary, dziękuję za tak pomocną odpowiedź! Mam kilka pytań: 1) Z moich obserwacji wynika, że ​​zapytanie do bazy danych nie stanowi problemu, nawet w przypadku ponad 1 000 witryn / sklepów; więc jeśli tak, czy korzystanie z pamięci nadal byłoby pomocne? 2) Nie wiem, czy jest poprawny, ale pamięć podręczna konfiguracji wydaje się przechowywać tylko informacje o systemie i modułach; więc czy ma to coś wspólnego z konfiguracją strony / sklepu? 3) Czy istnieje sposób, aby magento rozpoznał konkretny identyfikator sklepu / witryny na podstawie żądania http, a tym samym załadował tylko odpowiedni plik konfiguracyjny? Dziękuję bardzo Gary!
Jack.W
2
Te zalecenia nie rozwiązują problemu zauważonego przez PO. Wyłączenie pamięci podręcznej konfiguracji ostatecznie zabije system. Spowoduje to, że Magento załaduje wszystkie pliki konfiguracyjne, scali je, a następnie scali wszystkie / global, a następnie scali wszystkie / witryny, a następnie scali je wszystkie w każdym węźle / stores. Stanie się tak w przypadku KAŻDEGO żądania. Z 10k stronami możesz patrzeć na minuty zegara ściennego na żądanie .
Kevin Schroeder
Cześć Kevin, dzięki za odpowiedź; Właściwie planuję przenieść tabelę core_config_data do pamięci, włączyć pamięć podręczną konfiguracji systemu i modułu, zatrzymać scalanie danych core_config_data w drzewie konfiguracji i wprowadzić funkcje, które odczytują tę część danych bezpośrednio z bazy danych. Co myślisz?
Jack.W
1
Problemem nie są dane core_config_data. Problem polega na tym, że konfiguracje sklepu są scalane z / witryn, które są scalane z / global w XML. Baza danych będzie w porządku. To PHP będzie nienawidzić życia z powodu połączenia konfiguracji. W kroku debugowania przez Mage_Core_Model_Resource_Config :: loadToXml zwracając szczególną uwagę na linie 110 i następne
Kevin Schroeder
1
Teraz wracam do mojego stołu pamięci. Buforowanie danych oznacza przechowywanie ich w miejscu, do którego można uzyskać szybki dostęp. Magento buforuje dane konfiguracyjne do serializowanego obiektu php - jeśli dane konfiguracyjne są ogromne, oznacza to, że PHP musi deserializować ogromną ilość danych dla każdego żądania. Jeśli wiesz, jak korzystać z xdebug, profiluj swoje wolniejsze ładowanie strony i sprawdź, ile czasu zajmuje uruchomienie funkcji unserialize: php.net/manual/en/function.unserialize.php - jeśli jest ogromny [ponad 100ms] „buforowanie” konfiguracji powoduje uszkodzenie systemu.
Gary Mort