Ускоряем Memcache на MODX | используем сокеты

  • Website-With-Memcached

Не так давно мы с вами рассмотрели переход с файлового кэшера на Memcache - кэш в оперативной памяти сервера.
Выяснили основные плюсы и достоинства Memcache. А сегодня нам бы хотелось протестировать Memcache на скорость.

Для теста напишем небольшой сниппет работающий с Memcache

<?php
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211) or die ("Невозможно подключится к Memcache");
$time_start = microtime(true);
for($i=0;$i<100000;$i++) {
        $memcache->set('key'.$i, 'Идет тест', false, 3600) or die ("Ошибка");
	}
echo "запись в Memcache: " . ( microtime(true) - $time_start ) . " секундn";
$time_start = microtime(true);
for($i=0;$i<100000;$i++) {
	$get_result = $memcache->get('key' . $i);
	}
echo "Чтение из Memcache: " . ( microtime(true) - $time_start ) . " секундn"; 
$memcache->close();

Если вы хотите протестировать Memcache самостоятельно, то создайте новый ресурс в MODX с шаблоном blank и вставьте в него вызов сниппета.

Данный код работает очень просто - сначала осуществляем подключение к Memcache, затем в цикле осуществляем сначала запись в память, затем так же в цикле осуществляем чтение из Memcache.

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

Для примера возьмем число итераций равное 111 111, и проведем несколько тестов.

111111 итераций, с очисткой памяти Memcache после каждого прохода

запись в Memcache: 5.1345769669215 секунд Чтение из Memcache: 5.3886164413026 секунд
запись в Memcache: 5.5943962020726 секунд Чтение из Memcache: 5.3586417958052 секунд
запись в Memcache: 5.6189812990991 секунд Чтение из Memcache: 5.2803705906434 секунд
запись в Memcache: 5.2101464674762 секунд Чтение из Memcache: 5.1956431269476 секунд

111111 итераций, без очистки памяти Memcache после каждого прохода

запись в Memcache: 6.1699699475322 секунд Чтение из Memcache: 6.1214721469473 секунд
запись в Memcache: 6.6536350352356 секунд Чтение из Memcache: 6.3525052302379 секунд
запись в Memcache: 5.9345752968901 секунд Чтение из Memcache: 6.0926526395230 секунд
запись в Memcache: 7.1235764676534 секунд Чтение из Memcache: 6.6782387952101 секунд

Достаточно неплохие результаты по сравнению с файловым кэшем.

Давайте посмотрим на настройки демона Memcache

Настройки демона Memcache хранятся в файле Memcache в папке etc/sysconfig

PORT="11211"
USER="memcache"
MAXCONN="64"
CACHESIZE="64"
OPTIONS=""

то есть по умолчанию Memcache использует tcp соединение и использует 64 mb памяти.
Вы можете увеличить объём памяти под кэш и число одновременных соединений.

В данный момент нас интересует протокол подключения. Все вы наверно слышали про сокеты?
И то, что сокеты позволяют осуществлять доступ к демону намного быстрее.

Какие же результаты будут, если перевести Memcache на работу через unix сокеты?

Так давайте попробуем!

перевод Memcache на сокеты

Нужно изменить параметр OPTIONS, приведем его к такому виду

OPTIONS="-a 0777 -s /var/run/memcache/mem.socket"

сохраним настройки и перезапустим Memcache

service memcache restart

Теперь Memcache работает через сокеты, но еще нужно научить систему MODX работать через сокеты. Стандартный обработчик для Memcache - cache.xPDOMemCache работает через TCP

$this->getOption('memcached_server', $options, 'localhost:11211')));

заменим на

$this->memcache->addServer('unix:///var/run/memcache/mem.socket', 0);

Теперь MODX умеет работать с Memcache через сокеты, вы можете оставить эти изменения в cache.xPDOMemCache, либо же создать свой новый обработчик кэша внеся туда необходимые изменения.

Теперь мы готовы провести следующий тест Memcache на MODX через сокеты.

Тест Memcache на MODX через сокеты

Немножко изменим наш сниппет для тестирования через сокеты

<?php
$memcache = new Memcache; 
$memcache->connect('unix:///var/run/memcache/mem.socket', 0) or die ("Невозможно подключится к Memcache");
$time_start = microtime(true);
for($i=0;$i<111111;$i++) {
        $memcache->set('key'.$i, 'Идет тест', false, 3600) or die ("Ошибка");
	}
echo "запись в Memcache: " . ( microtime(true) - $time_start ) . " секундn";
$time_start = microtime(true);
for($i=0;$i<111111;$i++) {
	$get_result = $memcache->get('key' . $i);
	}
echo "Чтение из Memcache: " . ( microtime(true) - $time_start ) . " секундn"; 
$memcache->close();

111111 итераций, с очисткой памяти Memcache после каждого прохода

запись в Memcache: 5.5304132781356 секунд Чтение из Memcache: 5.2098324743287 секунд
запись в Memcache: 5.2041281248981 секунд Чтение из Memcache: 4.4987234792332 секунд
запись в Memcache: 5.0042140981280 секунд Чтение из Memcache: 4.3412412894179 секунд
запись в Memcache: 4.9041287987284 секунд Чтение из Memcache: 4.2094381867531 секунд

111111 итераций, без очистки памяти Memcache после каждого прохода

запись в Memcache: 4.3299930095673 секунд Чтение из Memcache: 3.7617750167847 секунд
запись в Memcache: 4.4633438587189 секунд Чтение из Memcache: 4.2189130783081 секунд
запись в Memcache: 4.2318580150604 секунд Чтение из Memcache: 3.9428331375122 секунд
запись в Memcache: 4.4526081085205 секунд Чтение из Memcache: 3.9776089191437 секунд

Цифры говорят сами за себя, явное преимущество в быстродействии при работе Memcache через сокеты.
Таким несложным образом мы провели маленькую оптимизацию Memcache для работы через сокеты, что позволит вашим сайтам на MODX быть еще быстрее.

 


Комментарии