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
@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 - 200ms"

"Zapis do cache - 5ms"

"Pętla foreach - 250ms"

Oczywiście "breakpointy' (czy jak to nazwać) sam sobie wpiszę, z tym
  • 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".

@MacDada:
  • 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, j.w.

Włącz profilera w Xdebugu, j.w.

Będziesz miał odpowiedź czy to bardzo obciąża.

U nas na produkcji (jedne z najpopularniejszych witryn w Polsce) Xdebug
  • 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 się co
  • Odpowiedz
daje mi wyniki maksymalnie 1s


@Zalazdi: blah, nie wiem czemu miałem w głowie

1ms
, a to przecież

1s
– więc długo. No to możesz spokojnie lokalnie optymalizować, to jest długi czas przetwarzania jeśli chodzi o samo PHP.

Jak masz jakieś typowe błędy (jak np kilkukrotne iterowanie po długiej tablicy, gdy można jednokrotnie), to jest szansa, że zjedziesz do

200ms
.

Wąskim gardłem BARDZO często jest też bazka.
  • 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