我在 CentOS 5.5 上运行一个使用 APC 和 W3TC 的 Wordpress 网站,每天的页面浏览量约为 10000 次(包括 ajax 和 WP-Admin)。该服务器是低级 VPS,最大内存为 376MB。
最近我开始遇到一些服务器崩溃的情况,现在我可以将其归咎于 APC(我禁用它一段时间后崩溃就停止了)。
重新安装并查看 APC 图表后,我发现启动 PHP-FPM 几秒钟后就出现了很多碎片。在某些情况下,几分钟内就会出现 100% 的碎片。
当前缓存大小为 40MB,由于服务器的内存限制,我不太愿意增加它。
我已经将缓存的 ttl 设置为 2 小时,但考虑到发生的碎片量,我担心这个时间可能太长了,但是如果我将其设置得太短,则会破坏缓存的整个目的。
我还注意到,当将 userttl 设置为高于 0 时,调用某些 require/include/require_once/include_once 函数时会出现大量错误。
任何帮助将不胜感激。
答案1
如果您按照 W3 Total Cache 安装说明中的建议运行 APC 3.0.6,您的potential cache slam avoided errors
日志可能会很快被填满。
卸载 APC 并使用版本 3.1.7(3.1.9 是当前稳定版本)重建,该版本修复了缓存漏洞,并且许多其他问题。
运行最新的 PHP 5.3.6 时您还将获得更好的结果,每个版本与 APC 的交互都会变得更好(当 PHP 6 发布时它们将完全集成)。
还要查看您的配置文件和 apc.slam_defense 设置并将其提高到 30 或 40 左右。
为了真正提高性能,请将 apc.stat 设置为 0,这样就可以省去检查文件新版本的过程。如果您对网站进行了大量更改,这些更改将不会更新,直到缓存过期。(我的用户会感到沮丧,所以我不得不将其设置为 1)
将 apc.slam_defense 设置为 75 意味着进程有 75% 的机会不会缓存未缓存的文件。因此,设置值越高,对缓存攻击的防御能力就越强。将其设置为 0 可禁用此功能。
降低 apc.user_ttl(W3 Total Cache 使用的)的值,它是更动态的内容。保持 apc.ttl 的值较高,因为这些文件是您的 WordPress 核心文件和主题文件,您实际上并不会更改它们。
我假设您将 W3 中的对象和数据库缓存设置为 APC。对于您的服务器大小,我会将页面缓存设置为磁盘增强。另外请记住,您可以在 W3 中为动态内容设置 ttl。
这是我在一台配备 12G 内存的专用服务器上运行的相当大的 WordPress Multisite。即使内存有限,也不要害怕增加缓存大小。如果需要,您可以随时调低缓存大小。我的缓存设置为 512M,但它使用的缓存从未超过 120M。
; configuration for php apc module
extension = apc.so
apc.enabled = 1
apc.shm_segments = 1
apc.shm_size = 512M
apc.optimization = 0
apc.num_files_hint = 2700
apc.user_entries_hint = 2700
apc.ttl = 7200
apc.user_ttl = 3600
apc.gc_ttl = 600
apc.cache_by_default = 1
apc.slam_defense = 1
apc.use_request_time = 1
apc.mmap_file_mask = /dev/zero
apc.file_update_protection = 2
apc.enable_cli = 0
apc.max_file_size = 2M
apc.stat = 1
apc.write_lock = 1
apc.report_autofilter = 0
apc.include_once_override = 0
apc.rfc1867 = 0
apc.rfc1867_prefix = "upload_"
apc.rfc1867_name = "APC_UPLOAD_PROGRESS"
apc.rfc1867_freq = 0
apc.localcache = 1
apc.localcache.size = 1350
apc.coredump_unmap = 0
apc.stat_ctime = 0
答案2
您的“缓存已满计数”是否很高?听起来您需要增加 php.ini 中 apc.shm_size 的大小,以减少从缓存中删除的缓存项目。不过,令人失望的是,这会导致稳定性问题...