Apache内存使用优化


11

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

因此,这将是

MaxClients = 3000/ (322-37) = 10

那正确吗?另外,其他参数(如MinSpareServers,MaxSpareServers,MaxRequestsPerChild,StartServers,MinSpareThreads,MaxSpareThreads,ThreadsPerChild,MaxRequestsPerChild)的值应该是多少?

有人可以帮我吗?

更新资料

我已经尝试了你们的建议。它有效,但是只是一会儿。服务器启动后的一段时间后,内存使用率一直在增加,并且从未下降。

我的意思是,启动服务器后,我们假设有500位用户在线。服务器将消耗X RAM。此后2小时,如果有500个相同的在线用户,则服务器将消耗10倍的RAM。

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


1
向您的问题添加更新时,请编辑原始内容,而不要发布答案。这还具有将问题再次提高到首页顶部的额外好处。
本·皮尔布罗

Answers:


14

调整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

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

MaxClients = 3000/16 = 188

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

编辑:回答其他问题

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)之类的基准测试工具或攻城工具来获取服务器功能的数量。依靠感觉或更糟,看看它是否崩溃,不是调整Web服务器参数的好方法。

从Apache 2.4开始,MaxClients已重命名为MaxRequestWorkers。
jastram '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.