Ladíme výkon PHP skriptů apache Mozektevidi.net - Mozektevidi.net.

Ladíme výkon PHP skriptů apache

Jak zjistit slabá místa v PHP skriptech? Práce s nástroji ab (apacheBench) a Siege. Výkon webové aplikace při zatížení, ladění aplikace a testování. Dotazy do databáze, zrychlení SQL dotazů

image of Ladíme výkon PHP skriptů apache

Proč optimalizovat PHP skripty?

Na co se zabývat a ztrácet čas optimalizací webové aplikace? Přece je naprosto jedno, jestli se stránka načte za 0,003s nebo za 0,03s. Uživatel to stejně nepozná. Optimalizování je drahé a časově náročné. A navíc dnešní servery mají výkon, o který se nám před lety ani nesnilo. On to ten stroj s čtyřjádrovým procesorem nějak zmákne.

Tak takle jsem uvažoval dříve. Nějakou dobu to fungovalo, ale jakmile databáze začne nabírat další a další Megabajty a návštěvnost začne prudce stoupat je problém. Problém, který nelze donekončna řešit nakupováním výkonnějšího hardware a přidáváním paměti. Mnohem levnější je začít pořádně optimalizovat.

Jak začít optimalizovat své skripty?

Pro začátek zjistíme, které stránky se nám načítají déle. Je to načtení článku? Přidání komentáře? Fulltextové vyhledávání? Seznam článků? Nebo nás brzdí „skrytý skript“ například RSS výstup?
Zjištění je jednoduché, stačí na začátek stránky pustit stopky a na konci zjistit čas.

/* od PHP 5 neni potreba, nahrazeno microtime(true)
function getTime(){
  list($usec, $sec) = explode(" ",microtime());
  return ((float)$usec + (float)$sec);
} */
$start_time = microtime(true); // delka nacteni stranky #vlastni zpracovani stranky $end_time = microtime();
echo $result = round($end_time - $start_time,4);

Pokud zjistíme náročnější stránku, můžeme udělat mezikroky a testovat takle všechny SQL dotazy na stránce. Pokud máme přístupd do databáze v objektech, stačí upravit třídu. Při načítání stránky nás nejvíce brzí dotazy do databáze (MySQL), ty je potřeba optimalizovat. Nějaké echo se už moc nezrychlí :).

Logy serveru hodně prozradí

Pokud máte přístup k logům serveru, máme jednoduší zjišťování informací. Nejdůležitější je mysql slow query log, který se nachází ve složce /var/log/mysql/. Další logy apache jsou neméně zajímavé, například error log a access log. SQL dotazy, nacházející se v mysql slow log by se měly optimalizovat. U tabulek existují indexy, a funkce OPTIMIZE TABLE, ANALYZE TABLE nebo ALTER TABLE.

Sledování zátěže, grafy vytížení…

Ještě že existují věci jako Apache Server Status, phpSysInfo (System Vital, Hardware Information, Network Usage, Memory Usage a Mounted Filesystems) a Munin (Disk, Mysql, Network, Processes, System), který dělá pěkné grafy (denní, týdenní, měsíční i roční). Nakonec i PhpMyAdmin vypíše zajímavou statistiku práce mysql databáze (Disk Mysql Network Processes System).

Nástroje pro simulaci zátěže

Apache Benchmarking (ab). Pracuje v textovém režimu a používá se velice jednoduše.
$ ab -n 1000 -c10 http://mozektevidi.net/

a výstup?

This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking mozektevidi.net (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests


Server Software:        Apache/2.2.8
Server Hostname:        mozektevidi.net
Server Port:            80

Document Path:          /
Document Length:        28187 bytes

Concurrency Level:      10
Time taken for tests:   6.164294 seconds
Complete requests:      1000
Failed requests:        873
   (Connect: 0, Length: 873, Exceptions: 0)
Write errors:           0
Total transferred:      28395923 bytes
HTML transferred:       28188923 bytes
Requests per second:    162.22 [#/sec] (mean)
Time per request:       61.643 [ms] (mean)
Time per request:       6.164 [ms] (mean, across all concurrent requests)
Transfer rate:          4498.49 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:    10   61  26.8     57     205
Waiting:       10   41  25.9     38     195
Total:         10   61  26.8     57     205

Percentage of the requests served within a certain time (ms)
  50%     57
  66%     64
  75%     70
  80%     74
  90%     95
  95%    114
  98%    142
  99%    156
 100%    205 (longest request)

Ab (apache benchmarking) toho umí mnohem více, stačí se mrknout do helpu. Testování programem AB se reálnému zatížení skutečného provozu moc nepřiblížíme. Pouze tupě n-krát spustí zadanou URL. O něco lepší je nástroj Siege. Ten umí spouštět v cyklu více zadaných URL. $ siege -i -t 10S -f urls.txt.

V příštím článku bude něco o způsobech optimalizace, hledání řešení a některé moje tipy.


autor článku OS | datum publikování 27.květen.2008 20:36 | články ze světa počítačů IT |

Kometáře

#1 matej21 wwwcompinex.cz

mas spatnej link z clanku..

function getTime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}

misto toho staci myslim staci microtime(true) je to tam myslim az od php5 a to true znamena, ze vysledna hodnota se vrati jako float reaguj

datum 27.05.2008 21:20

firefox linux-ubuntu

#2 Lukaj www

Je to tak jak píšeš. cz2.php.net/manual/en/function… reaguj

datum 28.05.2008 09:19

opera windows-xp

#3 Nobelicek wwwwww.netzona.cz

reakce na »matej21«: Potvoro ja to sem chtel napsat :D reaguj

datum 30.05.2008 07:21

firefox windows-vista

#4 MzK wwwmozektevidi.net

reakce na »matej21«: reakce na »Lukaj«: reakce na »Nobelicek«: NJN, tak jsem trochu zaspal dobu :) reaguj

datum 30.05.2008 10:00

opera windows-xp

#5 matej21 wwwcompinex.cz

reakce na »Nobelicek«: na me ses moc pomalej :D reaguj

datum 30.05.2008 15:14

firefox linux-ubuntu

Nové kometáře nejsou povolené.