11

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

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

症状有点断断续续,但从空缓存开始,这通常是我所看到的:

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

  • 碎片化很早就开始并迅速发展。在大约 10 个小时内,我通常处于 100% 的碎片化状态。

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

在撰写本文时,我的 UCCFC 为 62358,并且还在增长,尽管 APC 报告有 280MB 可用空间。我有一个 7200 的 user_ttl,但我也尝试将其设置为 0 或其他数量,它对问题几乎没有影响。

我怀疑这个问题与碎片有关。现在我的服务器正在报告“碎片:100.00%(24740 个碎片中的 280.0 MB 中的 280.0 MB)”,而 280 MB 恰好是 APC 报告的可用空间量;我认为这是一个巧合。不幸的是,我在文档或其他地方发现了很少的信息来说明“碎片化”在 APC 世界中的真正含义,而且您似乎几乎无法采取任何措施来避免它。

任何人都可以阐明这个问题吗?

4

2 回答 2

23

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

(total_size_of_free_blocks_lt_5M / total_size_of_all_free_blocks) * 100

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

我会将您的具体案例翻译成简单的英语:

碎片:100.00%(24740 个碎片中的 280.0 MB 中的 280.0 MB)

这意味着在您的 280M 空闲块,它们都小于 5M。如果您将可用空间除以片段数,您会发现这相当于平均片段大小约为 11.6K。

这意味着如果您尝试存储大于所有可用块的项目,它将不适合,并且会根据apc.user_ttl 配置设置发生两种情况之一。如果 TTL 设置为 0,则刷新整个用户缓存并插入项目。如果 TTL 设置为大于 0,那么它将刷新过期条目并插入项目。在这两种情况下,缓存满计数都会增加。与您的情况一样多的增量表明您可能做错了

这是一个简单的可视化,展示了随着时间的推移碎片对缓存的影响。它表示一个简单的 32 Byte 缓存大小,每个块为 1B。

[--------------------------------](开始为空)
[A-------------------------------------------] (1B 已存储)
[ABB--------------](2B存储)
[ABBCCCC-------------](4B存储)
...(时间流逝)
[A--CCCC-EEE--GGGGGG-III--KKKLLLL]

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

现在的问题是:这对你来说很糟糕吗?

我想可能是这样。100% 的缓存碎片本身并不坏。在任何运行的生产服务器上看到这种情况并不少见。但是,在有这么多可用空间的情况下看到它 100%表明可能有问题。

  • 你可能缓存太多了;仅仅因为缓存在那里并不意味着你应该把所有东西都塞进去。
  • 您可能缓存的 TTL 太短(对于条目),低 TTL 意味着非空闲块被更频繁地释放。
  • 您也可能有一些非常大的物品要存储。在 100% 碎片化的情况下,可以保证任何 >= 5M 的项目都不适合。由于您的平均空闲块大小为 11.6K,随着它的大小增加到超过 11.6K,给定项目越来越有可能不适合。

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

如果不深入了解您的应用程序和使用模式,实际上不可能给出准确的诊断,但所有这些信息都应该让您走上正确的轨道。这很可能不是问题,您可以让 APC 安静地完成它的工作。

于 2010-08-07T00:23:28.193 回答
0

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

于 2010-08-06T04:57:56.037 回答