我有一个 1GB RAM 的 VPS。如果我停止 Apache,则有 400 MB 的 RAM 可用。因此,最大客户端数应为 (总 RAM - 已用 RAM) / max_service_ram_consumption = 400 / 31。因此 MaxClients 应为 13。
这些是定义:
StartServers: number of server processes to start
MinSpareServers: minimum number of server processes which are kept spare
MaxSpareServers: maximum number of server processes which are kept spare
ServerLimit: maximum value for MaxClients for the lifetime of the server
MaxClients: maximum number of server processes allowed to start
MaxRequestsPerChild: maximum number of requests a server process serves
我正在使用 prefork(apache 默认)。
我的配置是这样的:
Timeout 30
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 2
<IfModule mpm_prefork_module>
StartServers 3
MinSpareServers 3
MaxSpareServers 10
ServerLimit 50
MaxClients 50
MaxRequestsPerChild 1000
</IfModule>
StartServers 和 MinSpareServers 的默认值为 5。我将其更改为 3。我看不出内存消耗有任何差异。我还将 MaxClients 从 150 更改为 50。并且我将 MaxRequestsPerChild 限制为 1000。(默认值为 0 - 无限制)。
请告诉我 StartServers、MinSpareServers 和 MaxSpareServers 如何影响内存消耗。以及为什么使用较低/较高的值会更好/错误。我知道这些值也会影响性能。但我找不到好的 Apache 内存消耗计算器。
如何配置 apache.conf 以便能够拥有大约 50/100 个最大用户?
答案1
您的思路是对的。以下是一些应该可以帮助您弄清楚剩余细节的内容。
您需要对 Apache 的所有统计数据进行详细监控,这些统计数据由 mod_status 提供
- “_”等待连接
- “S” 正在启动
- “R”阅读请求
- “W”发送回复
- “K” 保持活动(读取)
- “D” DNS 查找
- “C” 关闭连接
- “L” 记录
- “G”优雅收尾
- “I” 空闲清理 worker
- “。” 打开没有当前进程的插槽
内存总是稀缺的,如果你检查一下,所有 VM 提供商基本上都是根据你获得的内存大小来收取 VM 费用的。所以在花钱的时候要小心。
您可以定义 ServerLimit(需要 apache stop/start 来重新定义),然后使用 MaxClients(可以通过重启进行调整)来设置服务器能够处理的最大值。这些值是为了防止有人从互联网上耗尽您的服务器资源。如果您计算过,您可以有 13 个线程;13 就是。
查看一段时间内的使用模式,并将 StartServers 调整为平均使用率。因此,您将从接近平均使用率的某个值开始;如果 Web 服务器需要处理更多请求,它将启动更多工作器。这些工作器的数量将由 MaxClients 的上限值和
- 最小备用服务器
- 最大备用服务器数
因此,如果流量增长不大,您不会想立即启动大量工作进程;您宁愿启动一两个工作进程,以避免将内存浪费在一堆可能不会使用的额外工作进程上。它需要MaxRequestsPerChild
销毁生成的进程,然后根据使用情况,Apache 将决定是否需要启动新进程来替换旧工作进程。
关于 MaxRequestsPerChild,您需要避免使用 0;虽然将内容缓存在内存中以提高性能是个好主意,但您没有足够的内存来处理此问题。使用较低的数字(例如 1000 或 2000)可能比默认的 10000 更好,因为在处理较少的 HTTP 请求后回收工作线程将限制它们的生命周期,在此期间它们的内存使用量会逐渐增加。因此,尽早回收这些工作线程将为您节省一些内存。
至于用户数量;这取决于……您的用户是否会全天顺利访问 Web 服务器,或者每个人是否同时需要 Web 服务器。您需要监控(图表等)内存、apache、CPU 使用率和其他系统健康数据,并在尝试想出让事情运行更顺畅的方法时检查这些数据,因为没有通用的方法可以让事情变得更好;这在很大程度上取决于用例和使用模式。
关于 Apache 的内存使用情况,这是一个棘手的问题。每个 Apache 线程都可以访问特定部分的内存。这个可访问的地址空间中的一部分是该特定进程独有的,而其他一些地址空间部分则与其他 Apache 线程共享。因此,当您想要计算它们全部使用了多少内存时,您需要确保不要重复计算相同的地址空间。
这是我计算 Apache 内存占用的方法;您可能需要修改第一行以适合您的 Apache 的进程名称,因为根据分布,某些 Apache 进程名称为“httpd”,某些为“apache2”,或者可能是其他我现在想不起来的名称……
cmd='httpd'
ps -o size=,rss=,vsz= $(pgrep "$cmd") | awk '
{ size_sum += $1; rss_sum += $2; vsz_sum += $3; processes += 1 }
END {
printf "Size : %.2f (%.2f) MB\n",size_sum/1024,size_sum/1024/processes
printf "RSS : %.2f (%.2f) MB\n",rss_sum/1024,rss_sum/1024/processes
printf "VSZ : %.2f (%.2f) MB\n",vsz_sum/1024,vsz_sum/1024/processes
}'
输出应该看起来像
Size : 178.84 (16.26) MB
RSS : 118.08 (10.73) MB
VSZ : 1754.29 (159.48) MB
这是来自我的一个 Web 服务器。每行中的第一个值是总数,括号中的第二个值是每个进程的平均值。为了解释这些值,我将引用 ps 手册页
- 尺寸 :如果进程弄脏所有可写页面然后将其换出,则大约需要交换空间量。这个数字非常粗略!
- RSS:驻留集大小,任务已使用的非交换物理内存
- 比斯开:进程的虚拟内存大小
这对你的数学来说意味着;进程可能会增长到VSZ
它们当前使用的RSS
RAM 的大小,这是你在尝试计算 MaxClients/ServerLimit 时要在方程中使用的数字,SIZE
理论上是你的进程在完全交换或由于空闲而可以占用的大小。一些来源关于这个话题,提倡使用 pmap 来计算内存占用
ps -ef | grep httpd | grep -v ^root | awk '{ print $2 '} | xargs pmap -d | grep ^mapped: | awk '{ print $4 }' | cut -dK -f1 | awk '{ SUM += $1} END { print SUM/NR }'
这应该返回与SIZE
我们之前计算的相同的值。