Назад | Перейти на главную страницу

Почему Memcached не работает с vBulletin?

Я настроил 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 сразу приходит в голову), но вам, возможно, придется воспользоваться их хваленой поддержкой, если она на самом деле не делает то, что вы хотите.