Jak poprawić wydajność Drupala?

54

Drupal rozwija się szybko, ale wydajność jest tak słaba. Trudno jest osiągnąć 50 żądań na sekundę.

Na prostej stronie internetowej jest tyle zapytań SQL. Jeśli przetestujesz czas żądania formularza przesłanego na Drupal.org, jego ukończenie zawsze zajmie kilka sekund.

Jak poprawić szybkość swojej strony internetowej?

Bruce Dou
źródło
3
Czy rzeczywiście przeszukałeś witrynę? Nie mogę sobie wyobrazić, że nie było to wielokrotnie omawiane.
Letharion
1
Kasy moje slajdy goo.gl/30yi39 powinny ci pomóc
mikeytown2

Odpowiedzi:

61

Buforowanie, buforowanie i buforowanie.

Kilka sugestii, które wcześniej zadałem w związku z podobnym pytaniem

  1. Umieszczenie lakieru lub innego odwrotnego proxy przed http-deamon jest prawdopodobnie najlepszą rzeczą, jaką możesz zrobić.
  2. Podczas DrupalCon Copehagen Rasmus stwierdził, że używanie pamięci podręcznej opcp php, takiej jak APC , jest jedną z najlepszych rzeczy, które możesz zrobić, aby ogólnie przyspieszyć PHP. Wydajność poprawia się wraz z nowszymi wersjami PHP. Istnieją również dodatkowe korzyści z aktualizacji PHP podczas aktualizacji Drupala. Od 6 do 8, Drupal przejdzie znaczną zmianę w kierunku orientacji obiektowej, co również miało miejsce w przypadku większości ulepszeń wydajności w nowszych wersjach PHP.
  3. Memcache jest popularnym wyborem dla przyspieszenia cache, poprzez wprowadzenie do pamięci cache zamiast dysku.
  4. Panele + buforowanie w połączeniu z akcjami pamięci podręcznej mogą znacznie zwiększyć wydajność, nawet dla zalogowanych użytkowników, ponieważ obsługuje dość złożoną logikę.
  5. Podmiot Cache jest ładny i zero-conf prędkość impuls dla wszystkich osób korzystających z Drupal 7.
  6. Witryny z dużym zapisem mają mniej „dobrze ugruntowanych” rozwiązań. Niektóre opcje obejmują.
    1. Częste przenoszenie pisze całkowicie, na przykład statystyki, gdzie indziej, takie jak Google Analytics.
    2. Buforowanie częstych operacji zapisu za pomocą niestandardowego rozwiązania w coś takiego jak NodeJS, które będzie zapisywać do DB co X sekundę.
    3. Poświęć święty kwas i użyj bazy danych takiej jak MongoDB . (Zobacz komentarz Berdira poniżej)
    4. Klaster bazy danych SQL. Czyta z jednej bazy danych, pisze do innej. Jest to natywne dla D7 i Pressflow może w tym pomóc w D6.
Letharion
źródło
Wszystko to zostało dodane, ale wszystko to służy do buforowania odczytu, nie jest dobre, ponieważ strony mają dużo zapisu.
Bruce Dou
Nie powiedziałeś nic konkretnego o zapisach. :) Dodam coś o tym w mojej odpowiedzi.
Letharion
1
Wyjaśnienie w MongoDB. Nie możesz przełączyć całej bazy danych na MongoDB. MongoDB jest czymś zupełnie innym niż DBMS, takim jak MySQL, i na przykład nie używa SQL. Możesz wymienić tylko niektóre komponenty wtykowe i używać ich do przechowywania części danych w MongoDB, na przykład pól, dzienników, bloków i tak dalej.
Berdir,
@Letharion >> Klaster bazy danych SQL. Czyta z jednej bazy danych, pisze do innej. Pressflow może w tym pomóc. Jak można to osiągnąć ?
GoodSp33d
1
Świetna odpowiedź! Ostateczny. Aby dodać do tego, spójrz na moduł Advanced CSS / JS Aggregation , ponieważ rozumiem, że agregacja zmniejsza żądania pojedynczych plików CSS i JS, a tym samym pomaga poprawić wydajność.
therobyouknow
23

Są to notatki z moich doświadczeń i mogą różnić się od doświadczeń innych. Używam głównie stosu LAMP i rozważałem to samo w swoich sugestiach.

Kciukowe zasady dotyczące buforowania, które zazwyczaj stosuję.

  1. Przetwarzaj jednorazowo wiele razy.
  2. Korzystaj ze starych danych, jeśli to możliwe
  3. Rzadko usuwaj pamięć podręczną i utrzymuj ją bardzo konkretnie.
  4. Jeśli to możliwe, dokonuj zmian na najniższym poziomie stosu. LAMP - DCCc: Linux, Apache, Mysql, PHP, Drupal Core, Contrib i moduł niestandardowy.

Popraw wydajność strony Drupal (w kolejności rosnącej złożoności)

  1. Aktualizuj rdzeń, aktualizuj moduł i motywy. Tak, to ma znaczenie.

  2. Zainstaluj APC na swoim serwerze. (Przeniesiony na górę na podstawie sugestii Letharion)

  3. Buforowanie stron: admin / config / development / performance Różnica między minimalnym czasem życia bufora a wygasaniem stron buforowanych

  4. Buforowanie bloków https://drupal.org/project/blockcache_alter Opcje buforowania dla wszystkich bloków.
  5. Zbiorcze pliki javascript i css - Ulepszenia interfejsu użytkownika https://www.drupal.org/project/advagg
  6. Wyłącz niepotrzebne moduły. Każdy moduł zwiększa ilość kodu, który musi być dostępny do załadowania strony. Zwiększa także liczbę wyszukiwań. Możliwe jest użycie ogólnego modułu zamiast wielu modułów, które wykonują określone funkcje.
  7. Cache Views Views - Pamięć podręczna z uwzględnieniem zawartości dla wyświetleń https://www.drupal.org/project/views_content_cache
  8. Wyłącz rejestrowanie DB - użyj https://drupal.org/project/syslog_ng
  9. Zmniejsz liczbę błędów 404 - http://www.brokenlinkcheck.com/
  10. Szybkie odpowiedzi 404 - https://drupal.org/project/fast_404 - Spróbuj obsługiwać na poziomie serwera.
  11. Walidacje po stronie klienta - https://www.drupal.org/project/clientside_validation
  12. Kompresuj obraz - https://www.drupal.org/project/imageapi_optimize
  13. Leniwe ładowanie zdjęć - Nie ładuj niepotrzebnych obrazów - https://www.drupal.org/project/lazyloader
  14. Używaj arkuszy sprite - https://www.drupal.org/project/spritesheets

  15. Ustaw wartość minimalnego czasu życia pamięci podręcznej na wyższą liczbę i użyj modułów czyszczących pamięć podręczną, aby wyczyścić pamięci podręczne dla określonych stron - Ilekroć edytuję / aktualizuję węzeł, wszystkie pamięci podręczne stron dla anonimowego użytkownika są tracone

  16. Użyj modułu Devel do oglądania zapytań.
  17. Przepisz widoki wyświetleń / unikaj wyświetleń, jeśli jest to przesada.
  18. XHProf - https://www.drupal.org/project/XHProf
  19. FPM, HHVM.
  20. Profilowanie i dostrajanie bazy danych - https://www.drupal.org/project/dbtuner
  21. Użyj Boost , nie Bootstrap DB, jeśli nie jest to wymagane. https://drupal.org/project/boost W przypadku większości małych i średnich witryn Boost jest wystarczająco dobry i może nie być potrzebne odwrotne proxy.
  22. Użyj CDN - https://www.drupal.org/project/cdn Jest łatwy w konfiguracji.
  23. Jeśli tabele pamięci podręcznej są ogromne, użyj Memcached - Jeśli możesz zainstalować memcached i skonfigurować dla niego pamięć RAM, nie jest to tak skomplikowane, jak się wydaje.
  24. Etagi - poprawnie skonfiguruj Etagi. https://developer.yahoo.com/blogs/ydnfiveblog/high-performance-sites-rule-13-configure-etags-7211.html
  25. Użyj odwrotnego serwera proxy - Lakier (przynajmniej dla zasobów). Bardzo pomaga, jeśli większość użytkowników jest anonimowa.
  26. Przesyłanie skompresowane - Włącz kompresję gzip
  27. Keep Alive - W miarę możliwości używaj trwałych połączeń.
  28. Progresywny JPEGS -
  29. CACHING IN CODE - Blog Eatona jest niesamowity. http://www.lullabot.com/blog/article/beginners-guide-caching-data-drupal-7
  30. Wdrożenie ocieplenia pamięci podręcznej - https://www.drupal.org/project/cache_warmer - Ocieplenie pamięci podręcznej stron przed dotknięciem ich przez użytkownika końcowego.
  31. Konfiguracja Master Slave DB - https://www.drupal.org/project/autoslave ułatwia konfigurację.
  32. Klastry baz danych - https://stackoverflow.com/questions/1163216/database-cluster-and-load-balancing
  33. Load Balancers - http://en.wikipedia.org/wiki/Load_balancing_(computing)
  34. Użyj heurystycznego ocieplania pamięci podręcznej - https://www.drupal.org/project/cache_graceful
  35. Buforowanie uwierzytelnionego użytkownika - https://www.drupal.org/project/authcache
Gokul NK
źródło
Przeksięgowanie odpowiedź miałem napisane dla drupal.stackexchange.com/questions/118990/... . BTW zostało zamknięte, mówiąc, że jest zbyt szerokie. Nie jestem pewien, czy jest jakaś różnica w tych dwóch pytaniach :)
Gokul NK
18

Moduł Boost jest również bardzo przydatny, tworzy statyczne pamięci podręczne plików ze stron internetowych. Dotyczy to głównie witryn o dużym ruchu anonimowym.

Zwiększenie zapewnia statyczne buforowanie stron dla Drupala, umożliwiając bardzo znaczne zwiększenie wydajności i skalowalności dla witryn, które odbierają głównie anonimowy ruch. W przypadku hostingu współdzielonego jest to najlepsza opcja pod względem poprawy wydajności. Na serwerach dedykowanych możesz zamiast tego rozważyć Lakier.

Apache jest w pełni obsługiwany, z częściową obsługą Nginx, Lighttpd i IIS 7. Zwiększenie będzie buforować i kompresować gzip HTML, XML, Aneks, CSS i JavaScript. Zwiększa logikę wygasania pamięci podręcznej jest bardzo zaawansowana; posiadanie różnych czasów życia pamięci podręcznej dla różnych części witryny jest dość proste. Wbudowany przeszukiwacz zapewnia szybką regenerację wygasłej zawartości w celu szybkiego ładowania strony.

Pszczół
źródło
1
Zwiększenie działa świetnie dla Drupala 7, teraz imao. W przypadku wspólnego hostingu jest to doskonała droga (ponieważ często nie pozwalają na przykład na Varnish).
Sage
5

Warto wspomnieć, że jeśli używasz sterownika bazy danych SQLIte, może być konieczne wyłączenie synchronizacji dysku.

/**
 * Implements hook_init().
 */
function HOOK_init() {
  db_query('PRAGMA synchronous = OFF');
}

W niektórych konfiguracjach serwerów znacznie poprawi to wydajność.

ya.teck
źródło
2
Ponieważ wyłączało to go przy każdym ładowaniu strony, zastanawiałem się, czy istnieje lepszy sposób na trwałe wyłączenie. Powinien poświęcić trochę czasu na sprawdzenie.
Gokul NK
1
Można to zrobić w witrynach / default / settings.php, dodając element „init_commands” do tablicy $ databases. Znalazłem przykład „PRAGMA synchronous = OFF” tutaj: bitacoles.enging.com/node/210
dinopmi
4

Sekret wydajności Drupala polega na buforowaniu i przestrzeganiu dobrych praktyk. Propozycje:

Back-end Drupal

Interfejs Drupal

  • Minimalizuj żądania HTTP poprzez:
    • Włącz agregację JS / CSS w sekcji Wydajność .
    • Użyj duszka CSS do zmniejszenia liczby żądań obrazu.
    • Użyj małych obrazów jako danych wbudowanych (identyfikatory URI w arkuszu stylów).
    • Użyj map obrazów, aby połączyć wiele obrazów w jeden obraz.
    • Rozważ także użycie ładowania leniwych obrazów (patrz: Image Lazyloader ).
    • Zainstaluj moduł BigPipe, aby skrócić czas ładowania.
    • Zastanów się nad ładowaniem Lazy vs Lazy.
    • Zobacz: Użycie pamięci podręcznej przeglądarki - ujawnione!
  • Zastanów się nad zrobieniem zewnętrznego kodu JavaScript i CSS (w niektórych przypadkach jest to szybsze).
  • Zminimalizuj JavaScript i CSS (patrz: moduł Speedy ). Unikaj inline.
  • Po przedstawieniu się JS, użyj jednej deferlub asyncatrybuty.
  • Zminimalizuj liczbę ramek iframe.
  • Zoptymalizuj obrazy, czcionki, duszki CSS, spraw, by favicon był mały do ​​buforowania i zmniejsz rozmiar pliku cookie.
  • Zmniejsz liczbę elementów DOM i odwołań do pamięci podręcznej do elementów, do których uzyskano dostęp.
  • Przyspiesz ładowanie stron 404 za pomocą modułu Fast 404 .
  • Włącz agregację i buforowanie zasobów frontonu dzięki Advanced Agregation CSS / JS .
  • Umieść arkusze stylów na górze, a skrypty na dole.
  • Dodaj nagłówek Expires lub Cache-Control , a także znaczniki ETag w celu ograniczenia odpowiedzi.
  • Użyj GET dla AJAX i ustaw je w pamięci podręcznej.
  • Wstępnie ładuj i ładuj komponenty, aby wykorzystać czas bezczynności przeglądarki.
  • Czasami podział komponentów na domeny może zmaksymalizować równoległe pobieranie.
  • Nie skaluj obrazów w HTML i utrzymuj komponenty poniżej 25 KB.
  • Unikaj filtrów, wyrażeń CSS, elementów HTML z pustym src lub href.
  • Użyj odwrotnego proxy do debugowania twoich żądań internetowych (np. Charles ).
  • Do podstawowych kontroli wydajności używaj narzędzi takich jak Y-Slow i PhantomJS .
  • Użyj narzędzi Google PageSpeed , aby przeanalizować i zoptymalizować swoją witrynę.
  • Przeczytaj o specyfikacjach taktowania nawigacji W3C ( GitHub ).

PHP

  • Włącz buforowanie PHP (np. OpCache , APC ) i dostosuj ustawienia.
  • Rozważ użycie PHP-FPM zamiast mod_php plus Nginx zamiast Apache.

Baza danych

serwer

  • Sprawdź zalecane wymagania systemowe dla Drupal.
  • Sprawdź zalecane ustawienia serwera WWW dla Drupal.
  • Sprawdź zalecane ustawienia konfiguracji PHP dla Drupala.
  • Upewnij się, że hosting znajduje się na szybkich urządzeniach magazynujących (np. SSD).
  • Użyj dedykowanego szybkiego, niezawodnego serwera zamiast hostingu współdzielonego.
  • Zainstaluj Redis lub memcached (z obsługą igbinary) i skonfiguruj Drupal, aby z niego korzystał.
  • Zdefiniuj dłuższe czasy TTL dla wyszukiwarek (np. TTL wynoszący 24 godziny pozwala uniknąć botów docierających do serwera).
  • Ogranicz liczbę wyszukiwań DNS (upewnij się, że są buforowane).

Witryny o dużym ruchu

Jeśli spodziewasz się dużego obciążenia witryny, użyj Lakieru. Rozważ także użycie CDN.

Przeczytaj więcej na: Doświadczenie w świecie rzeczywistym w skalowaniu i dostrajaniu wydajności


Dalsze zasoby:

kenorb
źródło
3

Istnieje książka o nazwie High Performance Drupal, która zawiera najlepsze praktyki, przykłady i szczegółowe wyjaśnienia dotyczące rozwiązywania wielu problemów z wydajnością i skalowalnością. Dowiesz się, jak stosować techniki kodowania i infrastruktury do elementów wewnętrznych Drupal, wydajności aplikacji, baz danych, serwerów WWW i analizy wydajności.

W artykule Wydajność i skalowalność w Drupal 7 można znaleźć przykłady dotyczące Drupal 6 i Drupal 7 oraz następującą listę:

Projekty wydajności i skalowalności Drupala 7 do obejrzenia:

Adrian Cid Almaguer
źródło
2

Wprowadzono wiele poprawek, aby zoptymalizować wydajność witryny Drupal - ale nie wszystkie są konieczne. Musimy rozejrzeć się za pewnymi alternatywami i technikami, które doprowadziłyby do zoptymalizowania platformy Drupal. Pamięć podręczna, tak, jest to sposób na zoptymalizowanie witryny za pomocą różnych środków, ale niektóre dodatkowe dodatki i porady mogą zwiększyć i ulepszyć witrynę bez konieczności przeprowadzania bezproblemowych procesów.

Niedawno opublikowaliśmy podobny artykuł do naszej strony internetowej, który moim zdaniem może pomóc ci w drobnych poprawkach.

Źródło: http://www.cloudreviews.com/blog/drupal-performance-optimization-tips

Sabih
źródło
2

Istnieje kilka możliwości poprawienia prędkości Drupala na rozsądnym poziomie bez instalowania nowych modułów. Tak, Drupal ma konfigurację wydajności.

  1. Możesz to skonfigurować, przechodząc do: YourSiteDomain / admin / config / development / performance
  2. Włącz opcję „Buforuj strony dla anonimowych użytkowników” w obszarze Chaching
  3. Minimalny czas życia pamięci podręcznej: 1 dzień (jeśli nie wykonujesz regularnych aktualizacji)
  4. Wygaśnięcie stron w pamięci podręcznej: 1 dzień (jeśli nie wykonujesz regularnych aktualizacji)
  5. Włącz opcję „Kompresuj strony z pamięci podręcznej”
  6. Włącz opcję „Agreguj i kompresuj pliki CSS”
  7. Włącz „Agreguj pliki JavaScript”

  8. Po skonfigurowaniu tych konfiguracji przejdź do: YourSiteDomain / admin / raporty / status

  9. Sprawdź, czy występują problemy z uprawnieniami do katalogów „css” i „js”
  10. Popraw uprawnienia zdefiniowane na stronie Raport o stanie

A teraz skończysz z optymalizacją prędkości witryny Drupal 7.

Istnieje kilka narzędzi do testowania prędkości online, aby sprawdzić prędkość. Upewnij się, że używasz jednego z narzędzi kontroli prędkości i przeprowadź test przed aktualizacją powyższych ustawień. A po zaktualizowaniu ustawienia wydajności ponownie uruchom test prędkości. Na pewno zauważysz poprawę.

Pingdom i HTTP Fox (wtyczka FireFox) to najlepsze narzędzia do sprawdzania prędkości witryny.

Powyższe ustawienia nie tylko buforują twoje strony dla anonimowych użytkowników, ale także kompresują pliki CSS i JS. Przykład: jeśli Twoja witryna ładuje 80 plików, opublikuj te ustawienia, liczba żądań zmniejszy się do co najmniej o 50%, więc tutaj masz 2x poprawę prędkości na swojej stronie Drupal.

AnAnD
źródło
2

Jako programista zaplecza zawsze jest miejsce na ulepszenie kodu w celu zwiększenia wydajności witryny. Niektóre wytyczne dla programistów zaplecza mogą być:

1) Oczyść swój stół nadzorczy

2) Nie nadużywaj zmiennej API

3) Wykonaj mniej lub lepiej żądań HTTP

4) Trzymaj swój „moduł kropkowy” krótki

Jeśli chodzi o czcionki i kreatory stron, można osiągnąć znacznie więcej, ale ważne jest, aby wziąć pod uwagę wydajność z każdego punktu widzenia.

Źródło: Zoptymalizuj przed rozpoczęciem transmisji

targoo
źródło
2

Niezoptymalizowana witryna Drupal 7 z 2 GB pamięci RAM może zadowalająco obsłużyć około 20-25 żądań na sekundę. Jeśli chcesz wyjść poza to, strona będzie wymagała drobnych poprawek. To, co poprawisz, zależy od tego, czy większość użytkowników witryny jest anonimowa lub uwierzytelniona. Oto najważniejsze rzeczy, które możesz zrobić, aby poprawić wydajność:

Witryna obsługuje głównie anonimowych użytkowników:

1) Zdecydowanie zainstaluj i skonfiguruj APC, pamięć podręczną i pamięć podręczną.

2) Umieść serwer proxy Varnish przed serwerem WWW. Instalacja i konfiguracja zajmuje około 30 minut, ale znacznie skróci czas ładowania strony. W rzeczywistości Varnish może obsłużyć około 300 żądań na sekundę na maszynie o pojemności 2 GB, jeśli wszystkie strony są buforowane. Użyj modułu Wygasania, aby wygasać tylko wybrane strony dotyczące aktualizacji / usuwania treści.

3) Użyj zaawansowanego modułu agregacji CSS / JS, aby agregować pliki CSS i JS. Spróbuj przenieść wszystkie pliki JS na dół strony. Pamiętaj jednak, że może to uszkodzić Twoją witrynę, więc po dokładnym przetestowaniu zaimplementuj to na produkcji. Eksperymentuj także z wprowadzaniem krytycznego CSS. Z mojego doświadczenia wynika, że ​​skróci to czas ładowania strony o około pół sekundy.

4) Obrazy CSS / JS / powinny mieć nagłówek o dalekiej przyszłości. Zapewni to, że przeglądarki nie będą żądać ciągle tego samego obrazu CSS / JS /.

5) Upewnij się, że serwer WWW obsługuje skompresowane strony / CSS / JS.

Po wykonaniu powyższych 5 kroków serwer 2 GB pamięci RAM powinien być w stanie dość łatwo obsłużyć 50 żądań na sekundę.

Witryna obsługuje głównie uwierzytelnionych użytkowników:

Optymalizacja takiej strony jest bardziej złożona. Takie strony należą do jednej z dwóch podkategorii do celów optymalizacji:

(a) Większość stron w witrynie jest identyczna, z wyjątkiem 1 lub 2 bloków zawierających informacje specyficzne dla użytkownika. Na przykład strona Drupal Commerce.

(b) Większość stron jest całkowicie dostosowana do użytkownika. Na przykład strona Drupal Commons.

Jeśli Twoja witryna należy do kategorii (a), zastosuj większość technik, które omówiliśmy dla witryny obsługującej głównie anonimowych użytkowników. Jedyną różnicą jest to, że w przypadku stron nieadministracyjnych Varnish będzie musiał usunąć plik cookie SESSION z nagłówka i obsługiwać strony z pamięci podręcznej. Użyj modułu AJAX Block do serwerów bloków z informacjami specyficznymi dla użytkownika za pomocą AJAX. W ten sposób większość strony zostanie wyświetlona bardzo szybko przy użyciu Varnish, a następnie informacje specyficzne dla użytkownika będą wyświetlane przez AJAX.

Jeśli Twoja witryna należy do kategorii (b), użyj modułu Authcache. Wolę nie używać go tak często, jak to możliwe, ponieważ wymaga sporo konfiguracji i konserwacji. Ale działa naprawdę dobrze. Nie będzie tak szybki jak użycie Lakieru, ale będzie w stanie obsłużyć 50 żądań na sekundę, których szukasz.

Jeśli chcesz wyjść poza to, co tutaj omówiliśmy, zapoznaj się z listą kontrolną optymalizacji wydajności Drupal . Ujawnienie: Jest napisane przeze mnie. Przytacza wyczerpującą listę rzeczy, które możesz zrobić, aby Twoja strona Drupal płonęła szybko.

Neerav Mehta
źródło