Apache – 大量的httpd进程总是在运行

有大量空闲的httpd进程总是在运行吗? 我运行了一个testing,将StartServersMinSpareServers增加了1000,并测量了内存使用量的增加,只有500MB。

鉴于此,我认为既然我们有很多内存,为了在突发stream量期间获得最佳性能,我们不妨将StartServersMinSpareServers设置为大约1000,当然,将ServerLimitMaxRequestWorkers (以前称为MaxClients )设置为更高。

有没有这样做的缺点,我不知道假设我们的服务器能够一次处理多个请求,我们使用MaxConnectionsPerChild作为预防内存泄漏?

作为对每个人想0.5MB每httpd过程的一个侧面说明是不正确的,从我读了为什么Apache的内存使用量less于单个进程报告什么的原因是,它使用共享库。

我很关心你的testing方法。 看来你只是产生了一大堆进程,然后看看它们的内存使用情况。 问题是,当它们第一次产生时,它们共享最大量的内存,并没有存储任何本地,每进程的数据。

当你开始真正使用它们时,你会发现这些进程开始需要更多的内存。 即使在没有内存泄漏的情况下也是如此,但是如果您使用任何泄漏的扩展,问题会变得非常糟糕。

我build议在各种条件下进行大量实际的负载testing,然后在没有严密监督的情况下离开这样的configuration。

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

一开始的通用公式是:

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

公式只是方程的一部分。 系统和MySQL内存越多,文件系统的caching越多,避免碰到非常昂贵的磁盘。 如果数据库不在同一个系统上,那么这不是一个问题。

另一种情况发生,如果你不正确地调整Apache,交换的频率增加,用户启动停止和重新加载,人为地增加服务器上的负载。 您可以控制MaxRequestWorkers设置,以便您的服务器不会派生太多的子项,从而开始交换。 看起来很简单,因为您只需通过top或smem等工具查看进程列表来确定您的平均Apache进程的大小,然后将其划分为全部可用内存,同时为其他进程留下足够的内存得到更准确的图片。

另一个在这种情况下的关键参数是ServerLimit 。 如果ServerLimit的值设置得比所需的高得多,则会分配额外的,未使用的共享内存。 如果ServerLimitMaxRequestWorkers都设置为高。 Apache httpd的性能和Apache httpd的总体稳定性可能开始成为一个问题。

有大量的空闲httpd进程总是运行没有问题。 这实际上是一个好主意。

主要的一点是:如果你想让httpd达到这个过程的数量,你最好从一开始就达到目标,并确保它的工作。 换句话说,不要自动缩放,只是预先缩放。 减less惊喜。

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

15年前,人们会在单个服务器上共享大量的东西,这对于调整httpd的数量来说是很有意义的。 现在大多数人每个应用程序使用一台服务器:大部分时间不使用所有的资源,但性能更可预测,性能分析和调整更容易。

虽然在特定的情况下有一个很常见的问题:Apache + mod_php(或任何httpd中embedded的解释器)。 这里mod_php完全改变了交易,因为它然后成为应用程序缩放问题,而不是httpd缩放,这是另一个(长度)的主题,并需要一个不同的方法(1000 preforked工人不会工作)。