我正在使用 worker MPM 运行 apache,使用 fastcgi 运行 php。
以下是我的 mpm 限制:
StartServers 5
MinSpareThreads 5
MaxSpareThreads 10
ThreadLimit 64
ThreadsPerChild 10
MaxClients 10
MaxRequestsPerChild 2000
我还使用以下命令设置了我的 php-cgi:
PHP_FCGI_CHILDREN=5
PHP_FCGI_MAX_REQUESTS=500
我注意到,即使启动后,我的 php-cgi 进程平均占用大约 200+mb 的 RAM。但是,我的 php memory_limit 只有 128M。
这是怎么可能的?我该怎么做才能降低 php-cgi 内存消耗?
答案1
在某些情况下,PHP 可能会超出配置的内存限制(在扩展中直接分配的内存),但我怀疑情况可能并非如此。
我注意到我的平均 php-cgi 进程使用了大约 200+mb
您是如何测量的?大多数 TXT 段将被共享 - 因此实际内存使用量比您在 /proc 文件系统或 ps/top 中看到的要少得多。虽然您可以尝试解析 lsof 的输出,但实际上我发现退后一步并查看正在进行的请求数(例如,从连接的套接字数)并将其与报告的可用内存(较少的缓冲区/缓存)进行比较更为明智。
答案2
PHP 中的内存限制是内部内存限制 - 即引擎允许用户脚本通过其私有分配器分配的内存量。但除此之外,还有引擎为其内部需求分配的内存,这些内存并不总是计入限制(部分内存计入,但不是全部),还有库分配的内存等。因此,实际内存使用量应略大于memory_limit
设置值。
另外,如上所述,一些工具报告的数字是分配给代码、堆栈、操作系统 I/O 缓冲区、库之间的共享内存等的内存,因此请仔细查看您正在检查的数字。