Korábban írtam egy blogbejegyzést arról, hogyan lehet gyorsan és egyszerűen fejlesztőkörnyezetet összeállítani Ubuntu Linux rendszeren a Drupalos fejlesztésekhez. Több érdekes visszajelzés érkezett, például megtudtam, hogy a jogosultság-probléma megoldása lehetséges CGI mód nélkül is, a PHP-t hagyományosan Apache modulként használva. Időközben mindig finomítottam kicsit a beállításokon, majd Tyr43l-től kaptam hasznos tanácsokat a további teljesítményhangolás tekintetében.
Nyilván egy fejlesztői környezetnél nem azok az elvek érvényesülnek, amelyek egy nagyobb terhelésű szervernél, már sokszor az alapbeállítások is megfelelőek. Viszont érdemes rászánni egy kis időt a finomhangolásra, amelyet majd később a munka során megspórolunk.
Az általam használt számítógép Intel core i5-ös processzorral és 8 GB RAM-mal rendelkezik, ezért más gépeken szükség lehet a megadott értékek átállítására, az operációs rendszer pedig továbbra is Ubuntu 11.04.
1. MySQL teljesítménynövelés
Hozzunk létre egy új fájlt a beállítások számára:
$ sudo gedit /etc/mysql/conf.d/mysql_tuning.cnf
A fájl tartalma legyen a következő:
[mysqld] max_connections = 10 max_user_connections = 150 key_buffer = 1024M myisam_sort_buffer_size = 128M join_buffer_size = 4M read_buffer_size = 8M sort_buffer_size = 16M table_cache = 2048 table_definition_cache = 1024 thread_cache_size = 286 interactive_timeout = 25 wait_timeout = 1800 connect_timeout = 10 max_allowed_packet = 64M max_connect_errors = 1000 query_cache_limit = 1M query_cache_size = 16M query_cache_type = 1 tmp_table_size = 64M log_slow_queries = /var/log/mysql/mysql-slow.log [innodb] innodb_buffer_pool_size = 1024M innodb_additional_mem_pool_size = 20M innodb_log_file_size = 10M innodb_log_buffer_size = 64M innodb_flush_log_at_trx_commit = 2 innodb_lock_wait_timeout = 180
A félkövéren megjelölt adatokat szükséges módosítani, ha kevesebb memóriát adnánk a MySQL-nek, jelen esetben 1 gigabyte RAM-ot fog lefoglalni magának.
A fájl mentése után a következő paranccsal indítsuk újra az adatbázis-szervert:
$ sudo service mysql restart
Amennyiben további beállításokkal szeretnénk növelni a MySQL szerver teljesítményét, a Tuning Primer Script személyében praktikus segítőtársra lelhetünk.
2. PHP trükkök
Ha az előző leírásban felvázolt CGI módban futtatjuk a PHP-t, akkor nyissuk meg a konfigurációs fájlját (Apache modulként használva az /etc/php5/apache2/php.ini
fájlt keressük):
$ sudo gedit /etc/php5/cgi/php.ini
A realpath_cache_size
és a realpath_cache_ttl
értékét fogjuk megemelni, alapértelmezetten „16k” és „120” van beállítva nekik:
realpath_cache_size = 128k realpath_cache_ttl = 160
CGI módban használt PHP-nél gyorsíthat a PHP-FPM, amely daemonként folyamatosan futva a kérések kiszolgálása során jelent teljesítménynövekedést:
$ sudo sudo apt-get install php5-fpm
Szerkesszük beállításokat tartalmazó állományt:
$ sudo gedit /etc/php5/fpm/pool.d/www.conf
Keressük meg benne a jogosultságra vonatkozó user
és group
sorokat, majd adjuk meg az előző leírásban használt felhasználó- és csoportnevet.
user = felhasznalo group = felhasznalo
Végül indítsuk újra a szolgáltatást:
$ sudo service php5-fpm restart
3. APC telepítése
Az APC egy PHP kiterjesztésként elérhető gyorsítótár, amely nagyobb terhelésnél ugrásszerű gyorsulást képes előidézni. A következő paranccsal tudjuk feltelepíteni:
$ sudo apt-get install php-apc
Fejlesztésnél okozhat mellékhatásokat, például egy fájl változtatásának eredménye nem jelenik meg a böngészőben. Az alábbi módon tudjuk kivédeni ezeket:
Nyissuk meg a beállításait tartalmazó állományt:
$ sudo gedit /etc/php5/conf.d/apc.ini
Adjuk hozzá a következő sorokat:
apc.stat = 1 apc.stat_ctime = 1 apc.rfc1867 = 1 apc.shm_size = 64
Majd indítsuk újra a webszervert:
$ sudo service apache2 restart
4. Apache apróság
Ha Apache webszervert használunk, akkor az AllowOverride és .htaccess használata minden lekérésre további fájlműveleteket jelent, ezért az általánosan használt beállításokat érdemes lehet a webszerver konfigurációs állományába (pl. /etc/apache2/sites-available/virtualhost_wildcard
) átemelni.
5. SQLite adatbázis a memóriában
A Drupal 7 képes SQLite adatbázist használni a működéséhez. Ez egy, a MySQL-nél jóval kisebb erőforrás-igényű adatbáziskezelő, egyik jellemzője, hogy a teljes adatbázis egyetlen állományban tárolódik.
Ha ezt a fájlt a memóriában, vagyis ramdiszken tároljuk el, akkor többszörös sebességnövekedést érhetünk el. Azt ne felejtsük semmiképpen, hogy a számítógép leállítása vagy újraindítása során a ramdiszk tartalma elveszik, így csak átmeneti, kísérletezéshez használt adatokat tartsunk ott. Használhatjuk egy-egy művelet gyorsítására is, hiszen léteznek eszközök az egyes adatbázis-formátumok közti hatékony konverzióra.
Első lépésben szükségünk van a PHP SQLite támogatására:
$ sudo apt-get install php5-sqlite $ sudo service apache2 restart
A legegyszerűbb módszer, ha felhasználjuk a rendszerünkön már meglévő ramdiszket, amely telepítéskor állítódik be. Ezt a /dev/shm/
könyvtárban találjuk, vagyis ha a Drupal telepítésekor az adatbázis-kapcsolat beállításánál az SQLite opciót választjuk, majd fájlnévnek megadjuk a /dev/shm/enoldalam.sqlite
elérési utat, akkor a Drupal memóriába települ. Érdemes összehasonlítani a telepítés sebességét a klasszikus MySQL módhoz képest.
Persze készíthetünk külön ramdiszket is a következő módon, például az /mnt/ramdiszk/
könyvtárba. Ehhez a következő lépésekre van szükség:
$ sudo mkdir /mnt/ramdiszk $ sudo mount none /mnt/ramdiszk -t tmpfs -o noatime,nosuid,nodev
Így már telepíthetjük is a rendszert, például a /mnt/ramdiszk/teszt.sqlite
fájlt megadva.
Ha azt szeretnénk, ha ez a ramdiszk a fenti parancs kiadása nélkül, minden bekapcsoláskor automatikusan létrejöjjön, akkor nyissuk meg szerkesztésre az /etc/fstab
fájlt:
$ sudo gedit /etc/fstab
Majd az állomány végére írjuk a következő sort:
tmpfs /mnt/ramdiszk tmpfs defaults,noatime,nosuid,nodev 0 0
Sőt, az egész számítógép teljesítményét növelhetjük, ha ugyanebbe a fájlba felvesszük a /tmp
könyvtárat is:
tmpfs /tmp tmpfs defaults,noatime,nosuid,nodev 0 0
Ne feledjük, hogy így bár minden alkalommal létrejön a meghajtó, viszont továbbra is elveszik minden bekapcsoláskor és újraindításkor a tartalma, ezért csak megfelelő körültekintéssel helyezzünk rá adatokat. Érdemes megjegyezni még, hogy az ott tárolt adatok a memóriában foglalják el a helyet, vagyis kevés rendelkezésre álló memória esetén ne próbáljunk meg nagyobb fájlokat ott tárolni.
6. MySQL adatbázis a memóriában
Ha ideiglenesen szeretnénk felgyorsítani a MySQL adatbázis-műveleteket és vállaljuk az ezzel járó esetleges adatvesztést, az adatbázist átpakolhatjuk az előzőekben létrehozott ramdiszken. A példában a „teszt” nevű adatbázissal fogok dolgozni. Ezt az adatbázist hozzuk létre a phpMyAdmin, vagy más általunk ismert eszköz segítségével, majd végezzük el az alábbi műveleteket:
$ sudo service mysql stop $ sudo mv /var/lib/mysql/teszt /mnt/ramdiszk/ $ sudo mkdir /var/lib/mysql/teszt $ sudo mount none /var/lib/mysql/teszt -t tmpfs -o noatime,nosuid,nodev $ sudo sh -c "mv /mnt/ramdiszk/teszt/* /var/lib/mysql/teszt/" $ sudo service mysql start $ sudo rmdir /mnt/ramdiszk/teszt
A parancsoknál mindenhol kiírtam az adatbázis nevét. Gyakorlatban annyi történt, hogy az adatbázis-szerver leállítása után az adatbázishoz tartozó fájlokat áthelyeztem egy átmeneti helyre, létrehoztam egy új ramdiszket a megfelelő helyen, majd a fájlok visszapakolása után elindítottam az adatbázis-szervert.
Ha szeretnénk a ramdiszkről az eredeti helyére visszaállítani az adatbázist, a következő módon tehetjük meg:
$ sudo service mysql stop $ mkdir /mnt/ramdiszk/teszt $ sudo sh -c "mv /var/lib/mysql/teszt/* /mnt/ramdiszk/teszt" $ sudo umount /var/lib/mysql/teszt $ sudo chown mysql:mysql /var/lib/mysql/teszt $ sudo chmod 700 /var/lib/mysql/teszt $ sudo mv /mnt/ramdiszk/teszt/* /var/lib/mysql/teszt $ sudo service mysql start $ sudo rmdir /mnt/ramdiszk/teszt
Ügyesen megírt szkriptekkel a fenti műveletek automatizálhatóak mind SQLite, mind MySQL esetén. Akár az is megoldható, hogy a gép leállításakor automatikusan elmentse a ramdiszken tárolt adatbázisokat, majd indításkor visszahelyezze azokat.
További lehetőség lehet még az adatbázisok SSD meghajtón való tárolása, amelyet a fenti módszerekhez hasonlóan lehet megoldani.