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
- a Drupal 7 saját cache rendszerét kapcsoltam be: Administer » Configuration » Development » Performance.
- tömörítettem a css és js fájlokat,
- telepítettem és bekapcsoltam a Boost modult, ami az anonymous kérések esetén gyorsítja a kiszolgálást.
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
- http://colans.net/blog/drupal-7-performance-optimization-options-and-checklist
- http://chapterthree.com/blog/four-easy-fix-mistakes-will-kill-site-performance
- http://drupal.stackexchange.com/questions/724/why-is-drupal-7-so-slow
- https://drupal.org/node/2136161
- http://stackoverflow.com/questions/11828749/drupal-7-is-too-slow-on-first-load
- http://kegel.com/drupal/slow.html
- http://mydrupal.com/how-to-speed-up-optimize-drupal-7
- http://friendlymachine.net/posts/2011/5-ways-to-improve-performance-in-drupal
- http://www.creativebloq.com/web-design/drupal-performance-tips-9122837