Drupal 7 sebesség javítása

Drupal 7

Gyakori probléma, hogy a Drupal alapú weboldalak,- főleg fejlesztői gépen - kegyetlenül lassúak (10-30 sec) betöltődési idővel.

Drupal 7 too slow

Az interneten rengeteg válasz van arra a kérdésre, hogy "Drupal 7 too slow". Mindegyik nagyjából ugyanazokat a tippeket, trükköket mondja, de bármit is tettem az oldalam lefutásának ideje sohasem ment 4-5 sec alá és egy kérés teljes válaszideje kb. 10 sec lett.

Miket próbáltam először?

Drupal Cache

A legtöbb tanács a cache-ek bekapcsolásáról szólt, ezért az éles szerveren

Az istennek sem ment lejjebb a válaszidő.

  • A futási idő 4-5 sec maradt, a teljes válaszidő 10-12 sec.

Windowsos fejlesztői gép - PHP változat

A fejlesztői gépen van PHP 5.2, 5.3, 5.4 és 5.5 -mal, ezért kipróbáltam, hogy melyiken hogyan fut a cucc.

  • Azt tapasztaltam, hogy a PHP 5.2-n lassabb a Drupal 7, a PHP 5.3, 5.4, 5.5-ön pedig gyorsabb. Lényegében 3-4 sec futási időt mértem és 6-8 sec teljes letöltés időt.

OPCode accelerator

Drámai változást értem el, amikor feltelepítettem cache programokat telepítettem a PHP-k alá. Az alábbiakat mértem:

  • Apache 2.2.22 + PHP 5.2.27 + eAccelerator SVN4.2.7 - futási idő: 2,7-2,8 sec, teljes letöltési idő: 4,5 sec.
  • Apache 2.4.2 + PHP 5.3.28 + Zend OPcache 7.0.3 - futási idő: 1,6-1,8 sec , teljes letöltési idő: 3,5 sec.
  • Apache 2.4.2 + PHP 5.4.25 + Zend OPcache 7.0.3 - futási idő: 1,5-1,6 sec , teljes letöltési idő: 3,22 sec.
  • Apache 2.4.2 + PHP 5.5.9 + Zend OPcache 7.0.3 - futási idő: 1,3-1,4 sec , teljes letöltési idő: 2,65-3,1 sec.

Virtuális gépen

  • Apache 2.4.7 + PHP 5.5.9 + Zend OPcache 7.0.3 - futási idő: 1,14-1.24 sec , teljes letöltési idő: 3 - 3,3 sec.

Mi a magyarázat?

A Drupal 7 rengeteg modullal dolgozik, és a könyvtárszerkezetben sokat keres a file_scan_directory() rekurzív függvény segítségével, majd a megtalált fájlokat az include_once() eljárás segítségével beolvassa. Az opcode cache betölti memóriába a kérdéses fájlokat és a második hívásnál már onnan szolgálja ki a kéréseket. Tesztek szerint a futási idő jelentős része, kb. 30%-40%-a a fájlok megkeresésével és betöltésével telik cache nélkül. Ez okozza a dármai változást a cache használatával.

Láétható, hogy a PHP 5.5 nagyobb teljesítményű a korábbi verzióknál, ezért ugyanazon a gépen gyorsabb volt.

A Linux jobban optimalizált kiszolgálónak, mint a Windows 7, de nincsen lényeges különbség közöttük.

A teszt során ugyanazt az oldalt töltöttem le többször egymás után, a gépen és a virtuális gépen semmi különleges program nem futott. A PHP minden esetben több, mint 128MB memóriát kapott. A MySQL 5.1.11 futott a Windowson a virtuális gépen MySQL 5.5.37, az éles szerveren MySQL 5.1.36.

Milyen tanácsokat adhatunk a rendszer gyorsítására?

Windows + Apache + MySQL + PHP + Drupal gyorsítása

Drupal 7 szinten

  • Kapcsoljuk be a Drupal 7 cache rendszerét:Administer » Configuration » Development » Performance.
  • Kapcsoljunk ki minden olyan modult, amit nem használunk.
  • Kapcsoljuk ki a Statistics modult
  • Kapcsoljuk ki az Update Manager modult
  • Entity Cache modult telepítsük és kapcsoljuk be
  • Display cache a view módot gyorsítja
  • Aggregate cache - összeszerkeszti a css és js fájlokat egybe, ezáltal kevesebb kérés megy a szerverhez. A szerver oldalon kiküszöböli a file_exists() PHP kéréseket, amelyek az operációs rendszertől sok időt vesznek el.
  • Ha van View, akkor kapcsoljuk be a Views Content cache modult
  • Telepítsük és kapcsoljuk be a Panels Content Cache modult - ha kell.
  • File cache modul az adatbázis helyett a cache tartalmát fájlrendszerbe menti a szerveren, ami kiiktatja az adatbáziskéréseket, de egy kis PHP futtatást eredményez. Ha használunk memcache vagy más optimizáló programot a szerveren a PHP-hoz, akkor a memóriában lévő fájlrendszerben is lehet tárolni a fájlokat.
  • Alternative Database Cache - lecseréli a Drupal saját cache modulját. A file cache modullal együtt nem szabad használni.
  • Advanced CSS/JS aggregation modul a CSS és JS fájlokat letömöríti.
  • A page-not-found hibák esetén a Fast 404 modul gyorsítja. Itt én belefutottam egy problémába, amikor egy általam fejlesztett modul összeakadt ezzel a modullal.
  • HTTPRL modul a szerverhez irányuló kéréseket gyorsítja.
  • Image Lazyloader - a képek betöltését gyorsítja
  • A letörölt vagy nem létező modulok kezelésére a Missing Module gyorsítja a futást
  • A PHP filter modult kapcsoljuk ki még akkor is ha saját PHP kódot akarunk futtatni, inkább készítsünk saját modult és abba tegyük a kódot.

Hardver, operációs rendszer, webszerver, MySQL gyorsítása

  • Használjunk NGINX szervert Apache helyett
  • Használjunk PHP 5.5-öt
  • Használjunk a PHP-hoz valamilyen cache programot (APC, Opcache, memcache)
  • Reverse proxy megoldás, például Varnish cache.
  • A css, js és egyéb fájlok böngészőoldali cache-elésének elősegítéséhez az Apache mod_expires moduljának a bekapcsolásával és a .htaccess megfelelő konfigurálásával.
  • A kimenő tartalom tömörítésével szerver oldalon az Apache mod_deflate használatával.
  • A Drupal 7 InnoDB adattáblákat használ, ami írásnál biztonságos, tranzakciós, de írásnál és az adatok lekérdezésénél lassabb, mint a MyIsam típusú táblák, ezért a cache és a variable nevű táblákat érdemes átalakítani MyIsam táblákra.
  • Az adatbáziskezelő módosítása NoSQL típusúra. Ilyen például a MongoDB. Ennek használatához szükséges a Mongo DB Drupal modul. A cache tartalmát teszi MongoDB adatbázisba. A MongoDB az adatbázist memóriában tartja, ezzel gyorsítja a kiszolgálást. Nem ajánlatos együtt használni a File cache vagy az Alternative Database Cache modullal.
Külső szolgáltatások használata
  • CDN - a tartalom egy felhőben található
  • Pantheon - ajánlott felület, ahol teljes Drupal stack található
Az oldal sebességét tesztelő eszközök
  • Performance Logging and Monitoring modul
  • A Performance and Scalability Checklist modul segítségével a rendszer optimalizálását ellenőrizhetjük
  • A Devel modul segítségével elemezhetjük a lassú lekérdezéseket
  • Akár a Zend Studio profiler, akár azXHProf PHP Profiler használható az oldal lefutásának elemzésére
  • YSlow használata a Firefoxban és/vagy Chromeban. Javaslatokat fogalmaz meg az oldal sebességének javítására ésteszteli az oldal sebességét.

További lehetőségek weboldalak sebességének gyorsítására

  • A jpg, png képek méretének csökkentése akkorára, hogy a böngészőnek ne kelljen átméretezni
  • Kevesebb külső js kódot - meghívni, pl Google Analytics kódot a szerverre telepíteni
  • Kevesebb iframe-et használni
  • A javascript kódokat az oldal végére téve a felhasználó számára megjelenik az oldal a böngészőben, amikor a js kódok még csak töltődnek.
  • A css fájlok pedig a HTML oldal elején legyenek

Néhány angol nyelvű oldal, ahol ezzel a témáával foglalkoznak