2009-11-25 10 views
27

Mam jedną stronę serwera, która przesyła 200 tys. Unqiues dziennie, a ruch podwaja się mniej więcej co 40 dni (przez ostatnie 5 miesięcy).Memcache vs APC dla buforowania danych dla pojedynczego serwera

W zasadzie planuję tylko buforować dane wyjściowe funkcji mysql_query przez około godzinę. Jeśli pamięć podręczna jest starsza, uruchom zapytanie, umieść wynik z powrotem w pamięci podręcznej na kolejną godzinę.

Mój mysql DB ma około 200 MB (rośnie o około 10-20mb/miesiąc).

Robię dużo buforowania plików, pisząc wyjścia HTML i używając ich przez kilka minut, a następnie regenerując HTML.

Niestety, ponieważ jest to witryna bazy danych, która pozwala na wiele metod sortowania, wyszukiwania i zamawiania, a także stronicowania ... istnieje ponad 150 000 stron z pamięci podręcznej. Im również nie buforowanie kwerend wyszukiwania, które powodują większość obciążenia.

Chciałbym wdrożyć system buforowania i chciałem wiedzieć, który z nich jest szybszy. Chciałbym zobaczyć niektóre testy porównawcze.

+3

+1, to pytanie pomogło mi, dzięki stackoverflow. –

Odpowiedz

32

A quick Googling mówi, że APC jest 5 razy szybszy niż Memcached.

Moje doświadczenie mówi, że APC jest prawie 7-8 razy szybszy od Memcached .., ale dostęp do memchached może być uzyskiwany przez różne usługi (na przykład, jeśli działasz głównie na apache i delegujesz pewien ruch, np. Statyczne treści takie jak obrazy lub czysty html, do innej usługi internetowej, takiej jak lighttpd), która może być naprawdę przydatna, jeśli nie niezbędna.

APC ma mniej funkcji niż memcached i jest łatwy w obsłudze i optymalizacji, ale zależy to od twoich potrzeb.

+0

+1, nie zadałem nowego pytania, ponieważ byłoby to duplikatem i dziękuję @DaNieL, twoja odpowiedź jest moim rozwiązaniem. –

+0

@Imran: dziękuję za skorzystanie z funkcji wyszukiwania;) – Strae

+1

Czy możesz podać link, w którym Google to mówi? Z góry dziękuję. – Gerry

3

Jest prawie niemożliwe, aby dokładnie przewidzieć, który byłby szybszy. Przeprowadziłbym testy zarówno w środowisku programistycznym z podobnymi danymi.

Gdy wydajność ma znaczenie, zawsze używaj profilera.

+0

To jest standardowa leniwa odpowiedź. W rzeczywistości ** można ** dokładnie przewidzieć, która z nich byłaby szybsza. Zauważ, że nie jesteśmy zainteresowani tym, o ile szybciej, jesteśmy zainteresowani ** ** która jest szybsza. – Pacerier

9

Tak jak wspomniałeś, istnieje kilka różnych aspektów buforowania. I prawdopodobnie będzie koncentrować się na następujących aspektach buforowanie w aplikacji PHP:

  • opcode buforowanie który buforuje skompilowanego kodu bajtowego skryptów PHP. Możesz zobaczyć tutaj wzorzec (aczkolwiek starszy artykuł): http://itst.net/654-php-on-fire-three-opcode-caches-compared Uwaga: zdecydowanie zalecam stosowanie buforowania kodu opcode.

  • Buforowanie danych użytkownika - APC i inni to robią. Byłoby to twoje dane referencyjne lub dane, które są dość statyczne i nie zmieniają się często. Możesz wyczyścić pamięć podręczną każdego dnia lub wyzwolić czystą pamięć podręczną, gdy dane referencyjne ulegną zmianie. Jest to również zalecane, ponieważ zazwyczaj dane referencyjne są często używane i nie zmieniają się często.

  • Buforowanie zapytań sql - Wiem, że Zend ułatwia to zadanie dzięki prostej konfiguracji. Ponieważ te pytania nie zmieni to kolejna oczywista (jak wspomniałeś)

dodatkowe (jeśli to możliwe):

  • buforowania strony HTML - oczywiście buforowania strony statyczne są szybsze niż wygenerowany jeden i zazwyczaj jest to trudne, ponieważ większość stron w aplikacjach jest tak dynamiczna. Warto, jeśli możesz to zrobić, chociaż jeśli twoje zapytania są buforowane, a Twój SQL jest prosty, nie skupiałbym się na tym.

  • caching wyniki sql - osobiście trzymam się z dala od tego. Pozwolę, aby baza danych wykonała swoją pracę i to, co robi najlepiej, ponieważ DBMS zwykle ma buforowanie. Mogę buforować wyniki dla wątku wykonania (tj., Po prostu to odzyskałem, więc nie rób tego ponownie), ale nie wykraczam poza to.

Użyłem APC i eAccelerator powodzeniem (ja osobiście lubię pracować z APC i to ma opcode buforowanie i buforowanie danych użytkownika na przetwarzanie moich danych referencyjnych i zapytań SQL). Użyj XDebug, aby profilować swój kod.

+0

Nie jestem pewien, rozumiem różnicę między buforowaniem kwerend sql ... i cache wyników sql. Dlaczego nie chciałbym tego ukryć? –

+1

Buforowanie zapytań SQL polega na buforowaniu instrukcji sql (tzn. Wybrania kredytu z konta, którego id =?) - nie zmieniają się. Wyniki tego zapytania mogą wynosić 200,00 USD, ale kwota ta może ulec zmianie w zależności od rodzaju danych, z którymi masz do czynienia. Zazwyczaj zapytania są tylko "nieliczne" w porównaniu do możliwych wyników. –

+0

Oto wyjaśnienie z Doctrine (ORM) - http://www.doctrine-project.org/documentation/manual/1_0/en/caching –

7

Chcesz porównać towarowo-kluczowy sklep APC z Memcache, prawda? Ponieważ APC robi także pamięć podręczną opcode, co jest czymś innym.

Cóż, na pojedynczym komputerze pamięć podręczna kC v APC jest znacznie szybsza niż memcache. Memcache ma więcej funkcji, ale jest przeznaczony do rozproszonych środowisk, podczas gdy APC działa tylko na pojedynczych serwerach.

Zrobiłem niedawno benchmark, aby ustawić, a następnie uzyskać 1 milion kluczy w obu, każdy klucz był sekwencyjną liczbą całkowitą, a wartości były ciągiem 32-bajtowym.

Over localhost, memcache może pobrać 12k kluczy na sekundę w jednym wątku. APC zwrócił 90K/sekundę. Jednakże, jeśli używasz wielu wątków lub "multi_get" z memcache, staje się on bardzo zbliżony do wydajności APC.

Benchmark uruchomiono na 1 GB vps na slicehost.

1

Im używać IPB 3.1.4 z APC działa tylko dwa razy szybciej, niż bez niego.

Requests per second: 43.46 [#/sec] (mean) 
Requests per second: 24.23 [#/sec] (mean) 

Nie testuj IPB z memcached jeszcze

7

w moim przypadku APC jest 59 razy szybciej niż memcache

<?php 
ini_set('apc.enable_cli','1'); //if u run in cli you may need to do changes in php.ini 
error_reporting(E_ALL); 
$mem=new Memcache(); 
$mem->connect('127.0.0.1',11211); 
$mem->replace('testin','something'); 
$i=0; 
$time=time()+microtime(); 
apc_store ('testin','something'); 
$num=1000000; 
while($i<$num){ 
$mem->get('testin'); 
$i++; 
} 
echo "memcache took: ",time()+microtime()-$time," for 1 million gets","\n"; 
$time=time()+microtime(); 
$i=0; 
print_r(apc_fetch('testin')); 
while($i<$num) { 
apc_fetch('testin'); 
$i++; 
} 
echo "apc took: ",time()+microtime()-$time,"for 1 million gets \n"; 

tutaj jest wyjście

memcache took: 37.657398939133 for 1 million gets 
somethingapc took: 0.64599800109863for 1 million gets 
Powiązane problemy