Poprawa wydajności Drupala o 80% dzięki Apache Solr
Drupal nie słynie z małej ilości zapytań do bazy danych, a kiedy trzeba obsłużyć tysiące użytkowników w każdej sekundzie, baza danych bywa naprawdę mocno obciążona. Tak było w przypadku Kwestiasmaku.com - bardzo popularnej strony internetowej odwiedzanej przez miliony użytkowników szukających przepisów i inspiracji kulinarnych.
Kiedy rozpoczęliśmy współpracę z Kwestia Smaku, z początku zajmowaliśmy się rozwojem nowych funkcji w serwisie. Jednak rosnąca popularność serwisu zmusiła nas w końcu do przyjrzenia się witrynie pod kątem wydajności.
Nasi programiści Drupala dokonali niezliczonej ilości różnego rodzaju optymalizacji wydajności. Poniżej jeden z przykładów.
Analiza przyczyn
Aby poprawić wydajność serwisu, chcieliśmy w pierwszej kolejności zrozumieć co powoduje największe obciążenia. Możliwości z reguły są dwie:
- Kod strony zawiera ewidentne błędy (np.niewydajne zapytania lub niepotrzebne wielokrotne zapytania w pętlach)
- Strona nie zawiera ewidentnych błędów. Standardy tworzenia aplikacji na Drupalu i dobre praktyki są zachowane, natomiast przy dużym obciążeniu nie jest to już wystarczające.
Jako że strona nie była wykonana przez nas od podstaw, chcieliśmy się najpierw upewnić, że moduły stworzone przez poprzedni zespół nie zawierają błędów wymienionych powyżej w punkcie pierwszym. Do tego zadania służyły nam takie narzędzia jak x-debug profiler oraz dający wiele podobnych, ale też kilka innych informacji blackfire.
Jedynym ważnym odkryciem był zainstalowany, a do nie używany do niczego moduł browsercap, który dla każdego użytkownika wykonywał dość solidne zapytanie do bazy danych. Poza tym znaleźliśmy kilka sub-optymalnych elementów do poprawy, ale nic takiego, żeby wystarczająco ulżyło naszym serwerom. Musieliśmy więc przejść do etapu drugiego, czyli szukania opcji do optymalizacji.
Jednym z najfajnieszych narzędzi pozwalających zrozumieć, co dzieje się na serwerze, jest obecnie New Relic. Analiza danych płynących z New Relic potwierdziła nam to, co przypuszczaliśmy od początku. Najcięższymi, największymi i najczęstszymi zapytaniami wykonywanymi na stronie były zapytania wykonywane przez widoki wyśietlające przepisy na stronie głównej i w kategoriach. Drupal jest wspaniałym narzędziem, a moduł Views niesamowicie ułatwia tworzenie skomplikowanych widoków. Jest to jednak miecz obosieczny. Bardzo łatwo stworzyć skomplikowane zapytania z wieloma JOIN-ami lub z zapytaniami zagnieżdżonymi, które potem będą mocno obciążać serwer bazy danych.
Search api i Solr
Poza czasowym cachowaniem lub wykorzystywaniem do jego tworzenia osobnej repliki bazy danych (slave), nie ma za bardzo możliwości poprawy wydajności widoku. Zaproponowaliśmy więc przeniesienie go na indeks Apache Solr. Solr wykorzystywaliśmy już do wyszukiwarki na stronie, więc jedyne, co musieliśmy zrobić to stworzyć nowy indeks i oprzeć na nim widok kategorii.
Dzięki wykorzystaniu Sorl, nasz widok przestał wykonywać jakiekolwiek zapytania do bazy danych ogromnie odciążając bazę danych, co widać na załączonych ekranach z New Relic. Zmianę wprowadziliśmy w nocy z 7 na 8 listopada.
Następnie 8 listopada wyeliminowaliśmy jeszcze moduł browsercap i jego niewydajne zapytanie (niebieski obszar na wykresie).
Dzięki prostej zmianie z bazy danych na indeks Solr właściwie wyeliminowaliśmy najbardziej obciążające zapytania MySQL. Najdłużej wykonujące się zapytania trwają teraz też 5 razy krócej niż przed zmianą (ostre piki na wykresie to backupy nocne).
Dzięki optymalizacji serwisu, kwestiasmaku.com może rozwijać się dalej bez konieczności zmiany serwerów czy rozbudowy infrastruktury serwerowej.
Jeśli zależy Ci na zwiększeniu wydajności strony internetowej - daj nam znać. Jednym z istotnych obszarów usług naszego Drupal developmentu jest poprawa performance'u.