简体   繁体   English

APC缓存碎片问题

[英]APC cache fragmentation problem

I'm running APC (php cache) on a medium website (13 000 visits a day) on a CentOS server 5 running php 5.3.3 with APC 3.1.4 with 4Gb of RAM. 我在运行php 5.3.3的CentOS服务器5上运行APC(php缓存)在一个中型网站上(每天13000次访问),APC 3.1.4和4Gb的RAM。 In the last weeks I'm experiencing many " unable to allocate memory for pool " errors in logs, and often the site goes down. 在过去的几周里,我遇到了很多“ unable to allocate memory for pool ”错误,并且网站经常出现故障。

I think the problem is in APC. 我认为问题出在APC。 From the stats I see that the cache is full after an hour or two, and the fragmentation always jumps to 100%. 从统计数据中我看到缓存在一两个小时后已满,并且碎片总是跳到100%。 This are my config settings of apc.ini: 这是我的apc.ini配置设置:

apc.cache_by_default    1
apc.canonicalize    0
apc.coredump_unmap  0
apc.enable_cli  0
apc.enabled 1
apc.file_md5    0
apc.file_update_protection  2
apc.filters 
apc.gc_ttl  3600
apc.include_once_override   0
apc.lazy_classes    00
apc.lazy_functions  0
apc.max_file_size   1M
apc.mmap_file_mask  /dev/zero
apc.num_files_hint  0
apc.preload_path    
apc.report_autofilter   0
apc.rfc1867 0
apc.rfc1867_freq    0
apc.rfc1867_name    APC_UPLOAD_PROGRESS
apc.rfc1867_prefix  upload_
apc.rfc1867_ttl 3600
apc.shm_segments    1
apc.shm_size    512M
apc.slam_defense    1
apc.stat    1
apc.stat_ctime  0
apc.ttl 7200
apc.use_request_time    1
apc.user_entries_hint   0
apc.user_ttl    7200
apc.write_lock  1

From APC stats I can see that the number of cached files is very high (40 000), and this is due to the plethora of cache files of phpbb and mediawiki. 从APC统计数据我可以看到缓存文件的数量非常高(40 000),这是由于phpbb和mediawiki的过多缓存文件。 Do I have to prevent APC caching this files using apc.filters ? 我是否必须使用apc.filters阻止APC缓存此文件? Are there solutions to the problem? 这个问题有解决方案吗?

You really should set apc.stat=0 on your production server and it will prevent APC from actually going to the IO to check if the file has been changed. 您真的应该在生产服务器上设置apc.stat = 0,这将阻止APC实际进入IO以检查文件是否已更改。

also set apc.slam_defense=0 as it's deprecated 也设置了apc.slam_defense = 0,因为它已被弃用

Check out documentation for other options: http://php.net/manual/en/apc.configuration.php 查看其他选项的文档: http//php.net/manual/en/apc.configuration.php

I think you should set apc.mmap_file_mask = /tmp/apc-yourusernamehere.XXXXXX for file-backed mmap; 我认为你应该为文件支持的mmap设置apc.mmap_file_mask = /tmp/apc-yourusernamehere.XXXXXX; make file mask unique by adding your unique string; 通过添加唯一字符串使文件掩码唯一; XXXXXX (exactly 6 X's) must remain to allow APC to add random string OR set to /dev/zero for anonymous mmap if you can spare the memory. 如果可以节省内存,则必须保留XXXXXX(正好为6个X)以允许APC为匿名mmap添加随机字符串OR设置为/ dev / zero。

I can see that you are using /dev/zero which takes memory unnecessarily. 我可以看到你正在使用/ dev / zero,它不必要地占用内存。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM