Memcache против APC для кэширования данных сайта на одном сервере


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

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

Размер моей базы данных mysql составляет около 200 Мб (увеличивается, возможно, на 10-20 Мб в месяц).

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

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

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

Author: Pacerier, 2009-11-25

6 answers

Быстрый поиск в Google говорит, что APC в 5 раз быстрее, чем Memcached.

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

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

 34
Author: Strae, 2015-01-19 10:11:47

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

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

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

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

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

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

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

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

 9
Author: Arthur Frankel, 2009-11-25 03:33:30

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

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

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

Через локальный хост memcache может извлекать 12 тыс. ключей в секунду в одном потоке. БТР возвращал скорость 90 км/сек. Однако, если вы используете многопоточность или "multi_get" с memcache, это очень близко к производительности APC.

Тест выполнялся на 1 ГБ vps в slicehost.

 8
Author: Diego, 2009-11-26 11:27:43

В моем случае apc в 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
 8
Author: khizar ansari, 2012-04-11 12:57:09

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

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

 3
Author: Ben S, 2009-11-25 03:00:24

Я использую IPB 3.1.4 с APC, он работает в два раза быстрее, чем без него.

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

Пока не тестируйте IPB с помощью memcached

 1
Author: derevo, 2011-03-12 04:44:12