APC PHP 缓存大小不超过 32MB,尽管设置允许更多

APC PHP 缓存大小不超过 32MB,尽管设置允许更多

我正在 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 将会增加占用率。

相关内容