Ladíme výkon PHP skriptů apache Mozektevidi.net - Píše Olda Šálek.

Navigace:Mozektevidi.netIT ⇒ Ladíme výkon PHP skriptů apache

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
vykon servera apache, php logovani zateze, výkon apache, php logovani zateze wget, apachebench, apache ab, ladíme mysql, cas scriptu php, optimalizace vyhledávaní php mysql, výkonnost php,

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 Oldřich Šálek | cal 27.5.2008 | články ze světa počítačů IT |

Kometáře


Komentáře a diskuze ke článku tady
diskuze ke článku

Související články

najit majitele telefonniho cisla prednaska vit vrba webexpo postup instalace mafia 2 kunda na kole školné na vysokých školách beruska icq do mobilu operacni system transformers 2 foto gta 4 demo ke stazeni zdarma facebook hled