代码之家  ›  专栏  ›  技术社区  ›  Aaron

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

  •  11
  • Aaron  · 技术社区  · 14 年前

    我已经玩了很长一段时间了,但是我有点不知所措。我在CentOs 5上使用APC 3.1.3p1和PHP5.2.5。APC同时充当操作码缓存和用户缓存。大多数情况下,该服务器使用CacheRouter模块运行drupal6站点,以支持APC缓存。我运行apc3.0.19有一段时间了,但它偶尔会导致Apache锁定(APC版本中有一个记录的bug),所以这就是我使用3.1.3p1的原因。

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

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

    • 用户缓存的填充速度相当慢。尽管最初的插入速率大约为20000次/秒,但用户缓存只会报告几百个条目,然后是几千个条目,而且增长非常缓慢。我可以把它归因于写在锁上,但我只想提一下,以防它对解决手头的问题很重要。几个小时后,它达到了一个平衡约3万个条目。

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

    在写这篇文章的时候,我的UCCFC是62358,尽管APC报告了280MB的空闲空间,但还在增长。我有一个7200的用户,但我也尝试过将其设置为0或其他数量,对这个问题几乎没有影响。

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

    有人能解释一下这个问题吗?

    2 回复  |  直到 14 年前
        1
  •  22
  •   hobodave    14 年前

    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空闲街区中 全部的

    这意味着,如果您试图存储一个比所有可用块都大的项,它将不适合,并且会发生以下两种情况之一,基于 apc.user_ttl configuration setting . 如果TTL设置为0,则会刷新整个用户缓存并插入该项。如果TTL设置为大于0,则它将刷新过期条目并插入该项。在这两种情况下,缓存已满计数都会递增。在你的案例中,有这么多的增量是一个指标,你可能是 doing it wrong .

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

    所以现在如果你想储存物品 M ,大小为4B,不能,因为最大的可用块是2B。这将触发一个缓存完全计数增量,并根据上面详细解释的用户\ttl触发完全或部分刷新。

    现在的问题是: 你的情况不好吗?

    那个 太多的空闲空间表明可能出了问题。

    • 你可能缓存太多了;只是因为缓存在那里并不意味着你应该推 我喜欢它。
    • 您可能缓存的TTL(对于一个条目)太短,低TTL意味着非空闲块被释放的频率更高。
    • 也有可能你有一些非常大的项目,你正试图存储。在100%碎片的情况下,可以保证任何项目>=5米装不下。随着你的平均免费块大小为11.6K,它越来越有可能是一个给定的项目将不适合,因为它的大小增加超过11.6K。

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

    如果不深入了解应用程序和使用模式,就不可能给出准确的诊断,但是所有这些信息都应该让您走上正确的道路。这是很有可能的,这是一个非问题,你可以让APC悄悄地做它的工作。

        2
  •  0
  •   chx    14 年前

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

    推荐文章
    Matteo Codogno  ·  使用APC和MAMP
    10 年前