Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][Cache] Strona 10 k uniqów + potężny dedyk + cache = zamulanie ?
Forum PHP.pl > Forum > PHP
matix
Witam.

Mam pewien problem, gdyż pracuję obecnie nad serwisem, który ma 10, 000 unikalnych wizyt dziennych (150 online). Nie jest to jakoś specjalnie dużo, ale wystarczyło, abym miał problem z jego optymalizacją. Jest to serwis z mp3 !

Obecnie serwis stoi na potężnym dedyku, bo aż 8 gb ram, inne parametry też tak samo potężne jak ten ram, ale...

Strona działa dobrze z wyjątkiem tego, że gdy wchodzę w podstronę, to ładuje się ona ~35 - 50 sekund.

Problem jest w tym, że baza danych ma około 500, 000 rekordów z piosenkami i ciągle się powiększa. Myślę, że dojdzie do miliona. Wszystko ładnie działa, wyniki wyszukiwania są zapisywane w cache i nie ma problemów. Gdy wybieram pojedyńczy utwór, aby go przesłuchać ładuje mi się akcja MORE w której jest mniej więcej taka budowa(mój własny framework, proszę nie krytykować. chodzi tylko o zaprezentowanie kodu):

  1. <?php
  2. function getMore($iKey)
  3. {
  4. $Name = 'moreinfo-'.$iKey;
  5. $oCache = new cache;
  6.  
  7. if ($oCache->expired($Name, 3600*24*7) || (!$oCache->ping($Name))):
  8.  
  9. $this->db->setWhere("id = '$iKey'");
  10.  
  11. $oCache->save($Name, $this->db->fetchOne(db::FETCH_ASSOC, $this->db->select('song', true)));
  12.  
  13. endif;
  14.  
  15. return $oCache->read($Name, true);
  16. }
  17. ?>


Oznacza to, że skrypt pobiera ID piosenki z linka i do zmiennej Name zapisuje np. moreinfo-6312, następnie sprawdza czy istnieje cache o danej nazwie lub czy w nie jest "przeterminowany" (raz na tydzień). Jeśli tak - pobiera dane z bazy danych. Zapytanie wygląda mniej więcej tak:

  1. SELECT * FROM song WHERE id = 6312


na końcu wyświetla dane z cache.

Nie wiem dlaczego, ale to mi obciąza baardzo serwis.
Moje przypuszczenia to, albo układ plików cache:

- app/cache/ : TUTAJ SĄ WSZYSTKIE PLIKI CACHE, NIE MA PODZIAŁÓW NA KATALOGU (SYSTEM DEBIAN 4 - ponoć może być milion plików i to nic nie zmienia)

albo ...

no nie wiem..
miał ktoś taki problem? z góry dzięki,
Matix.
qrees
Cytat(matix @ 14.01.2008, 19:36:11 ) *
Witam.

Mam pewien problem, gdyż pracuję obecnie nad serwisem, który ma 10, 000 unikalnych wizyt dziennych (150 online). Nie jest to jakoś specjalnie dużo, ale wystarczyło, abym miał problem z jego optymalizacją. Jest to serwis z mp3 !

Obecnie serwis stoi na potężnym dedyku, bo aż 8 gb ram, inne parametry też tak samo potężne jak ten ram, ale...

Strona działa dobrze z wyjątkiem tego, że gdy wchodzę w podstronę, to ładuje się ona ~35 - 50 sekund.

Problem jest w tym, że baza danych ma około 500, 000 rekordów z piosenkami i ciągle się powiększa. Myślę, że dojdzie do miliona. Wszystko ładnie działa, wyniki wyszukiwania są zapisywane w cache i nie ma problemów. Gdy wybieram pojedyńczy utwór, aby go przesłuchać ładuje mi się akcja MORE w której jest mniej więcej taka budowa(mój własny framework, proszę nie krytykować. chodzi tylko o zaprezentowanie kodu):

  1. <?php
  2. function getMore($iKey)
  3. {
  4. $Name = 'moreinfo-'.$iKey;
  5. $oCache = new cache;
  6.  
  7. if ($oCache->expired($Name, 3600*24*7) || (!$oCache->ping($Name))):
  8.  
  9. $this->db->setWhere(&#092;"id = '$iKey'\");
  10.  
  11. $oCache->save($Name, $this->db->fetchOne(db::FETCH_ASSOC, $this->db->select('song', true)));
  12.  
  13. endif;
  14.  
  15. return $oCache->read($Name, true);
  16. }
  17. ?>


Oznacza to, że skrypt pobiera ID piosenki z linka i do zmiennej Name zapisuje np. moreinfo-6312, następnie sprawdza czy istnieje cache o danej nazwie lub czy w nie jest "przeterminowany" (raz na tydzień). Jeśli tak - pobiera dane z bazy danych. Zapytanie wygląda mniej więcej tak:

  1. SELECT * FROM song WHERE id = 6312


na końcu wyświetla dane z cache.

Nie wiem dlaczego, ale to mi obciąza baardzo serwis.
Moje przypuszczenia to, albo układ plików cache:

- app/cache/ : TUTAJ SĄ WSZYSTKIE PLIKI CACHE, NIE MA PODZIAŁÓW NA KATALOGU (SYSTEM DEBIAN 4 - ponoć może być milion plików i to nic nie zmienia)

albo ...

no nie wiem..
miał ktoś taki problem? z góry dzięki,
Matix.



Spróbuj mimo wszystko podzielić cache na katalogi, to że system może obsługiwać milion plików w katalogu to nie znaczy, że będzie to działać szybko. Ponadto może zamiast robić jeden potężny serwer lepiej podzieliś ten serwer na kilka (serwer plików, serwer www, serwer bazy danych).
matix
Hmm mysle ze podzielenie to nie ma sensu, dlatego ze samo wyszukiwanie rekordow z bazy danych dziala bardzo szybko. Zastanawiam sie tylko dlaczego bardzo wolno dziala pobieranie jednego wyniku. hmm....
nrm
to coś podejrzanie wygląda. na pewno masz pozakładane indexy na te pola?
matix
Problem z działaniem podstrony danego utworu rozwiązany. Przy każdym unikalnym wejściu, dawalem $this->model->addVisited(), co dodawało +1 do bazy danych w tabeli `downloaded`. Myślałem, że to nie będzie aż tak uciążliwe, ale po usunięciu tej linijki, skrypt ładuje się 0.5 - 2 sekund, maksymalnie. Dziwne.

Jest jeszcze jeden problem, bo nie wiem jak zoptymalizować wyszukiwarkę, tz. mam coś takiego:

  1. <?php
  2. $query = $this->params->post->query;
  3.  
  4. if ($query != '')
  5. $this->redirectUri($this->url->build('search/'.trim(title($query))));
  6. ?>


Problem nieco śmieszny. Mam sobie formularz z polem `query` gdzie jest wpisywana nazwa utworu. Jeśli nie jest ono puste - robi redirect na strona.pl/search/nazwa+utworu.html. I teraz pytanko, Można to jakoś szybciej załatwić? Sam redirect zajmuje jakieś 1-2 sekund.

-edit-
Oczywiście, są pozakładane indeksy.

Dzięki winksmiley.jpg
nrm
Cytat(matix @ 15.01.2008, 09:09:55 ) *
Myślałem, że to nie będzie aż tak uciążliwe, ale po usunięciu tej linijki, skrypt ładuje się 0.5 - 2 sekund, maksymalnie. Dziwne.

Bo nie jest; masz kosmiczne czasy wykonania; nie odpowiedziałeś na pytanie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.