Egy olyan kérés ami súlyos másodpercekig fut a webszerveren elég gáz tud lenni, viszont nem mindig könnyű kideríteni, hogy melyek is ezek. Ebben fog segíteni az alábbi kis összeállítás.
Előszőr a proxy -n lehet vizsgálódni. Az nginx log moduljából kideról, hogy a $request_time
-ot érdemes lelogolni és akkor kiderül, hogy melyik kérést mennyi ideig tartott kiszolgálni. Ezt igazából csak a teljesség kedvéért írtam, mert a proxy eléggé ártatlan szokott lenni esetekben.
A fő bűnös általában a PHP, vagyis az őt futtató Apache. Az apache doksijából látszik, hogy a %P The process ID of the child that serviced the request.
és a %T The time taken to serve the request, in seconds.
-t hasznos lehet lelogolni. Előbbi hibakeresésénél (beragadt child), míg utóbbi a lassú kérések megkeresésénél lehet hasznos. Annak ,akinek nagyon jó rendszere van és mindne kérés egy másodperc alatt lefut van egy másik lehetőség: %D The time taken to serve the request, in microseconds.
.
Szerencsére erre is van már célszerszám: a modlogslow. Ez egy apache modul, amivel le lehet logolni a lassú kéréseket. Mivel csomagban nincs, ezért le kell fordítani, amihez a apache2-prefork-dev
-kell. Konfigurálása ennyi:
LogSlowEnabled On
LogSlowLongRequestTime 4000
LogSlowFileName /var/log/apache2/slow.log
A modlogslow kimenetét is lehet még tovább finomítani:
cut -d ' ' -f 13,15,5 /var/log/apache2/slow.log| \
sed -r "s/^([0-9.]+) (.+) (.+)/\2 \3 \1/" |sed -r "s/^www\.(.+)/\1/" |sort
ha ezt még egy egyszerű PHP programmal rendezgetjük, akkor a userek számára is emészthető eredményt kapunk..
Az apache persze igen gyakran a nem jól megírt SQL parancsok miatt lassú. Ezt úgy lehet kideríteni ha bekapcsoljuk a slow logot:
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 4
Ennek a kimente elég nagy tud lenni, ugyhogy nemárt ha kiemeljük a lényeget a mysql-log-filter -el. Ennek futtatásához kell a php5-sqlite
(már amennyiben PHP -ban futtatjuk). Használata pedig ilyen:
php /usr/local/mysql-log-filter/mysql_filter_slow_log.php -T=3 --no-duplicates \
--sort-execution-count --top=10 --incremental /var/log/mysql/mysql-slow.log
Én úgy vettem észre, hogy a log váltásokat nem kezeli jól,úgyhogy havonta nem árt letörölni az sqlite adatbázisát (pl.: cron.monthly -ban).
Utolsó kommentek