Apache内存使用优化

Sou*_*ker 11 memory-usage apache-2.2

Apache 使用了太多我的服务器内存,导致它崩溃。我在服务器中有 4GB 的 RAM。

我正在尝试微调 Apache 设置以提高其性能,但我对此很陌生。

我试图遵循这篇文章的建议,但我不知道如何计算事情,而且我似乎让事情变得更糟。

我的顶部是这样的:

11697 apache    15   0  322m  37m 4048 S  0.0  0.9   0:00.52 httpd
13602 apache    15   0  323m  37m 3944 S  0.0  0.9   0:00.50 httpd
11786 apache    15   0  322m  36m 4052 S  0.0  0.9   0:00.50 httpd
12525 apache    15   0  322m  36m 4040 S  0.0  0.9   0:00.63 httpd
11806 apache    15   0  322m  36m 3952 S  0.0  0.9   0:00.42 httpd
11731 apache    15   0  322m  36m 4036 S  0.0  0.9   0:00.46 httpd
11717 apache    16   0  322m  36m 3956 S  0.0  0.9   0:00.54 httpd
11659 apache    15   0  322m  36m 3980 S  0.0  0.9   0:00.49 httpd
Run Code Online (Sandbox Code Playgroud)

所以,这将是

MaxClients = 3000/ (322-37) = 10
Run Code Online (Sandbox Code Playgroud)

那正确吗?此外,其他参数的值应该是什么,例如 MinSpareServers、MaxSpareServers、MaxRequestsPerChild、StartServers、MinSpareThreads、MaxSpareThreads、ThreadsPerChild、M​​axRequestsPerChild?

有人可以帮助我吗?

更新

我已经尝试了你们所建议的。它有效,但只是一段时间。服务器启动一段时间后,内存使用量不断增加并且永远不会下降。

我的意思是,在我启动服务器之后,让我们假设有 500 个在线用户。服务器将消耗 X RAM。2 小时后,同样有 500 个用户在线,服务器将消耗 10 倍 RAM。

有没有办法避免这种情况,否则我将不得不继续监视服务器并不时重新启动它?

ues*_*esp 15

调整 Apache 内存使用的主要参数是MaxClients. 值太低,您将用完可用插槽来满足客户端请求。太多,您将用完所有 RAM 并开始使用交换空间,这会降低性能(这可能是服务器崩溃)。

一种调整方法MaxClients是观察系统的内存使用情况并根据需要调整设置。如果服务器开始交换编辑它。如果服务器有空闲内存就把它放起来。

您还可以通过查看 Apache 的内存使用情况来估计最大值。启动top并按下M以按内存对进程进行排序。你应该看到类似的东西:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
18698 apache    17   0  141m  59m  41m S  0.0  1.6   4:57.46 httpd
18591 apache    17   0  141m  59m  41m S  0.0  1.5   4:54.79 httpd
22917 apache    16   0  141m  57m  39m S  0.0  1.5   4:57.44 httpd
18595 apache    16   0  142m  57m  38m S  0.0  1.5   5:23.43 httpd
18697 apache    16   0  139m  56m  41m S  0.0  1.5   5:09.29 httpd
18735 apache    25   0  141m  56m  38m S  0.0  1.5   5:05.32 httpd
Run Code Online (Sandbox Code Playgroud)

减去 RES 和 SHR 列以获得每个 Apache 实例的大致内存使用量。在这种情况下,它大约是 16MB。如果我有 4GB 的 RAM 并希望其中 3GB 用于 Apache 我的 MaxClients 设置将是:

MaxClients = 3000/16 = 188
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,我可能从 150-200 的值开始,但我会观察内存使用情况,如果它开始接近使用交换,我会将 MaxClients 减少 10-20%。另请注意,3GB 的值只是一个随机示例。在仅运行 Apache 的服务器上,我可能能够使用几乎所有的 4GB。在其他情况下,我可能只需要 1GB 或 2GB 用于 Apache,其余的用于其他应用程序、系统或缓存。

编辑:回答其他问题

MaxClients 或其他 Apache 配置参数的魔法值通常不会使您的服务器速度突然提高两倍。无论 MaxClients 是 10 还是 1000,某些服务器似乎都能正常运行。 MaxClients 设置为“坏”的主要有两种情况:

  • 太低:当 MaxClients 太低时,您会遇到所有 Apache 客户端都被使用并且新连接进入队列等待下一个客户端可用的情况。如果您启用 Apache 的 mod_status,您可以实时查看在任何一个时间点有多少客户端处于忙碌状态。这种状态相对容易诊断,因为站点在高流量期间会变慢,并且可以观察到所有客户端都在使用中。
  • 太高:当 MaxClients 太高时,您将进入耗尽所有 RAM 并开始使用交换的情况。发生这种情况时,您网站的性能将基本降至零(考虑 RAM 和磁盘之间的速度差异)。这种状态可能更难以观察和诊断,因为服务器将在高 MaxClients 下正常运行,直到遇到流量高峰。例如,在一个每小时点击次数很少的站点上,我可以将 MaxClients 设置为 1000,远远超过 RAM 支持的数量,但由于 Apache 一次只需要使用一两个客户端,因此从未遇到过问题。我只会在流量激增时发现问题,增加并发使用的客户端数量,直到 RAM 耗尽并需要交换空间。

虽然我不知道您的服务器、应用程序或流量的详细信息,但我可以建议以下配置值作为起点。试用它们,监控服务器的负载和使用情况,并根据需要更改设置。

  • mod_status:启用此功能,以便您可以查看 Apache 的使用情况。要获得更高级的统计信息,请安装 Zabbix/Nagios 等监控应用程序,以便您可以跟踪服务器使用情况和流量模式。
  • MaxClients:设置为 100-200 的值。如果不确定并监控内存/CPU/Apache 使用情况,我会从较低的值开始。这将是要调整的主要参数。
  • MaxRequestsPerChild:这指定何时重新启动 Apache 客户端/子项。没有错误的值(尽管非常小的值可能效率低下),这取决于您提供的内容。对于动态内容,一个大的非零值(比如 1000)将阻止您的 httpd 进程最终变得太大。
  • 其他参数:虽然我没有对其余参数进行彻底的基准测试,但除非您将它们设置为非常低或非常高的值,否则它们的影响应该相对较小。对于大多数站点,使用默认值应该没问题。请参阅 Apache PreforkWorker模块文档以获取参数的完整描述以及每个模块中使用的参数(尝试调整您不使用的参数是没有意义的)。
  • 基准测试:当您调整参数时,我建议您使用像 ab (ApacheBench) 或 siege 这样的基准测试工具来获得服务器功能的量化数字。仅仅依靠感觉或更糟,看看它是否崩溃,并不是调整 Web 服务器参数的好方法。