我正在 CentOS 6.0 64 位上的高流量 WordPress 安装上设置 APC(v 3.1.9)。
我已经弄清楚了 APC 的许多怪癖,但有些事情仍然不太对劲。无论我更改什么设置,APC 实际上都不会缓存超过 32MB 的内容。我试图将其增加到 256 MB。32MB 是 apc.shm_size 的默认大小,所以我想知道它是否以某种方式卡在那里。
我已经运行了以下
echo '2147483648' > /proc/sys/kernel/shmmax
将系统的共享内存增加到 2G(我的 4G 盒子的一半)。然后运行
ipcs -lm
返回
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 2097152
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1
还改变了
/etc/sysctl.conf
然后跑了
sysctl -p
使设置保留在服务器上。还重新启动,以确保万无一失。
在我的 APC 设置中,我已启用 mmap(这是 APC 最新版本的默认设置)。php.ini 如下所示:
apc.stat=0
apc.shm_size="256M"
apc.max_file_size="10M"
apc.mmap_file_mask="/tmp/apc.XXXXXX"
apc.ttl="7200"
我知道 mmap 模式将忽略对 apc.shm_segments 的引用,因此我将其保留为默认值 1。
phpinfo() 指示有关 APC 的以下信息:
Version 3.1.9
APC Debugging Disabled
MMAP Support Enabled
MMAP File Mask /tmp/apc.bPS7rB
Locking type pthread mutex Locks
Serialization Support php
Revision $Revision: 308812 $
Build Date Oct 11 2011 22:55:02
Directive Local Value
apc.cache_by_default On
apc.canonicalize O
apc.coredump_unmap Off
apc.enable_cli Off
apc.enabled On On
apc.file_md5 Off
apc.file_update_protection 2
apc.filters no value
apc.gc_ttl 3600
apc.include_once_override Off
apc.lazy_classes Off
apc.lazy_functions Off
apc.max_file_size 10M
apc.mmap_file_mask /tmp/apc.bPS7rB
apc.num_files_hint 1000
apc.preload_path no value
apc.report_autofilter Off
apc.rfc1867 Off
apc.rfc1867_freq 0
apc.rfc1867_name APC_UPLOAD_PROGRESS
apc.rfc1867_prefix upload_
apc.rfc1867_ttl 3600
apc.serializer default
apc.shm_segments 1
apc.shm_size 256M
apc.slam_defense On
apc.stat Off
apc.stat_ctime Off
apc.ttl 7200
apc.use_request_time On
apc.user_entries_hint 4096
apc.user_ttl 0
apc.write_lock On
无论服务器运行多长时间(缓存大小波动并徘徊在 32MB 以下),apc.php 都会显示以下图表。
查看图片 https://i.stack.imgur.com/2bwMa.png
您可以看到,缓存正在尝试分配 256MB,但饼图中的棕色部分一直在 32MB 处被回收。这已得到证实,因为刷新 apc.php 页面显示缓存文件数上下波动(这意味着缓存未保存其所有文件)。
有人知道如何让 APC 使用超过 32 MB 的缓存大小吗?
**请注意,eaccelerator、xcache 和 APC 会发生相同的行为。我在这里读到:
http://www.litespeedtech.com/support/forum/archive/index.php/t-5072.html
suEXEC 可能会导致此问题。
答案1
这可能行不通,但除了那个 wordpress 实例之外,你有没有用其他东西测试过?你真的只有 ~32MB 的可缓存内容吗?
答案2
您的实际问题是 Apache 频繁重启,导致 APC 无法构建缓存。我不评论 wordpress 的内存大小。您使用 cPanel 吗?它有一个日志轮换功能,在日志轮换之前重新启动 Apache,虽然这是一次优雅的重启,但会清除所有 APC 缓存。您可以增加日志轮换阈值,或者查看它为什么这么快达到极限。也许您可以在 Apache 配置下(在 cPanel 中)启用 Piped Log。
此链接将告诉您如何完成这两项操作。
http://forums.cpanel.net/f5/cpanel-11-25-log-processing-145417.html
答案3
尝试提高
apc.shm_segments 1
然后看看会发生什么
答案4
APC 只会缓存正在使用的代码 - 当它有足够的内存时,唯一会从缓存中删除代码的就是 TTL。
增加 TTL 将会增加占用率。