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 个用户在线,服务器将消耗 10X RAM。
有没有办法避免这种情况,或者我必须继续监视服务器并时不时地重新启动它?
答案1
调整 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 的值开始,但我会观察内存使用情况,如果它开始接近使用交换,我会将 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 等监控应用程序,以便跟踪服务器使用情况和流量模式。
- 最大客户数:设置为 100-200 的值。如果不确定,我会从较低的值开始,并监控内存/CPU/Apache 使用情况。这将是要调整的主要参数。
- 每个子进程的最大请求数:这指定了何时重新启动 Apache 客户端/子进程。没有错误的值(尽管非常小的值可能效率低下),这取决于您提供的内容。对于动态内容,较大的非零值(例如 1000)将阻止您的 httpd 进程最终变得太大。
- 其他参数:虽然我还没有对其余参数进行彻底的基准测试,但除非你将它们设置为非常低或非常高的值,否则它们的影响应该相对较小。对于大多数网站来说,使用默认值应该没问题。请参阅 Apache预分叉或者工人模块文档提供了参数的完整描述以及每个模块中使用的参数(尝试调整不使用的参数是没有意义的)。
- 基准测试:在调整参数时,我建议使用基准测试工具(如 ab (ApacheBench) 或 siege)来获取有关服务器功能的定量数字。仅依靠感觉或更糟的是,查看它是否崩溃,并不是调整 Web 服务器参数的好方法。