Sesja Magento varien rozpoczyna się bardzo wolno na stronach kategorii z pamięcią sesji MEMCACHE

13

Używam memcachedo przechowywania sesji i na stronach kategorii zauważyłem w nowych transakcjach reliktów, w których rozpoczęcie sesji różnych może potrwać ponad 30 sekund.

Może to mieć coś wspólnego z blokowaniem sesji, ale pomyślałem, że to nie był problem podczas korzystania z memcache.

Ktoś kiedykolwiek zmierzył się z tym lub miał pomysły, co może być przyczyną.

Nishrit
źródło

Odpowiedzi:

5

Widziałem to również dość często w New Relic.

Z tego, co widziałem, jest kilka różnych przyczyn, nie do końca rozumiem ten problem, ale ostatnio zastanawiałem się nad tym. Oto moje ustalenia.

Sesje w Magento, Locking i New Relic

Każda akcja kontrolera w Magento korzysta z sesji, niezależnie od tego, czy jest to konieczne, czy nie. Sesja jest chętnie tworzona w Mage_Core_Controller_Varien_Action :: preDispatch

Jeśli masz włączoną blokadę sesji, oznacza to, że na czas trwania żądania twoja sesja jest blokowana, dopóki żądanie się nie zakończy. Nie znalazłem jeszcze kodu, który zwalnia blokadę sesji, ale jestem pewien, że gdzieś tam jest.

Ostatecznie oznacza to, że jeśli wystrzelisz wiele współbieżnych żądań do akcji kontrolera Magento z jednej lokalizacji przy użyciu tej samej sesji, będziesz musiał poczekać, aż niektóre z tych żądań zakończą się i odblokuje sesję, aby kontynuować. Zwykle postrzegam to jako powolną transakcję na nowej relikwie, która utknęła na Mage_Core_Model_Session_Abstract_Varien::start~ 30 sekund (myślę, że upłynął limit czasu oczekiwania na blokadę sesji).

Ten raport na temat New Relic ma wiele wad

  • Spowalnia całkowity średni czas odpowiedzi, ponieważ żądania te są wolniejsze niż powinny.
  • New Relic rejestruje próbkę najwolniejszych transakcji, jeśli mam wąskie gardła wydajności, które zajmują na przykład 20 sekund. New Relic nie zgłosi ich automatycznie, jeśli ten sam adres URL jest nękany przez limity czasu blokowania sesji. Przekroczenia czasu ukrywają przydatne dane.

Przyczyny

Widziałem kilka typowych przyczyn tego, w żadnym wypadku nie ostateczną listę

Boty

Roboty, takie jak Baidu i Yandex, są nieco niegrzeczne i dręczą witrynę. Są one uruchamiane z jednej lokalizacji, odpalając liczne żądania, wykorzystując tę ​​samą sesję i uruchamiając mechanizm blokowania sesji, co pokazuje powolne transakcje w New Relic.

Wywołania Ajax do akcji kontrolera Magento

W przypadku lakierowanych stron internetowych dane specyficzne dla klienta muszą być ładowane ostrożnie, niektóre strony zarządzają tym za pomocą wywołań ajax do zaplecza Magento, aby uzyskać wymagane dane. Widziałem także niektóre strony internetowe używające wywołań ajax do zaplecza, aby uzyskać informacje o konkretnych produktach, takie jak ilość pozostała w magazynie, gdy produkt jest w sprzedaży.

Jeśli pojedyncza strona wyzwala wiele wywołań ajax do backendu podczas ładowania strony, może potencjalnie uruchomić mechanizm blokowania sesji. Im więcej wywołań ajax z powrotem do zaplecza Magento, tym większe prawdopodobieństwo zablokowania.

Lakier ESI

Tak samo jak powyżej, z tym wyjątkiem, że zamiast używać wywołań ajax używa Edge Side Inclusive, które wydają się być nowymi wywołaniami backendu.

Mój plan

Jeszcze tego nie podjąłem, więc jest to czysto teoretyczne, ale zamierzam to zrobić w ciągu najbliższych kilku miesięcy.

Podniosłem ten problem podczas konferencji Mage Titans UK 2016, a Fabrizio Branca wskazał mi następujący moduł: https://github.com/AOEpeople/Aoe_BlackHoleSession .

W oparciu o wyrażenie regularne moduł zapobiegnie tworzeniu prawdziwych sesji przez Boty, powinno to mieć tę zaletę, że żadna blokada sesji nie zostanie uderzona, a zasoby sesji nie będą niszczone przez niegrzeczne boty. Boty nie powinny już zanieczyszczać odczytów New Relic.

W przypadku wywołań ajax / ESI w celu uzyskania danych klientów na buforowanych stronach nie mogę nic zrobić, co widzę. Potrzebujesz dostępu do sesji, aby pobrać dane specyficzne dla klienta.

Jednak w przypadku wywołań ajax / ESI w celu uzyskania danych specyficznych dla katalogu (takich jak ograniczone zasoby) nie widzę potrzeby, aby sesja istniała w ogóle dla tego żądania. Moim planem na przyszłość jest wypróbowanie rozszerzenia Aoe_BlackHoleSessionmodułu, aby móc silosować żądania do określonego adresu URL jako bez sesji.

Nie jestem zaznajomiony z wewnętrznymi elementami ESI, więc niestety nie mam zbyt wiele do komentowania.

Alternatywa

Podczas konferencji Fabrizio Branca powiedział, że jest w stanie całkowicie wyłączyć blokowanie sesji bez żadnych skutków ubocznych, testuj na własne ryzyko.

Luke Rodgers
źródło