Apache 启动服务器、最小/最大备用服务器内存消耗影响

Apache 启动服务器、最小/最大备用服务器内存消耗影响

我有一个 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它们当前使用的RSSRAM 的大小,这是你在尝试计算 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我们之前计算的相同的值。

相关内容