2009-11-25 2 views
27

У меня есть один серверный сайт, который нажимает 200 тыс. Экз. В день, а трафик удваивается примерно каждые 40 дней (в течение последних 5 месяцев в любом случае).Memcache vs APC для кеширования данных на одном сервере

Я в значительной степени планирую кэшировать вывод функций mysql_query в течение часа или около того. Если кеш старше этого, запустите запрос, верните результат обратно в кеш в течение еще одного часа.

My mysql DB составляет около 200 МБ (увеличивается на 10-20 мб/месяц).

Im делает много кэширования файлов, записывая выходы HTML и используя их в течение нескольких минут, а затем восстанавливая html.

К сожалению, с его сайта базы данных, который позволяет использовать многие методы сортировки, поиска и упорядочения, а также разбиение на страницы .... Есть более 150 000 кешированных страниц. Im также не кэширует поисковые запросы, которые вызывают большую часть нагрузки.

Я хотел бы реализовать систему кеширования, и я хотел бы знать, какой из них быстрее. Хотелось бы увидеть некоторые ориентиры.

+3

+1, Это вопрос помог мне, спасибо stackoverflow. –

ответ

32

A quick Googling говорит, что APC в 5 раз быстрее, чем Memcached.

В моем опыте утверждается, что APC почти в 7-8 раз быстрее, чем Memcached .., но к memchached могут быть доступны различные службы (например, если вы запускаете главным образом apache и делегируете некоторый трафик, например статическое содержимое, например изображения или чистый html, к другому веб-сервису, например lighttpd), который может быть действительно полезен, если не незаменим.

У APC есть меньше возможностей, чем memcached, и их легко использовать и оптимизировать, но это зависит от ваших потребностей.

+0

+1, я не спросил новый вопрос, потому что это будет дубликат и спасибо @DaNieL, ваш ответ - мое решение. –

+0

@Imran: спасибо за использование функции поиска;) – Strae

+1

Можете ли вы предоставить ссылку, где Google это говорит? Заранее спасибо. – Gerry

3

Практически невозможно точно предсказать, что будет быстрее. Я бы запускал тесты как в среде разработки с аналогичными данными.

Когда производительность важна, всегда используйте профилировщик.

+0

Это стандартный ленивый ответ. На самом деле ** возможно точно предсказать, что будет быстрее. Обратите внимание, что нас не интересует, насколько быстрее нас интересует **, который ** быстрее. – Pacerier

9

Как вы упомянули, существует несколько различных аспектов кеширования. Я, вероятно, будет сосредоточена на следующих аспектах кэширования в вашем PHP приложение:

  • кэширование опкод, который кэширует скомпилированный байт-код PHP скриптов. Здесь вы можете ознакомиться с эталоном (хотя и с более старой статьей): http://itst.net/654-php-on-fire-three-opcode-caches-compared Примечание. Я настоятельно рекомендую использовать кеширование кода операции.

  • Кэширование пользовательских данных - APC и другие делают это. Это будут ваши справочные данные или данные, которые являются довольно статичными и не меняются часто. Вы можете очищать кеш каждый день или запускать чистый кеш при изменении этих эталонных данных. Это также настоятельно рекомендуется, поскольку обычно ссылочные данные используются часто и часто не меняются.

  • Кэширование запросов sql - Я знаю, что Zend упрощает эту задачу с простой настройки. Так как эти запросы не меняют это еще один очевидный (как вы упомянули)

Дополнительно (если это возможно):

  • кэширования страниц HTML - очевидно, кэширование статической страницы быстрее, чем и обычно это трудно сделать, поскольку большинство страниц в приложениях настолько динамичны. Стоит это сделать, если вы можете это сделать, хотя если ваши запросы кэшируются и ваш SQL-код прост, я бы не сосредоточился на этом.

  • Результаты кеширования sql - лично я держусь подальше от этого. Я позволю базе данных выполнять свою работу и что она делает лучше всего, поскольку СУБД обычно имеет кеширование. Я могу кэшировать результаты для потока выполнения (т. Е. Я только что получил это, так что не делайте этого снова), но я не пойду намного дальше этого.

Я использовал APC и Eaccelerator успешно (лично я люблю работать с APC и предполагался кэширование опкода и кэширование данных пользователя для моих справочных данных и SQL запросов). Используйте XDebug для описания вашего кода.

+0

Я не уверен, что понимаю разницу между кешированием запросов sql ... и кэшированием результата sql. Почему я не хочу его кэшировать? – 2009-11-25 03:38:59

+1

Кэширование запросов Sql кэширует операторы sql (т. Е. Выбирает кредит из учетной записи, где id =?) - они не меняются. Результаты этого запроса могут составлять 200,00 долларов США, но эта сумма может измениться в зависимости от типа данных, с которыми вы имеете дело. Как правило, запросы являются «немногими» по сравнению с возможными результатами. –

+0

Вот объяснение от Доктрины (ORM) - http://www.doctrine-project.org/documentation/manual/1_0/en/caching –

7

Вы хотите сравнить хранилище ключей ключей APC против Memcache? Поскольку APC также выполняет кеширование операций, это совсем другое.

Ну, на одной машине кэш-память APC k-v работает быстрее, чем memcache. Memcache имеет больше функциональности, но предназначен для распределенных сред, в то время как APC работает только на одном сервере.

В последнее время я сделал бенчмарк, чтобы установить, а затем получить 1 миллион ключей в каждой из них, каждая клавиша была последовательным целым числом, а значения были 32-байтной строкой.

С помощью локального хоста memcache может извлекать 12k ключей в секунду в одном потоке. APC вернул 90K/секунду. Однако, если вы используете многопоточность или «multi_get» с memcache, он очень близок к производительности APC.

Эталонный тест работает на 1GB vps на slicehost.

1

Im use IPB 3.1.4 с APC работает просто в два раза быстрее, чем без него.

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

Не испытывай IPB с Memcached еще

7

в моем случае АРС 59 раз быстрее, чем 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"; 

здесь выход

memcache took: 37.657398939133 for 1 million gets 
somethingapc took: 0.64599800109863for 1 million gets 
Смежные вопросы