为什么APC会为用户缓存增加“缓存完全计数”,即使它有足够的可用内存?

时间:2010-07-28 14:50:46

标签: php drupal caching apc

我已经玩了很长一段时间了,但是对于做什么感到有些不知所措。我在使用PHP 5.2.5的CentOs 5上使用APC 3.1.3p1。 APC充当操作码缓存和用户缓存。大多数情况下,此服务器使用CacheRouter模块运行Drupal 6站点以支持APC缓存。我正在运行APC 3.0.19一段时间,但它导致Apache偶尔锁定(在该版本的APC中记录的错误),这就是我在3.1.3p1上的原因。

我已将APC配置为512 MB内存(mmap)。

症状有点间歇性但从空缓存开始这通常是我所看到的:

  • 用户缓存填充速度相当慢。尽管初始插入速率大约为20,000次插入/秒,但用户缓存只会报告几百个,然后是几千个条目,并且增长速度非常慢。我可以将此归因于write_locking正在进行,但只是想提及它,以防它在解决手头的问题时非常重要。几个小时后,它达到约30,000个条目的平衡。

  • 碎片设置尽早并且快速增长。大约10个小时左右,我通常会100%碎片化。

  • 整体(操作码+用户)缓存使用量稳定在240MB左右。它实际上永远不会超过这个水平。大约一天后,我将开始看到用户缓存高速缓存满计数(UCCFC)递增。

在撰写本文时,我的UCCFC处于62358,尽管APC报告280MB免费,但仍在增长。我有一个7200的user_ttl,但我也把它设置为0或其他数量,它对问题几乎没有影响。

我怀疑这个问题与碎片有关。现在我的服务器正在报告“碎片:100.00%(24740片段中280.0 MBy中280.0 MB)”和280 MB正好恰好是APC报告的可用空间量;我想,这是个巧合。不幸的是,我在文档或其他地方发现了很少的信息来表明APC世界中“碎片化”究竟意味着什么,而且似乎没有什么可以做的,以避免它。

任何人都可以解释这个问题吗?

2 个答案:

答案 0 :(得分:22)

APC使用以下公式计算碎片百分比:

(total_size_of_free_blocks_lt_5M / total_size_of_all_free_blocks) * 100

* 请注意,它只将小于5M的块计为碎片。

我会将您的具体案例翻译成普通英语:

  

碎片:100.00%(24740碎片中280.0 MBytes中280.0 MB)

这意味着280M的空闲块所有中的小于5M。如果您将可用空间除以片段数,您将看到这相当于平均片段大小~11.6K。

这意味着如果您尝试存储的项目大于所有可用的块,则它将不适合,并且基于apc.user_ttl configuration setting将发生以下两种情况之一。如果TTL设置为0,则刷新整个用户缓存并插入项目。如果TTL设置为大于0,则它将刷新过期的条目并插入该项目。在这两种情况下,缓存完整计数都会增加。在您的情况下尽可能多地增加此增量表明您可能是doing it wrong

这是一个简单的可视化,显示碎片对缓存的影响。它表示一个简单的32字节高速缓存大小,每个块为1B。

[--------------------------------] (starts empty)
[A-------------------------------] (1B stored)
[ABB-----------------------------] (2B stored)
[ABBCCCC-------------------------] (4B stored)
... (time elapses)
[A--CCCC-EEE--GGGGGG-III--KKKLLLL]

所以现在如果要存储大小为4B的项目M,则不能,因为最大的可用块是2B。这会触发缓存完全计数增量,以及基于上面详细解释的user_ttl的完全或部分刷新。

现在的问题是:你的情况是不是很糟糕?

我认为可能是。 100%的缓存碎片本身并不坏。在任何正在运行的生产服务器上看到这种情况并不罕见。但是,要通过 来查看它是100%,这意味着可能出现问题。

  • 你可能会过多地缓存;仅仅因为缓存并不意味着你应该将所有内容推入其中。
  • 你可能用太短的TTL缓存(对于一个条目),低TTL意味着非自由块被更频繁地释放。
  • 您可能还有一些非常大的物品需要存放。在100%碎片时,保证任何> = 5M的项目都不适合。随着你的平均自由区块大小为11.6K,随着它的大小增加超过11.6K,一个给定的项目越来越不适合。

您可能希望尝试按大小对用户缓存进行排序,并查看最大的条目以及它们的TTL。也许他们可以增加?

如果没有在您的应用程序和使用模式中深入肘部,确实无法给出确切的诊断,但所有这些信息都应该让您走在正确的轨道上。这很可能是一个非问题,你可以让APC悄悄地做它的工作。

答案 1 :(得分:0)

http://pecl.php.net/bugs/bug.php?id=13146我认为你应该继续那里或者开一个新的错误报告。