Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][Cache] Strona 10 k uniqów + potężny dedyk + cache = zamulanie ?
matix
post
Post #1





Grupa: Zarejestrowani
Postów: 278
Pomógł: 10
Dołączył: 13.02.2007
Skąd: Rybnik

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
qrees
post
Post #2





Grupa: Zarejestrowani
Postów: 275
Pomógł: 44
Dołączył: 23.11.2007

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
matix
post
Post #3





Grupa: Zarejestrowani
Postów: 278
Pomógł: 10
Dołączył: 13.02.2007
Skąd: Rybnik

Ostrzeżenie: (0%)
-----


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....
Go to the top of the page
+Quote Post
nrm
post
Post #4





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

Ostrzeżenie: (0%)
-----


to coś podejrzanie wygląda. na pewno masz pozakładane indexy na te pola?
Go to the top of the page
+Quote Post
matix
post
Post #5





Grupa: Zarejestrowani
Postów: 278
Pomógł: 10
Dołączył: 13.02.2007
Skąd: Rybnik

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował matix 15.01.2008, 14:27:24
Go to the top of the page
+Quote Post
nrm
post
Post #6





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 08:10