PDA

Bekijk Volledige Versie : mysql load



copyfile
15/01/10, 23:19
Ik merk sinds ik mijn vps beter monitor dat er vaak enorme uitschieters zijn met een cpu load van tussen de 10 en 20 ! Dit is altijd maar 2 min. ofzo maar toch is eigenlijk niet de bedoeling. Als ik kijk komt dit doordat er 20 mysql connecties openstaan ofzo. Dit zal waarschijnlijk liggen aan een script op de server welke vaak een mysql connectie opent denk ik. Is hier iets algemeens aan te doen zonder alle duizenden scripts na te lopen ? Want op de momenten als de load zo hoog is worden site's vaak ook niet geladen omdat de server er te lang over doet om te reageren. Alvast bedankt !

Geert-Jan
15/01/10, 23:20
Is het je bekend welk script het is?

Marinus
15/01/10, 23:27
Als dat gebeurt, kun je op de MySQL server kijken welke queries er lopen of welke connecties actief zijn. Makkelijkste is dat via phpMyAdmin te bekijken maar als dat niet werkt vanwege de hoge load zou je het ook command line kunnen proberen. Het SHOW PROCESSLIST commando geeft je een overzicht van de lopende MySQL processen en queries.

PreServer
15/01/10, 23:34
http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html

vaak zijn het queries die "copying to temp table" zijn dit gebeurt vaak bij een combinatie van order by en group by, het kunnen ook "slechte" joins zijn.
Heb je default mysql of heb je hem wel geoptimaliseert voor het geheugen wat hij mag gebruiken, (key chache en sort buffer ed) dat scheelt vaak ook een hele hoop.

Als er 1 query copying to temp table staat vertraagt die je hele mysql (server zelfs) waardoor de rest allemaal moet wachten, hierdoor krijg je meer open connecties dan normaal

Keizer
16/01/10, 15:19
Als het in die show processlist; slapende connecties blijken te zijn zou het ook een script kunnen zijn die mysql_pconnect gebruikt... Ik zie wel vaker dat vanaf zo'n 20-30 slapende connecties dat de hele server het moeilijk krijgt..

huizinga
21/01/10, 00:18
Draaien er niet toevallig backups of cronjobs. Kun je iets van een patroon ontdekken in de pieken? (dit helpt vaak bij het zoeken)

Misschien even een scriptje schrijven die wat mysql stats periodiek ophaalt (zoals de processlist) je zult waarschijnlijk niet elke minuut bij je server zitten. dan kun je via je monitoring de tijd opzoeken en de betreffende stats bekijken..

systemdeveloper
21/01/10, 00:29
Misschien heb je hier iets aan onderstaande scriptje? Even in een screen op je server runnen. Dit scriptje controleer elke 5 seconden welke queries langer dan 5 seconden draaien (kan dus 5-10 sec) en schiet deze processen af.
Die 5 seconden moet je zetten op het aantal seconden dat je zwaarste query trekt onder normale omstandigheden + een marge om je pieken op te vangen.
Het resultaat is dat je gewoon de volgende heftige load kunt afwachten en dan een overzicht krijgt van de queries die afgeknalt zijn. Een ideaal lijstje om snel te zien welk soort bottlenecks je db heeft plus natuurlijk het voordeel dat het afschieten zorgt dat je server blijft leven :)



#!/bin/bash

while [ 1 -gt 0 ]; do
IFS='|'
mysqladmin -u root -p<jouwpw> processlist -v | grep Query | grep -Evi "delete|update|insert|locked|alter table" | while read dummy qid qusr qhost qdb qstat qsec qstat2 query
do
if [ $qsec -gt 5 ]; then
echo "Killing query $qid..."
echo $dummy $qid $qusr $qhost $qdb $qstat $qsec $qstat2 $query
mysqladmin -u root -p<JouwPW> kill $qid
fi
done
sleep 5
done

Edit:
"delete|update|insert|locked|alter table" geeft trouwens aan wat NIET afgeschoten moet worden en dit is dus de versie die hoofdzakelijk 'selects' killed. Als die-hard beheerder zet je dat lijstje natuurlijk op niks en kill je gewoon ALLES wat aan de resources van je server knabbelt :)

Dreas
21/01/10, 01:15
Je kan het programmaatje "mytop" draaien (apt-get install mytop), die laat de actieve MySQL processen overzichtelijk zien.