我们正在使用 PHP 并使用 memcached v1.4.6 进行缓存。我们使用 PECL 的 memcache 扩展 memcache-2.2.6。我们正在使用持久连接来连接到 memcached。
最近我们进行了一些更改,使存储在 memcached 中的 key 数量增加了一倍。这些 key 的长度最多为 75 到 80 个字符。存储的值是整数。
每当我们尝试使用新代码时,系统在最初几秒钟(通常不到 10 秒)都运行良好。在最初的几秒钟之后,memcache 开始为每个请求(获取、设置、增量)返回“false”
如果在这个阶段我们恢复到旧代码,事情就会再次开始正常工作。
我们的 memcached 服务器上的请求率约为每秒 270 个请求(使用旧代码)。使用新代码,预计每秒处理的请求数将超过 1000 个。
当 memcache 开始返回“false”时,大约 15% 的已分配内存是空闲的。
什么可能导致此行为?
最佳答案
看起来可能是压缩或序列化问题。我建议进行更多调试以查看确切的服务器响应。首先,尝试进行 telnet 并手动设置和获取 key :
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
用于协议(protocol)命令。
如果一切顺利,您可以尝试在服务器上使用监视器来查看正在执行的命令:
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)库作为替代方案。
另外,一个很好的监控工具:
关于PHP memcache 随着键数量的增加返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9920132/