我想进一步优化 APC,但我不确定我可以在哪里做。首先,这是使用当前配置运行一周后的屏幕截图:
我现在有以下几点不确定:
- 我是否正确地看到碎片的发生是因为缓存也被用作用户缓存?
- 为什么我总共分配了 192MB,碎片栏却显示 100% 只有 5.8MB?
- “内存使用情况”下的圆圈没有完全闭合,这只是渲染问题吗?因为下面的 MB 值确实加起来了。(也就是说,重启后圆圈看起来不错,但当缓存变得越来越碎片化时,它就会变成这样。)
- 由于命中率确实很高,我不确定碎片化是否是一个大问题。你认为我还能优化它吗?
我最感兴趣的是这些问题的答案。只有这样我才能更好地理解 APC 并自己做出调整。
一些详细信息:此服务器上正在运行 Drupal 和 Magento。Drupal 也将其用作用户缓存。
现在我的问题是如何优化它。我可以分配更多的内存,但我不确定这是否真的有很大帮助。
更新:配置如下:
; The size of each shared memory segment in MB.
apc.shm_size = 192M
; Prevent files larger than this value from getting cached. Defaults to 1M.
apc.max_file_size = 2M
; The number of seconds a cache entry is allowed to idle in a slot in case
; this cache entry slot is needed by another entry.
apc.ttl = 3600
正如您所见,目前它还非常小。
答案1
我是否正确地看到碎片的发生是因为缓存也被用作用户缓存?
不,当文件的操作码缓存大小发生变化时,就会发生碎片,并且它将无法放入它之前占据的“切片”中 - 在底层它有点复杂,但这就是要点。
为什么我总共分配了 192MB,碎片栏却显示 100% 只有 5.8MB?
它会告诉您 100% 的答案,因为在您的空闲可用缓存空间中,100% 都与碎片有关(这意味着该“切片”的进入门槛必须落在碎片大小范围内)。
“内存使用情况”下的圆圈没有完全关闭只是一个渲染问题吗?
是的,不要相信它;打印在切片内的值有时也是不正确的。
由于命中率确实很高,我不确定碎片化是否是一个大问题。你认为我还能优化它吗?
当然!我会增加缓存。您可以分配 100MB,并缓存 10MB,并且仍然有 100% 的命中率。
一个成功的设置应该有很少的修剪(AKA:很少甚至没有 gc)-并且有扩展的空间,你想一点额外的空间;(超过 5MB)因为碎片的影响会使想要进入缓存的内容“复杂化”。
争取 10% 的空闲、无碎片空间,继续监控并增加大小。另外要知道,推送大量新代码文件也会对缓存产生影响。
答案2
关于问题 3,
我无法确切地告诉您为什么圆圈没有完全闭合,但对于我的设置来说,经过几天的正常运行和 10% 的碎片化后,它看起来是一样的。
2,
我认为这是 APC 统计页面的一个故障,我的页面显示“10.34%(89 个碎片中的 771.7 KB,总共 7.3 MB)”,其中 7.3 MB 正是根据内存使用情况统计应该空闲的内存量。
如果您查看屏幕截图,您会注意到它看起来在
5.8 个碎片和 5.8 个空闲内存中执行了相同的操作,因此要么碎片是以某种方式根据空闲内存计算的,要么数字就是错误的。
请参阅我的屏幕截图进行比较:
答案3
您应该查看“缓存完整计数”计数器,>1 表示您用完了 APC 内存,在这种情况下,您在 3 天内用完了 39 次,这似乎很多。
与使用 php 文件缓存相比,使用用户缓存更有可能导致这种碎片,因为它倾向于缓存许多不同的小对象,这些对象最终占用内存只是为了引用它们的存在。
我要做的第一件事是尝试增加分配的 APC 内存(安全起见,2Go 不应该是解决方案),直到不再发生“缓存已满计数”,然后我会专注于推送到用户缓存中的对象数量。
如果您可以限制它们的数量(而不是它们的大小),那就太好了,但您可以探索不同的可能性,例如使用 memcache 来存储该用户缓存并将 APC 专用于文件缓存。
发布您当前的 APC 配置将会很有帮助,因为我们可以查看 TTL 值,这在这种情况下也可能很重要。