始终运行大量备用 httpd 进程是否有任何问题?我进行了一项测试,我增加了 1,000,StartServers
并MinSpareServers
测量了内存使用量的增加,它只有 500MB。
鉴于此,我在想,既然我们有很多 RAM,为了在突发流量期间获得最佳性能,我们不妨将其StartServers
设置MinSpareServers
为 1,000 左右,当然还要设置ServerLimit
和MaxRequestWorkers
(以前MaxClients
)设置为更高的值。
MaxConnectionsPerChild
假设我们的服务器能够一次处理这么多请求并且我们将其用作防止内存泄漏的预防措施,这样做有什么我不知道的缺点吗?
作为任何认为每个 httpd 进程 0.5MB 不正确的人的旁注,据我所知,Apache 内存使用量远低于单个进程报告的原因top
是它使用共享库。
您要避免的是传入请求导致新进程以高于旧进程可以服务旧连接的速率分叉。这种风险导致系统不断创建消耗可用内存的新进程并开始增加操作系统使用交换的频率。这反过来会导致磁盘 I/O 大幅增加,其中系统只是将页面从物理内存交换到虚拟内存(在磁盘上),反之亦然,对工作负载没有任何实际好处。
开始的一般公式是:
(总内存 - 操作系统内存 - 数据库内存)/每个 Apache 进程的大小。
公式只是等式的一部分。你给系统和 MySQL 的内存越多,他们为你做的文件系统的缓存就越多,避免撞到非常昂贵的磁盘。如果数据库不在同一个系统上,那么这不是一个问题。
如果您没有正确调整 Apache 并且交换频率增加,则会发生的另一种情况是用户开始点击停止并重新加载,人为地增加了服务器上的负载。您可以控制该
MaxRequestWorkers
设置,以使您的服务器不会产生太多的子节点以致于开始交换。看起来很简单,您只需通过诸如 top 或 smem 之类的工具查看进程列表来确定平均 Apache 进程的大小,然后将其划分为总可用内存,同时为其他进程留出足够的内存获得更准确的图像。此方案中的另一个关键参数是
ServerLimit
. 如果ServerLimit
设置为远高于所需的值,则会分配额外的未使用的共享内存。如果两者ServerLimit
都MaxRequestWorkers
设置为高。Apache httpd 的性能和 Apache httpd 的整体稳定性可能会开始成为一个问题。我担心你的测试方法。看来您只是在生成一大堆进程,然后查看它们的内存使用情况。问题在于,当它们第一次生成时,它们共享最大数量的内存,并且没有存储任何本地的、每个进程的数据。
当您开始实际使用它们时,您会发现这些进程开始需要更多内存。即使在没有内存泄漏的情况下也是如此,但是如果您使用任何泄漏的扩展,问题就会变得非常糟糕,非常快。
我建议在各种条件下进行大量实际负载测试,然后再让这样的配置在没有密切监督的情况下运行。
始终运行大量备用 httpd 进程没有问题。这实际上是个好主意。
要点是:如果您希望 httpd 达到该进程数,则最好从一开始就达到并确保它有效。换句话说,不要自动缩放,只需预先缩放。少惊喜。
第二点是:如果您不需要共享资源(在这种情况下主要是 RAM)或适应在服务器上不同时间运行的不同服务,那么随着时间的推移更改进程数量是没有意义的。为您的 httpd 分配 RAM 预算,并生成处理大量并发请求所需的实例。
15 年前,人们会在一台服务器上共享很多东西,这使 httpds 的数量适应工作负载是有意义的。现在大多数人每个应用程序使用一个服务器:大多数时候不会使用它的所有资源,但性能更可预测,性能分析和调整更容易。
尽管在特定情况下存在一个实际上很常见的问题:Apache + mod_php(或嵌入在任何 httpd 中的任何解释器)。这里 mod_php 完全改变了交易,因为它变成了应用程序缩放而不是 httpd 缩放的问题,这是另一个(冗长的)主题,并且需要不同的方法(1000 个预分叉的工作人员将无法工作)。