我的 apache2 出了大问题。我使用的是 LAMP,Debian 6,64 位。
这是运行 24 小时后的屏幕,按 %MEM 排序:
您可以看到 apache2 的 VIRT 是 186mb。
这实在是太糟糕了。我该怎么办?
考虑到这个 Apache 服务只有几个虚拟主机,并且 PHP 页面不需要超过 3MB 的内存。
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 1250
MaxClients 1250
MaxRequestsPerChild 1500
</IfModule>
谢谢
答案1
这有那么严重吗?
您使用的 VIRT 字段是进程可以使用的内存总量。下一列更接近于它正在使用的内存量。即便如此,其中一些内存也会在进程之间共享。如果您要进行 Linux 管理,我建议您阅读 Linux 如何管理虚拟内存。
查看其他统计数据,您仍然有 1Gb 的备用 RAM,因此该盒子甚至没有尝试填充其磁盘缓存,因此看起来有足够的备用 RAM。
不过 Mahnsc 是正确的,删除未使用的模块将有助于内存和安全。
尽管如此,它看起来确实有点大。它们变大了吗?重启是否会重置为较小的内存使用量?如果它在增长,那么这可能是一个问题,但如果它基本是静态的,那么可能没问题。
答案2
卸载您不使用或打算使用的任何模块。如果您使用的是 php 并且不需要 mod_proxy 或 mod_jk 支持,请卸载它们。这应该有助于减少每个子进程的占用空间。如果您没有通过 apache 进行任何类型的身份验证,您也可以卸载大多数 mod_auth_* 和 mod_authn_* 模块。
答案3
如果您想测量 apache 的实际内存占用量,那么可以将“free”的输出与 httpd 进程的数量进行比较。
正如 mahnsc 所说 - 您应该从 httpd 中删除不需要的东西(您也可以删除符号 - 但节省的并不多)。
只有几个虚拟主机和 PHP 页面
也许 - 这取决于代码实际在做什么。您可以考虑切换到 fastCGI(它对内存使用没有帮助 - 但它可以让您查看问题出在 apache 还是 PHP 上)。
无论如何,几乎没有证据表明它确实影响性能。
答案4
服务器限制太大。根据您的应用程序,应该是 10 倍 CPU 核心数。使用 JMetter 针对高负载期间预期的流量运行负载测试。然后ServerLimit
相应地设置。我会从 2 * #CPU 核心开始,然后线性增加,直到负载测试期间的性能开始下降。