Ladíme výkon PHP skriptů apache Mozektevidi.net - Píše Olda Šálek.
Navigace:Mozektevidi.net ⇒ IT ⇒ Ladíme výkon PHP skriptů apache
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.
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í :).
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.
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).
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.