Gdy widać, że serwer bazodanowy zaczyna zwalniać, obciążenie procesora jest co raz większe, miło by było aby móc zlokalizować przyczynę takiego stanu rzeczy. W przypadku, gdy stosujemy standardową dystrybucję MySQL a użytkowników w bazie jest więcej niż kilku (i analizowanie bieżących wyników mytop’a czy SHOW PROCESSLIST; już nie wystarcza), w zasadzie jedynym rozwiązaniem jest włączenie pełnego logowania zapytań do slowlogów (long_query_time=0) i a potem wykorzystać magię awk’a/sed’a/perl’a aby posumować czas wykonywania zapytań dla każdego użytkownika. Problem w tym, że po pierwsze, tego typu statystyki są nieprecyzyjne. Jeśli chwilowo serwer został przeciążony, wydłuży się czas wykonywania wszystkich zapytań – nie tylko tych, które przeciążenie spowodowały. Po drugie, logowanie wszystkiego do slowlogu wpływa negatywnie na wydajność serwera – w końcu trzeba te wszystkie logi zapisać na dysku. Po trzecie, jeśli na serwerze jest spory ruch, to i logi będą długie – czas potrzebny na ich obróbkę, a także obciążenie przez ten proces generowane, może być znaczące i w praktyce uniemożliwić wykonywanie tego typu operacji na żądanie – da się je wykonać tylko w zaplanowanym okienku, w nocy, gdy dodatkowe obciążenie serwera nie będzie takim problemem. Czy jest jakieś inne rozwiązanie?
czytaj dalej…