Wpis z mikrobloga

Mirki, mam małe pytanie. Mam dość sporo obciążoną stronę (dogemonitor.com). Przy większym ruchu (60-100 online) strona potrafi trochę "przymulić". Muszę wykonywać sporo operacji po stronie PHP tak czy inaczej, tego nie obejdę (chyba, że przepisując stronę na inny język - aka Node.JS, które by się bardziej sprawdziło, ale to dosyć kłopotliwe).

I czy istnieje jakieś narzędzie, gdzie wcisnę sobie w kod microtime() czy coś podobnego, na koniec wykonywania skryptu czasy się zapisują i później mam dostęp do średniej etc.

W tym problem, że nie chcę dodatkowo obciążać tym bazy danych. Potrzebuję, żeby był to jakiś program, który może zapisywać je sobie w pamięci RAM (tego mi na serwerze akurat nie brakuje) i dostęp będę miał przez SSH.

Any ideas?

#programowanie #php #debugowanie
  • 31
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@mahitaji_anarudi: W tym rzecz, ze zewnętrzny czas ładowania strony za wiele mi w tym nie pomoże. Strona to HTML + JS + CSS (front) + 3 pliki PHP jako backend. I w samym PHP chcę profilować, tak, że później mam dane typu:

"Pobranie z bazy - 100ms"

"Parsowanie danych -
  • Odpowiedz
@Zalazdi: ty masz zrobione to tak ,że przy każdym wejściu na stronę pobierasz dane z giełd? Jeśli tak to proponuje z crona pobierać informacje nawet co minute i wrzucać do bazy. Trudno pomóc...w zasadzie nie napisałeś nic na temat tego jak masz to zorganizowane od strony technicznej
  • Odpowiedz
@Zalazdi: Xdebug obsłuży wszystko, ale też obciąża dodatkowo każdy request.

Dopisuj sobie logi, później wyciągaj z nich dane i licz.

Gdzie pisać logi? Najprościej do pliku na dysku, ale szybszą metodą jest walić do Memcache'a (działa w RAMie). Nie są to „istotne” dane, więc ewentualny restart nie będzie bolesny.
  • Odpowiedz
@fotexxx: Nie, oczywiście że nie. Pobieram co minutę wszystkie nowe "ordery" (zakończone transakcje) i zapisuje je do bazy. Później jeśli ktoś chce je odczytać - pobieram zamówienia dla maksymalnie 5000 jednostek czasu (dla minuty - 5000 minut, dla godziny - 5000*60). Zapisuje je do cache z maksymalną ważnością (czyli dla interval 1m to będzie

Najbardziej optymalne rozwiązanie, jakie przyszło mi do głowy, dla którego dane cały czas będą "świeże".

@
  • Odpowiedz
@Zalazdi: Już samo włączenie go na produkcji stanowi (jakieśtam) obciążenie. Sprawdź na ile istotne to się dowiesz.

Testuj lokalnie, a nie na serwerze produkcyjnym, który może mieć różne obiążenie w zależności od pory dnia, etc. Olej kesze, testuj pełny kod. Zapisz czas rozpoczęcia, zakończenia requesta.

Włącz Xdebuga,
  • Odpowiedz
@MacDada: W tym rzecz, że jeśli testuję lokalnie, bez żadnego obciążenia (lub liczonego w 5 osobach) to nie ma żadnego problemu z wykonywaniem requestów. I testowanie zawsze daje mi wyniki maksymalnie 1s przy parsowaniu danych i zapisie do cache. Jednak przy większej liczbie userów te 1s zamienia się w 5-10.
  • Odpowiedz
@Zalazdi: Hmm, no to ciesz się, że masz lekką stronę :D

Jeśli lokalnie śmiga, to może czas dorzucić więcej pehapów, itp? Nginx zamiast Apache? Może to nie PHP jest problemem.

W każdym razie nadal możesz pozapisywać czasy na serwerze i uśredniać, biorąc pod uwagę fakt, że będzie to dużo mniej miarodajne.
  • Odpowiedz
@Zalazdi: Trudno mi doradzić ,ale cos zaproponuje.

Miałem kiedyś podobny problem ,gdy potrzebowałem mieć aktualne dane a ruch na stronie powodował dławienie się mysql. Skutecznym rozwiązaniem problemu okazało się zrzucanie danych w formie statycznej do pliku json co 5 sek który potem był parsowany w js :).

Przed tym zabiegiem serwer ledwo zipał a po zmianie obciążenie spadło o dobre 40%.

Rozwiązanie skuteczne o ile json jest w rozsądnych rozmiarach
  • Odpowiedz
@MacDada: Chyba, że uruchomię xdebug i sprawdzę, co zabiera najwięcej czasu i spróbować to zoptymalizować jak się da.

Tak, bardzo możliwe że to wina np. Apache. Też będę musiał to sprawdzić wieczorem, kiedy większość Ameryki się obudzi :)

@fotexxx: Tyle, że nie za każdym requestem biorę dane z bazy. Jedynie, kiedy potrzeba mi świeższych danych (czyli dla interwału 1m to będzie co minutę, dla jednego dnia, cache odświeża
  • Odpowiedz
@MacDada: A gdy idzie o bazki, to tak ją zbudować, żeby robić proste selecty, jak najmniej joinów, dobre indeksy, proste inserty zamiast update'ów, itp.

Odpal sobie tego xdebugowego profilera albo chociaż pozapisuj sobie czasy w ramach requesta i lokalnie obczaj gdzie masz najwięcej zżeranego czasu.
  • Odpowiedz