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