Memcache против APC для кэширования данных сайта на одном сервере
У меня есть сайт с одним сервером, который выдает 200 тыс. запросов в день, и трафик удваивается примерно каждые 40 дней (в любом случае, за последние 5 месяцев).
Я в значительной степени планирую кэшировать вывод функций mysql_query только в течение часа или около того. Если кэш старше этого, запустите запрос, поместите результат обратно в кэш еще на час.
Размер моей базы данных mysql составляет около 200 Мб (увеличивается, возможно, на 10-20 Мб в месяц).
Я делаю много кэширования файлов, записывая выходные данные HTML и используя их в течение нескольких минут, а затем восстанавливаем html.
К сожалению, поскольку это сайт базы данных, который позволяет использовать множество методов сортировки, поиска и упорядочения, а также разбиения на страницы.... существует более 150 000 кэшированных страниц. Я также не кэширую поисковые запросы, которые вызывают большую часть нагрузки.
Я хотел бы внедрить систему кэширования, и я хотел бы знать, какая из них быстрее. Хотелось бы увидеть некоторые ориентиры.
6 answers
Быстрый поиск в Google говорит, что APC в 5 раз быстрее, чем Memcached.
Мой опыт говорит, что APC почти в 7-8 раз быстрее, чем Memcached.. но к memchached могут обращаться различные службы (например, если вы работаете в основном на apache и делегируете некоторый трафик, например, статическое содержимое, такое как изображения или чистый html, другому веб-сервису, например lighttpd), что может быть действительно полезным, если не незаменимым.
APC имеет меньше возможностей, чем memcached, и его легко использовать и оптимизировать, но это зависит от ваших потребностей.
Как вы упомянули, существует несколько различных аспектов кэширования. Я, вероятно, сосредоточился бы на следующих аспектах кэширования в вашем php-приложении:
Кэширование кода операции, которое кэширует скомпилированный байт-код php-скриптов. Вы можете увидеть эталон здесь (хотя и более старая статья): http://itst.net/654-php-on-fire-three-opcode-caches-compared Примечание: Я настоятельно рекомендую использовать кэширование кода операции.
Кэширование пользовательских данных - APC и другие делают это. Это было бы будьте вашими справочными данными или данными, которые достаточно статичны и не часто меняются. Вы можете очищать кэш каждый день или запускать очистку кэша при изменении этих справочных данных. Это также настоятельно рекомендуется, поскольку обычно справочные данные используются часто и не часто меняются.
Кэширование sql-запросов - я знаю, что Zend упрощает эту задачу с помощью простой настройки. Поскольку эти запросы не меняются, это еще один очевидный (как и вы упомянутый)
Дополнительные (если возможно):
Кэширование html-страниц - очевидно, что кэширование статической страницы выполняется быстрее, чем сгенерированной, и обычно это сложно сделать, поскольку большинство страниц в приложениях настолько динамичны. Стоит того, если вы можете это сделать, хотя, если ваши запросы кэшируются, а ваш SQL прост, я бы не стал заострять на этом внимание.
Кэширование результатов sql - лично я держусь подальше от этого. Я позволю базе данных выполнять свою работу и то, что она делает лучше всего, начиная с СУБД обычно имеет кэширование. Я могу кэшировать результаты для потока выполнения (т. Е. Я только что получил это, поэтому не делайте этого снова), но я не иду дальше этого.
Я успешно использовал APC и eAccelerator (лично мне нравится работать с APC, и это предполагает кэширование кода операции и кэширование пользовательских данных для моих справочных данных и запросов sql). Используйте XDebug для профилирования вашего кода.
Вы хотите сравнить хранилище ключей APC и Memcache, верно? Потому что APC также выполняет кэширование кода операции, а это совсем другое дело.
Ну, на одной машине кэш APC k-v намного быстрее, чем memcache. Memcache обладает большей функциональностью, но предназначен для распределенных сред, в то время как APC работает только на отдельных серверах.
Недавно я провел тест, чтобы установить, а затем получить 1 миллион ключей в обоих, каждый ключ был последовательным целым числом, а значения составляли 32 байта строка.
Через локальный хост memcache может извлекать 12 тыс. ключей в секунду в одном потоке. БТР возвращал скорость 90 км/сек. Однако, если вы используете многопоточность или "multi_get" с memcache, это очень близко к производительности APC.
Тест выполнялся на 1 ГБ vps в slicehost.
В моем случае 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
Почти невозможно точно предсказать, что будет быстрее. Я бы провел тесты с обоими в среде разработки с аналогичными данными.
Когда важна производительность, всегда используйте профилировщик.
Я использую IPB 3.1.4 с APC, он работает в два раза быстрее, чем без него.
Requests per second: 43.46 [#/sec] (mean)
Requests per second: 24.23 [#/sec] (mean)
Пока не тестируйте IPB с помощью memcached