Apache - 始终运行大量 httpd 进程的缺点

Apache - 始终运行大量 httpd 进程的缺点

大量备用 httpd 进程始终在运行,这是否存在问题?我进行了一项测试,将 httpd 进程数增加了StartServers1,000 MinSpareServers,然后测量了内存使用量的增加,结果只有 500MB。

鉴于此,我在想,既然我们有大量 RAM,为了在突发流量期间获得最佳性能,我们不妨将StartServersMinSpareServers设置为 1,000 左右,当然将ServerLimitMaxRequestWorkers(以前MaxClients)设置为更高的值。

假设我们的服务器能够同时处理那么多请求,并且我们以此MaxConnectionsPerChild作为防止内存泄漏的预防措施,那么这样做是否存在任何缺点?

附注:如果有人认为每个 httpd 进程 0.5MB 是错误的,那么从我所读的内容来看,Apache 内存使用量远低于单个进程报告的内存使用量的原因top是它使用了共享库。

答案1

我担心你的测试方法。看来你只是生成了一大堆进程,然后查看它们的内存使用情况。问题是,当它们首次生成时,它们共享最大数量的内存,并且没有存储任何本地的每个进程数据。

当你开始实际使用它们时,你会发现这些进程开始需要更多内存。即使没有内存泄漏,情况也是如此,但如果你使用任何存在泄漏的扩展,问题就会变得非常严重,而且非常快。

我建议在让此类配置在没有密切监督的情况下运行之前,在各种条件下进行大量真实的负载测试。

答案2

您要避免的是传入请求导致新进程的分叉速度高于旧进程为旧连接提供服务的速度。这种风险会导致系统不断创建新进程,消耗可用内存,并开始增加操作系统使用交换的频率。这反过来又导致磁盘 I/O 大幅增加,系统只是将页面从物理内存交换到虚拟内存(在磁盘上),反之亦然,对工作负载没有任何实际好处。

首先要遵循的一般公式是:

(总内存 - 操作系统内存 - 数据库内存)/ 每个 Apache 进程的大小。

该公式只是等式的一部分。您为系统和 MySQL 提供的内存越多,它们为您缓存的文件系统就越多,从而避免访问磁盘,而磁盘访问的成本非常高。如果数据库不在同一系统上,那么这个问题就不大。

如果您没有正确调整 Apache,并且交换频率增加,则会发生的另一种情况是用户启动时点击停止并重新加载,从而人为地增加了服务器的负载。您可以控制设置,MaxRequestWorkers以便您的服务器不会生成太多子进程而开始交换。这似乎很简单,因为您只需确定平均 Apache 进程的大小,方法是通过 top 或 smem 等工具查看进程列表,然后将其除以总可用内存,同时为其他进程留出足够的内存,您将获得更准确的图像。

此场景中的另一个关键参数是ServerLimit。如果ServerLimit将设置为远高于必要值的值,则会分配额外的未使用共享内存。如果和都ServerLimit设置MaxRequestWorkers为高。Apache httpd 的性能和 Apache httpd 的整体稳定性可能会开始成为一个问题。

答案3

始终运行大量备用 httpd 进程不会带来任何问题。这实际上是一个好主意。

要点是:如果您希望 httpd 达到该进程数,您最好从一开始就达到该数并确保它正常工作。换句话说,不要自动扩展,只需预先扩展。不要太惊讶。

第二点是:如果您不需要共享资源(在这种情况下主要是 RAM)或适应服务器上不同时间运行的不同服务,那么随着时间的推移改变进程数量是没有意义的。为您的 httpd 分配 RAM 预算并生成处理那么多并发请求所需的实例。

15 年前,人们会在一台服务器上共享很多东西,因此有必要根据工作量调整 httpd 的数量。如今,大多数人每个应用程序都使用一台服务器:大多数时候不会使用其所有资源,但性能更可预测,性能分析和调优也更容易。

虽然在特定情况下有一个陷阱,但实际上这种陷阱非常常见:Apache + mod_php(或嵌入在任意 httpd 中的任何解释器)。此处 mod_php 完全改变了交易,因为它变成了应用程序扩展的问题,而不是 httpd 扩展的问题,后者是另一个(冗长的)主题,需要不同的方法(1000 个预分叉工作器无法工作)。

相关内容