我有一个带有 fastcgi 和 php 5.3 的 Web 服务器 apache 2.2,我在 php.ini 中将内存限制设置为 256MB,使用 php-cgi -i 后我得到了 256MB。因此配置是正确的,我的进程读取它没有问题。我之所以这么说,是因为我在网上读了很多帖子,问题出在 php.ini 的位置不正确。就我而言,我确信这是正确的。
我的进程 php-cgi 8 加上父进程为 RSS 分配了超过 256MB 的空间,一些进程还分配了 700MB,没有问题。为什么?
当某些进程 php-cgi 可以分配超过 256MB 的内存限制范围时,内存限制是多少?
我尝试寻找一些错误,但什么也没找到。
我的应用程序不使用 ini_set 来覆盖 memory_limit 参数。因此我确信应该遵守 256MB 的限制。
答案1
PHPmemory_limit
设置是虚拟的内存限制。RSS 是身体的内存使用情况。它们之间几乎没有什么关系。
此memory_limit
设置设置了允许 PHP 脚本直接分配的虚拟内存量。这不是进程限制,也不是物理内存限制。
答案2
我的进程 php-cgi 8 加上父进程为 RSS 分配了超过 256MB 的空间,一些进程还分配了 700MB,没有问题。为什么?
您告诉我们您在您的 websver 上运行 fastCGI - 因此我希望您通过 PHP-FPM 运行 PHP,而不是 PHP-CGI。
您没有告诉我们这与哪种操作系统有关(谈到内存管理时,这是一个相当重要的考虑因素)。
它并没有分配那么多内存 - 它只是映射那么多内存。有关差异的简明解释以及它为何重要,您应该读这个。
David 的回答几乎是正确的 - memory_limit 是可以为脚本执行环境 malloc 的内存量的限制,如果不在操作码缓存中(以及代码的第一次编译),则脚本本身以及在执行期间分配用于存储 PHP 变量的空间。
在执行已经在操作码缓存中的 PHP 代码的情况下,我不知道操作码缓存中的页面是否计入受 memory_limit 限制的使用量——而且需要对 PHP 源代码进行大量工作才能找出答案。
我在 php.ini 中将内存限制设置为 256MB
这个值相当高。由于您不了解内存管理的工作原理,我想知道为什么。将限制设置得太高会限制系统的容量。PHP 的执行会很乐意将空间填满 memory_limit。当内存变得紧张时,垃圾收集会启动并释放死数据(未引用)占用的空间。如果内存从未变得紧张,那么垃圾收集就永远不会发生。
正如这里所述,这似乎不是一个关于在商业环境中管理信息系统的问题。您在评论中说过:
我的问题是 php-cgi 进程的 RSS 是无限制的
但是它受限于 php.ini 的内存限制。如果你不相信我,那就写一个不断消耗数据的脚本,你会发现它在某个时候会崩溃。
如果你真的想问如何规划和管理系统的容量,那么这是一个非常不同的问题——而且你不要试图回答通过查看 RSS 和 VSZ。
进程没有被 oom-killer 杀死,php-cgi 开始使用 swap 并减慢我的系统速度
终于!一个正确的问题陈述!
如果您不打算使用交换空间,为什么您的系统会有交换空间?上面的链接将为您提供一些帮助,帮助您配置系统以避免这种情况发生。如果这是一个多租户系统,其中其他应用程序确实需要交换空间,那么您可以将它们拆分为虚拟机或容器。