我有一个专门的问题..
当我使用约 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 的查询缓存就足够了。
希望这可以帮助。