2012-03-29 52 views
1

我们正在使用PHP,并且正在使用memcached v1.4.6进行缓存。我们正在使用来自PECL的memcache扩展memcache-2.2.6。我们使用持久连接来连接到memcached。随着密钥数量的增加,PHP memcache返回false

最近我们做了一些改变,使存储在memcached中的键的数量增加了一倍。这些按键的最大长度为75到80个字符。存储的值是整数。

每当我们尝试使用新代码时,系统在前几秒(通常少于10秒)内都能正常工作。在开始的几秒钟之后,memcache开始为每个请求返回“false”(获取,设置,增量)

如果在此阶段我们恢复到旧代码,事情再次开始正常工作。

我们的memcached服务器上的请求速率是每秒约270个请求(使用旧代码)。预计这个新代码每秒会增加超过1000个请求。

当memcache开始返回“false”时,大约15%的分配内存空闲。

什么可能导致此行为?

+0

是做什么用的命令启动memcached服务器?也许这是一个最大的内存问题,你说它什么时候开始重复虚假,只有15%的内存是空闲的,是整个操作系统内存,还是仅仅为memcached分配的内存? – capi 2012-03-29 15:25:41

+0

我们使用以下命令启动memcached服务器:'/ usr/bin/memcached -d -m 2048 -u root'。当它开始返回“false”时,分配给memcached的内存的15%是空闲的。如果我错了,请纠正我,但即使在没有空闲内存的情况下,当我们发出'set'命令时,memcached也不应该逐出旧的项目。在这种情况下,对“set”的响应不应该是“false”。谢谢。 – Nikhil 2012-03-30 03:15:10

+0

尝试使用munin或phpmemcachedadmin查看驱逐率(非常容易安装,请在我的帖子下面链接)。可能会提供更多关于memcached内部进行的信息。您也可以深入到平板并查看存储的项目及其值。作为最后的手段,尝试使用Memcached库,它有更多的运行时选项,代码类似,如果你已经有了一个包装器,可能不会有如此大的改变。 – capi 2012-03-30 11:11:43

回答

1

看起来可能是压缩或序列化问题。我会建议做更多的调试来查看确切的服务器响应。首先,尝试做一个telnet和手动设置和获取键:

telnet a.b.c.d 11211 
SET key_name 0 300 3 
123 
STORED 
GET a 
VALUE a 0 3 
123 
END 

参见:

http://code.google.com/p/memcached/wiki/NewCommandshttp://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt

的协议命令。

如果一切顺利,你可以尝试在服务器上的监视器看到正在执行的命令:

telnet a.b.c.d 11211 
STATS detail on 
//wait a while 
STATS detail off 
STATS detail dump 
//list of commands will be dumped 

您可以通过它的运行时配置php.ini调整的库位:

http://www.php.net/manual/en/memcache.ini.php

也许你可以查看PHP的Memcached(注意D)库作为替代。

而且,一个良好的监测工具:

http://code.google.com/p/phpmemcacheadmin/

+0

感谢@capi的回应。我可以使用telnet接口在memcache中设置'''get'键。 'STATS详细转储'显示了很少的命令(19),前缀是我附加到键上的。 PHP日志在同一时间内显示几千条命令。 – Nikhil 2012-03-29 09:42:05