RAM 负载高但 CPU 负载低

RAM 负载高但 CPU 负载低

我有一个专门的问题..

当我使用约 500 个连接进行负载测试时,CPU 保持在较低水平(约 30%),但内存增长很快!我的 RAM 使用了 100%,SWAP 使用了 50%。

另外一台专用的 2x 低配置机器可以轻松运行 500 CO。

我不知道我需要做什么。

感谢您的帮助

答案1

当默认安装的 LAMP 服务器出现内存消耗问题时,通常是 Apache。

由于 mod_php 不是线程安全的,Apache 通常使用 MPM prefork 运行。这意味着服务器会为每个请求生成单独的进程。由于使用 mod_php 的 apache 进程通常消耗大约 35-50MB,这意味着随着用户数量的增加,内存消耗也会增加。

另一个问题是 apache 不进行垃圾清理,因此进程大小会随着时间的推移而增长,所以看到 apache 进程大小大于 100MB 并不罕见。

您需要做的第一件事是尝试调整 Apache/PHP 以降低内存占用。

理想情况下,你会希望关闭所有不必要的模块,包括 PHP 和 apache。以下是您可能需要的一些最小 apache 模块集:

# apachectl -t -D DUMP_MODULES
Loaded Modules:
 core_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)
 alias_module (shared)
 auth_basic_module (shared)
 authn_alias_module (shared)
 authn_file_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 deflate_module (shared)
 dir_module (shared)
 expires_module (shared)
 headers_module (shared)
 log_config_module (shared)
 mime_module (shared)
 php5_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
Syntax OK

如果您的用户在获取数据后保持连接打开,则意味着您的 RAM 使用率会更高。要避免这种情况,请更改 Keepalive 设置。您可以将其关闭:

KeepAlive Off

或者设置非常低的超时时间:

KeepAliveTimeout 2

接下来是调整 prefork。在确定 MaxClient 设置时要特别小心 - 这完全取决于您为 Apache 分配的 RAM 数量。此外,降低 MaxRequestsPerChild 以强制 Apache 更频繁地回收进程,从而避免每个进程的内存使用量增长:

<IfModule prefork.c>
StartServers         10
MinSpareServers      10
MaxSpareServers      30
ServerLimit          100
MaxClients           100
MaxRequestsPerChild  200
</IfModule>

您可以在线找到计算 Apache 进程内存使用量的脚本,并可以计算出可以安全使用的 MaxClients/ServerLimit 设置。

转向 MySQL - 它的使用率并不那么依赖于用户数量,但您仍然需要对其进行调整。最简单的方法是使用 mysqltuner 脚本,但不要听从所有建议,例如增加查询缓存。大约 32 到 64MB 的查询缓存就足够了。

希望这可以帮助。

相关内容