我正在运行php 5.3.3的CentOS服务器5上运行APC(php缓存)在一个中型网站上(每天13000次访问),APC 3.1.4和4Gb内存。在过去的几周里,我在日志中遇到了很多“unable to allocate memory for pool
”错误,并且网站经常出现故障。
我认为问题出在APC。从统计数据中我看到缓存在一两个小时后已满,并且碎片总是跳到100%。这是我的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
从APC统计数据中我可以看到缓存文件的数量非常多(40 000),这是由于phpbb和mediawiki的过多缓存文件。我是否必须使用apc.filters
阻止APC缓存此文件?这个问题有解决方案吗?
答案 0 :(得分:7)
你真的应该在你的生产服务器上设置apc.stat = 0,它会阻止APC实际进入IO来检查文件是否已被更改。
还设置了apc.slam_defense = 0,因为它已被弃用
答案 1 :(得分:2)
我认为你应该为文件支持的mmap设置apc.mmap_file_mask = /tmp/apc-yourusernamehere.XXXXXX;通过添加唯一字符串使文件掩码唯一;如果可以节省内存,则必须保留XXXXXX(正好为6个X)以允许APC为匿名mmap添加随机字符串OR设置为/ dev / zero。
我可以看到你正在使用/ dev / zero,这会占用不必要的内存。