我们正在使用PHP并使用memcached v1.4.6进行缓存。我们正在使用PECL的memcache扩展memcache-2.2.6。我们使用持久连接来连接到memcached。
最近我们进行了一些更改,使memcached中存储的密钥数量增加了一倍。这些键最长为75到80个字符。存储的值是整数。
每当我们尝试使用新代码时,系统在前几秒(通常少于10秒)内正常工作。在最初的几秒钟之后,memcache开始为每个请求(get,set,increment)返回“false”
如果在这个阶段我们恢复旧代码,事情就会再次开始正常工作。
我们的memcached服务器上的请求率大约是每秒270个请求(使用旧代码)。预计新代码将增加到每秒1000多个请求。
当memcache开始返回“false”时,大约15%的已分配内存是空闲的。
可能导致此行为的原因是什么?
答案 0 :(得分:2)
看起来它可能是压缩或序列化问题。我建议做更多的调试,看看确切的服务器响应。首先,尝试使用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/NewCommands http://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)库作为替代。
另外,一个好的监控工具: