对于新手的问题,我先抱歉,但我正在使用一台专用的虚拟服务器,它有 512MB 的 RAM 内存。我最近将 memory_limit 从默认的 128M 更改为 256M。有什么理由让我不想将其一直提升到可用的全部 512M?
答案1
有什么理由让我不想将其提升到可用的全部 512M?
是的 - 第一个是 512MB每个 PHP 进程。您的流程真的需要那么多吗?
我能想到的一些尚未涉及的原因:
设置这么高的限制只会鼓励笨拙的编程(如果你一次需要半 GB 的 RAM,我无法想象 PHP 会是最好的语言选择)
潜在的拒绝服务攻击(例如,如果你在内存中上传处理,并且用户知道这一点,他们就会上传一些真的大文件并导致服务器离线 - 您的服务器不会达到 32/64/128M,而是会一直达到 512M)。这是假设您没有其他未先达到的上传限制。
您有一个虚拟服务器。如果它是 OpenVZ/Virtuozzo,并且您无法突破到 512M 以上,那么您的进程将开始被终止 - 很快。Apache 可能会被关闭,尤其是在使用 dso 时。这将使一切停止运行,直到重新启动。
在问题浮现之前,你不会知道这是否会导致重大问题。与更复杂的内存管理不同,PHP 不会在开始时尝试分配这么多内存。它只是说它会继续尝试直到你尝试使用超过这个值,然后放弃。据你所知,你可能一开始就无法获得接近 512MB 的空间 - 所以你不能仅仅因为你重新启动了 Apache 并且一切仍然正常,就认为你没问题。
假设您确实有一个需要 512M 内存的应用程序。为什么也为所有其他进程设置这个限制?您可能会为所有进程带来上述问题。使用标准安装,需要它的脚本(例如大型 cron 作业)只需
ini_set('memory_limit','512M');
在 PHP 中执行并提高其自身的限制即可。这使得所有其他进程都“安全”
以下是一些较低层次的原因:
您的整个虚拟服务器分配了 512M。必须将其划分为多个进程才能保持服务器运行,例如(至少)
- 克罗恩
- 阿帕奇
- MySQL 或某些数据库服务器
在总共 512M 内存内,不可能挤进所有这些其他进程和 512M PHP 进程。
除此之外,内核还会优化未使用的 RAM进入缓存- 因此,如果粗心地设定过高的限制,则可能会毫无理由地承担性能损失的风险。
确认您是否有交换(使用
top
或进行验证free -m
)。如果有,您的虚拟服务器将会变慢戏剧性地当你达到限制时。如果你没有交换,你的进程将被虚拟机管理程序杀死。无论哪种方式,你都会看到性能下降。
因此,总而言之,我不建议提出全局限制对于这样的事情。
答案2
我确信你可以将其设置为那样。这可能不建议,因为你的内核和其他进程也需要一些内存。根据你的虚拟机所连接的存储类型,你的系统可能也会从将其存储缓存在内存中受益
答案3
运行应用程序的操作系统始终需要内存。如果您将其增加到超出可用内存量,您会发现应用程序交换到磁盘的次数比您预期的要多。