Jakie części warstwy modelu można ominąć w celu optymalizacji wydajności

28

Obecnie widzę, że dla tabeli bazy danych z bardzo prostym schematem (około 5 pól) wstawia ona nowe rekordy z szybkością nieco poniżej ~ 50 wstawek / sekundę, w moim lokalnym środowisku programistycznym (dysk SSD) - to z brak obserwatorów w modelu wypełniającym powiązane tabele.

Używając bezpośredniego SQL widzę spore ulepszenie - ~ 1800 wstawek / sekundę. Myślimy o próbie optymalizacji wydajności naszych modeli, ale oczywiście nie chcemy stracić całej ładnej stabilności i elastyczności, jaką zapewnia nam rdzeń Magento.

Zastanawiam się, czy ktoś już wybrał tę drogę i czy są jakieś łatwe wygrane pod względem składników warstwy modelu, które można stosunkowo bezpiecznie ominąć, co da znaczny wzrost wydajności.

Rzeczy jak:

  • Rozpoznawanie nazw klas
  • przed i po zapisaniu zdarzeń
  • Wysyłki zdarzeń
  • Transakcje
  • itp.

AKTUALIZACJA: Kłamałem, w rzeczywistości było kilka dodatkowych zapytań odpalanych przez obserwatorów lub afterSave (), które widziałem podczas przeglądania dziennika zapytań bazy danych. Benchmarking względem całkowicie prostej jednostki daje mi ~ 300 wierszy / sekundę w modelach Magento - tylko narzut MySQL to transakcje.

kalenjordan
źródło
1
Czy próbowałeś ponownie wykorzystać obiekt modelu do zapisania danych? Wyczyść to, ustawDane, a następnie zapisz. Pozwoliłoby to uniknąć wywołań metody getModel i narzutu tworzenia instancji związanych z PHP.
davidalger
Zgaduję też, że wąskim gardłem jest procesor, a nie dysk ... ponieważ wszystkie niezbędne pliki kodu zostaną załadowane przy pierwszym przejściu.
davidalger
Dzięki, David! Spróbuję również tego. Właściwie myślę, że wciąż jesteśmy we / wy związani liczbą wykonywanych zapytań. Mamy około 20 zapytań, które są uruchomione dla danego modelu zapisu - niektóre z nich musimy zachować (zapełnianie powiązanych tabel, SELECT do sprawdzenia istnienia przed zapisaniem), a inne, które prawdopodobnie możemy usunąć (zewnętrzne zapisywanie sesji, dodatkowe ładowanie (), których można uniknąć w logice aplikacji)
kalenjordan 24.01.2013
Możesz łatwo się dowiedzieć. Zamontuj cały katalog główny i bazę danych MySQL na dysku RAM. Ale mocno wątpię, że we / wy jest problemem w sprzęcie klasy serwerowej. Prawdopodobnie zobaczysz więcej korzyści po prostu wyłączając „Indeks przy zapisie”.
Ben Lessani - Sonassi

Odpowiedzi:

17

Jedną rzeczą, która może przyspieszyć całą witrynę, jest usunięcie wszystkich odniesień do Varien_Profilerwitryny produkcyjnej. Nawet jeśli profiler jest wyłączony, zawsze sprawdza, czy jest włączony, więc każde wywołanie Varien_Profiler::spowoduje wyświetlenie dodatkowej ifinstrukcji. Oczywiście usunięcie wszystkich tych połączeń wiąże się z kosztem niemożności korzystania z profilera. Może to jednak przyspieszyć działanie całej witryny o około 5% (jest to subiektywne doświadczenie, ale WIELE połączeń z Varien_Profilercałym Magento). W rzeczywistości napisałem mały skrypt powłoki, aby automatycznie komentować te wywołania we wszystkich plikach i dodam to do mojego postu jutro, kiedy będę w pracy i będę mieć gotowy kod.

Zgodnie z obietnicą teraz kod do komentowania tych połączeń:

grep -l "Varien_Profiler" * -R > profiler.txt 
for x in `cat profiler.txt` 
do 
sed -i '/Varien_Profiler/s/^/\/\//' $x
done

Powinno to zostać uruchomione w konsoli linux zarówno w aplikacji /, jak i w folderze lib /. Może być później konieczne ręczne dostosowanie pliku /lib/Varien/Profiler.php. Pamiętaj też, że powinieneś przetestować to dokładnie w bezpiecznym środowisku przed uruchomieniem go na żywo - ale myślę, że powinno to być oczywiste;)

mpaepper
źródło
Łał! Nigdy nie wyobrażałbym sobie niczego bliskiego 5% tylko dla wywołań Varien_Profiler po wyłączeniu. Sprawdzę to, dzięki!
kalenjordan
@sparcksoft Jak obiecałem, teraz dodałem kod.
mpaepper
1
Właśnie tam warunki warunkowe prekompilatora C są naprawdę fajne. Szkoda, że ​​PHP ich nie ma, ale oczywiście oznaczałoby to, że musiałaby mieć własną metodę wstępnej kompilacji i buforowania. :)
davidalger
2
Możesz także napisać, find . -type f -exec grep -qF 'Varien_Profiler' {} \; -exec sed -i '/Varien_Profiler/d' {} \;jeśli wolisz szybki oneliner.
kojiro
14

Podczas wykonywania wielu zapisów w modelach Magento najlepiej wyłączyć indeksator Magento, który spowalnia proces:

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection();
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL));
$processes->walk('save');

I włączanie, gdy skończysz:

$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');
Rick Kuipers
źródło
Ah gotcha, miło. To tak, jakbyś zapisywał wiele rekordów liczby klientów i chciałbyś uniknąć indeksowania klientów dla każdego zapisu? W moim przypadku robię to przeciwko niestandardowemu podmiotowi, który nie ma żadnego indeksowania - przynajmniej dla testu, który zrobiłem. Mamy też niestandardowe indeksy, na które prawdopodobnie skorzystam z tej wskazówki!
kalenjordan
Nie sądzę, aby istniało indeksowanie klientów, ale z pewnością pomoże ci w modyfikacji wielu produktów i tym podobnych. Tak czy inaczej, warto spróbować!
Rick Kuipers
Przepraszamy, tak, dane produktu EAV i takie na przykład. Dzięki.
kalenjordan
Hej! Może po tym będziesz musiał (częściowo) reindeksować?
Alex
@Alex Tak, indeksatory zostają zresetowane do MODE_REAL_TIME, więc będzie ponownie indeksować zgodnie z harmonogramem. Możesz oczywiście wymusić, jeśli chcesz.
Rick Kuipers