Я настроил Memcached и настроил его для работы с vBulletin 4.1.5 на 32-битном Linode VPS Gentoo Linux. Memcached запущен, includes/config.php
настроен на использование кэша памяти, а сайт загружается и работает нормально; однако Memcached, по-видимому, не кэширует или, по крайней мере, кеширует очень хорошо. Все службы, Apache, MySQL и Memcached работают на одном сервере:
# for service in apache2 memcached mysql; do service $service status; done
* status: started
* status: started
* status: started
См. Ниже вывод psmem показывает низкое использование памяти:
$ psmem | grep memcached
928.0 KB + 27.0 KB = 955.0 KB memcached
Ниже includes/config.php
раздел конфигурации DataStore:
$ grep DATASTORE config.php -A16
// ****** DATASTORE CACHE CONFIGURATION *****
// Here you can configure different methods for caching datastore items.
// vB_Datastore_Filecache - for using a cache file
//$config['Datastore']['class'] = 'vB_Datastore_Filecache';
// vB_Datastore_Memcached - for using a Memcache server
// It is also necessary to specify the hostname or IP address and the port the server is listening on
$config['Datastore']['class'] = 'vB_Datastore_Memcached';
$i = 0;
// First Server
$i++;
$config['Misc']['memcacheserver'][$i] = '127.0.0.1';
$config['Misc']['memcacheport'][$i] = 11211;
$config['Misc']['memcachepersistent'][$i] = true;
$config['Misc']['memcacheweight'][$i] = 1;
$config['Misc']['memcachetimeout'][$i] = 1;
$config['Misc']['memcacheretry_interval'][$i] = 15;
В memcache.ini
конфигурация в /etc/php/apache2-php5.3/ext-active/memcache.ini
, который является symlink
к /etc/php/apache2-php5.3/ext/memcache.ini
:
/etc/php/apache2-php5.3/ext-active $ cat memcache.ini
extension=memcache.so
memcache.allow_failover=false
memcache.max_failover_attempts=20
memcache.chunk_size=32768
memcache.default_port=11211
memcache.hash_strategy=consistent
memcache.hash_function=crc32
memcache.redundancy=1
memcache.session_redundancy=2
memcache.protocol=ascii
И, наконец, вывод сценария Perl, написанного (не мной) для передачи данных в Cacti для построения графиков, но его также можно использовать вручную:
$ perl memcached.pl localhost
total_items:898515 get_hits:20219203 uptime:3376080 cmd_get:23939667 time:1312170243 bytes:97280 curr_connections:35 connection_structures:55 bytes_written:102512934173 limit_maxbytes:67108864 cmd_set:1986754 curr_items:35 rusage_user:120.625662 get_misses:3720464 rusage_system:624.975989 bytes_read:3518914943 total_connections:28161
Этот последний вывод выглядит так, как будто он кэшируется, но, как сообщалось ранее, он даже не использует 1 МБ памяти.
Я что-нибудь упускаю? Что еще я должен проверить? Если все в порядке с Memcached или связанной с ним конфигурацией расширения PHP, то это должна быть проблема vBulletin, когда он не использует кеш активно, как должен.
Идеи? Вопросы? Я несколько месяцев пытался заставить это работать.
Также запустил и сравнил скрипт Perl с echo "stats" | nc -w 1 localhost 11211
, как предлагается:
$ perl memcached.pl localhost | cut -d" " -f1 ; awk -F"STAT " '/total_items/{print $2}' <(echo "stats" | nc -w 1 localhost 11211)
total_items:923792
total_items 923792
Нашел решение - memcached слушал 0.0.0.0; увидел немедленное значительное увеличение использования памяти после перехода на 127.0.0.1 и перезапуска, которое продолжает расти:
$ ps u -C memcached
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
103 27999 0.0 2.3 62196 18288 ? Ssl 16:30 0:00 /usr/bin/memcached -d -p 11211 -U 11211 -l 127.0.0.1 -m 64 -c 1024
Учитывая, что простой процесс memcached использует более 1 МБ памяти, я бы сказал, что psmem
говорит свинины. И, учитывая, что в верхней части скрипта явно указано, что он смотрит на ОЗУ использование, а не объем памяти использования, я бы сказал, что то, что вы думаете, происходит не так. С другой стороны, сейчас в кеше 35 элементов, вы точно не рвете там вещи.
Что касается того, почему vBulletin не использует его, я не знаю; До сих пор я успешно избегал этой кучи, и я вполне счастлив, что так и будет. Есть лучшие способы проверить, работает ли он, чем то, что вы использовали до сих пор (tcpdump -i lo port 11211
и strace -etrace=network
сразу приходит в голову), но вам, возможно, придется воспользоваться их хваленой поддержкой, если она на самом деле не делает то, что вы хотите.