为什么 Memcached 不能与 vBulletin 一起使用?

为什么 Memcached 不能与 vBulletin 一起使用?

我已经配置并设置了 Memcached,使其可以在 Gentoo Linux 32 位 Linode VPS 上与 vBulletin 4.1.5 配合使用。Memcached 已启动,includes/config.php配置为使用 memcache,并且站点确实加载并正常运行;但是,Memcached 似乎没有缓存,或者至少缓存得不是很好。所有服务(Apache、MySQL 和 Memcached)都在同一台服务器上运行:

# for service in apache2 memcached mysql; do service $service status; done
 * status: started
 * status: started
 * status: started

参见下面的输出内存显示内存使用率低:

 $ psmem | grep memcached
     928.0 KB +   27.0 KB =  955.0 KB   memcached

下面是includes/config.phpDataStore 配置部分:

$ 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.inisymlink/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 MB 的存储空间。

我是否遗漏了什么?我还应该检查什么?如果 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

答案1

找到了解决方案 - 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

答案2

鉴于裸 memcached 进程使用超过 1MB 的内存,我认为这psmem是骗人的。而且,鉴于脚本顶部明确指出它查看内存使用,不是记忆使用情况,我认为您认为的情况并非如此。另一方面,缓存中目前有 35 个项目,您并没有真正破坏那里的东西。

至于为什么 vBulletin 不使用它,我不知道;到目前为止,我已经成功避免了这种堆积,而且我很高兴保持这种状态。有比你迄今为止使用的方法更好的方法来验证它是否有效(tcpdump -i lo port 11211并且strace -etrace=network立即浮现在脑海中),但如果它实际上没有按照你想要的方式工作,你可能不得不利用他们备受吹捧的支持。

相关内容