【问题标题】:PHP memcache returns false with increase in number of keysPHP memcache 随着键数的增加返回 false
【发布时间】:2012-04-12 18:58:01
【问题描述】:

我们正在使用 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% 的已分配内存是空闲的。

什么可能导致这种行为?

【问题讨论】:

  • 启动memcached服务器的命令是什么?也许这是一个最大内存问题,你说当它开始返回 false 时,只有 15% 的可用内存,是整个 OS 内存,还是只是分配给 memcached 的内存?
  • 我们使用以下命令启动 memcached 服务器:/usr/bin/memcached -d -m 2048 -u root。当它开始返回“false”时,分配给 memcached 的内存中有 15% 是空闲的。如果我错了,请纠正我,但即使没有可用内存,当我们发出 set 命令时,memcached 也不应该驱逐旧项目。在这种情况下,对set 的响应不应为“假”。谢谢。
  • 尝试使用 munin 或 phpmemcachedadmin(真的很容易安装,链接在我下面的帖子中)查看驱逐率。可能会提供有关 memcached 内部情况的更多信息。您还可以向下钻取到平板并查看存储了哪些项目及其值。作为最后的手段,尝试使用 Memcached 库,它有更多的运行时选项,并且代码相似,如果你已经有一个包装器,可能不会有那么大的变化。
  • 我已经安装了phpmemcachedadmin。感谢您向我介绍这个工具。事实证明,livebookmark.net/journal/2008/05/21/… 中显示的空闲内存实际上是浪费的内存。此外,分配给具有较大块大小的slab 的页面过多,导致前几个slab 类中的驱逐过多。虽然我仍然无法理解为什么 set 命令在我的情况下返回 false。我将尝试使用 PECL 的 Memcached 库。
  • 将 memcached 服务器线程增加到 8 个(默认为 4 个)解决了这个问题。 set 命令不再返回 false。

标签: php memcached


【解决方案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/

【讨论】:

  • 感谢@capi 的回复。我可以使用 telnet 接口在内存缓存中 set/get 键。 STATS detail dump 显示了非常少量的命令 (19),其前缀是我附加到键上的。 PHP 日志同时显示几千条命令。
猜你喜欢
  • 2011-03-13
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 2014-03-18
相关资源
最近更新 更多