是什么原因导致PHP中的“无法为池分配内存”?

2022-08-30 07:01:03

我偶尔会遇到服务器的内存分配限制,特别是对于像Wordpress这样臃肿的应用程序,但从未遇到过“无法为池分配内存”并且无法跟踪任何信息。

有谁知道这意味着什么?我尝试过增加没有成功。我也没有对应用程序进行任何重大更改。有一天没有问题,第二天我遇到了这个错误。memory_limit


答案 1

使用 TTL 0 意味着 APC 将在内存不足时刷新所有缓存。该错误不再出现,但它使APC的效率大大降低。这是一个没有风险,没有麻烦,“我不想做我的工作”的决定。APC并不意味着以这种方式使用。您应该选择足够高的TTL,以便访问次数最多的页面不会过期。最好的方法是提供足够的内存,以便APC不需要刷新缓存。

只需阅读手册即可了解如何使用ttl:http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

解决方案是增加分配给 APC 的内存。通过增加apc.shm_size来执行此操作。

如果将 APC 编译为使用共享段内存,您将受到操作系统的限制。键入以下命令可查看每个段的系统限制:

sysctl -a | grep -E "shmall|shmmax"

要找到更多内存,您必须使用参数apc.shm_segments增加段数。

如果APC使用的是mmap内存,那么您没有限制。内存量仍由相同的选项apc.shm_size定义。

如果服务器上没有足够的内存,请使用过滤器选项来防止缓存访问频率较低的php文件。

但切勿使用 TTL 0。

如c33s所说,使用apc.php来检查您的配置。将文件从 apc 包复制到 Web 文件夹,并将浏览器指向该文件夹。您将看到实际分配的内容以及如何使用它。图表必须在数小时后保持稳定,如果它们在每次刷新时完全更改,则意味着您的设置错误(APC正在刷新所有内容)。分配比APC实际用作安全边际的RAM多20%的RAM,并定期检查。

只允许32MB的默认值低得可笑。PHP是在服务器为64MB时设计的,大多数脚本每页使用一个php文件。如今,像Magento这样的解决方案需要超过10k文件(在APC中约为60Mb)。您应该允许足够的内存,以便始终缓存大多数php文件。这不是浪费,将操作码保存在ram中比在文件缓存中具有相应的原始php更有效。如今,我们可以找到具有24Gb内存的专用服务器,价格低至每月80美元,因此请不要犹豫,允许APC使用几GB。我把24GB中的2GB放在托管5Magento商店和约40个wordpress网站的服务器上,APC使用1.2GB。Magento安装为64MB,带有一些插件的Wordpress为40MB。

此外,如果您在同一台服务器上有开发网站。从缓存中排除它们。


答案 2

可能与APC有关。

对于遇到此问题的人,请指定.ini设置。具体到您的apc.mmap_file_mask设置。

对于文件支持的 mmap,应将其设置为如下所示的内容:

apc.mmap_file_mask=/tmp/apc.XXXXXX

要直接从 /dev/zero 进行 mmap,请使用:

apc.mmap_file_mask=/dev/zero

对于符合 POSIX 的共享内存支持的 mmap,请使用:

apc.mmap_file_mask=/apc.shm.XXXXXX

推荐