【发布时间】: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。