如何配置 Apache“workers”以实现最大并发

如何配置 Apache“workers”以实现最大并发

希望这是一个好问题,对任何处于类似情况的人都有用。我最近接替了公司一位非常资深的 Linux 管理员,这是我第一次必须设置一台新服务器来为客户提供内容。我的前任在这件事上留下了有限的文档,因为他离职时有其他更重要的事情要做。我广泛参考了我手头的文档,以及以前服务器的配置和大量在线阅读资料来设置一切。

我正在构建的服务器的“堆栈”如下:CentOS 7、Apache 2.4.6、MariaDB 5.X、Tomcat 7 服务于 JSP/Servlets。之前用于生产的安装使用了 CentOS 5、旧版本的 Apache 和 MySQL 以及 Tomcat 5.X。

Apache 是前端,它使用 AJP 连接到 Tomcat 后端。大多数流量将是 HTTPS。

我认为该服务器是 Gen 9 HP 服务器,它有 32GB RAM 和 SSD,组成 RAID 1 阵列。在让它工作之后,我现在关心的是最大限度地提高它同时为用户提供服务的能力,我预计几百个用户的激增并不罕见。为此,我一直在努力防止堆栈中任何一点出现瓶颈:从 Tomcat 和 MariaDB 开始,并针对它们采取特定措施,这些措施让我感到满意。然而,转向 Apache 后,我发现更难理解我应该做什么。

有 3 种不同类型的“工人”,我在优化这些工人时遇到了 3 个主要问题:

  1. 有三个选项,prefork、mpm_worker 和 mpm_event。我不太明白如何配置它们,但我大致知道它们各自的用途。
  2. 与以前的服务器中的 Apache 不同,StartServers、ServerLimit、MaxRequestsPerChild 等选项未列在 /etc/httpd/conf/httpd.conf 中。是否存在我必须手动覆盖的默认设置?除了“它们是上次手动添加的”之外,还有其他原因导致设置可以在较旧的 httpd.conf 中找到,而在新的 httpd.conf 中找不到?

我参考这个,在旧的 httpd.conf 中,我在新的配置文件的任何地方都看不到任何类似的内容,只有一个规范:

# prefork MPM  
# StartServers: number of server processes to start  
# MinSpareServers: minimum number of server processes which are kept spare  
# MaxSpareServers: maximum number of server processes which are kept spare  
# ServerLimit: maximum value for MaxClients for the lifetime of the server  
# MaxClients: maximum number of server processes allowed to start  
# MaxRequestsPerChild: maximum number of requests a server process serves  
<IfModule prefork.c>  
StartServers       8  
MinSpareServers    5  
MaxSpareServers   20  
ServerLimit      256  
MaxClients       256  
MaxRequestsPerChild  4000  
</IfModule>  
# worker MPM  
# StartServers: initial number of server processes to start  
# MaxClients: maximum number of simultaneous client connections  
# MinSpareThreads: minimum number of worker threads which are kept spare  
# MaxSpareThreads: maximum number of worker threads which are kept spare  
# ThreadsPerChild: constant number of worker threads in each server process  
# MaxRequestsPerChild: maximum number of requests a server process serves  
<IfModule worker.c>  
StartServers         2  
MaxClients         150  
MinSpareThreads     25  
MaxSpareThreads     75  
ThreadsPerChild     25  
MaxRequestsPerChild  0  
</IfModule>  

与我在新服务器上遇到的问题相反,我无法分辨旧服务器上正在使用哪个工作程序,prefork 和 mpm_worker 都有设置,但我找不到要使用哪个实际的规范。

  1. 经过一些调整后,我可以根据自己的意愿使用 mpm_worker 启动服务器(必须先禁用 php.conf 文件),但我不确定控制所有内容的模块是否是线程安全的(虚拟主机、openssl、mod_proxy_ajp 的模块)。mod_proxy_ajp 是我正在使用的唯一不寻常的东西。

该服务器尚未投入生产,因此我无法选择获取大量当前客户端的平均内存使用量来帮助确定“完美”的最大客户端数量,此外,我并不关心获取完美的数字,而只是获取一个足够的数字。

如果我想确保在给定时间内大约有 400 人或更多人可以使用服务器,而不会有人看到 http 500 类型错误,我应该对 Apache 使用哪些设置?

答案1

这里似乎有很多可能的问题,对于“回复”来说有点不成体系。让我看看我是否能帮忙回答一些。

  • 确定正在使用哪些多处理模块 (MPM)。

    “最简单”的方法是转储所有当前正在运行的模块,然后选择其中的mpm模块来查看正在运行的模块。以下是两种方法:

    # apachectl -M | grep mpm
    mpm_worker_module (shared)
    # httpd -V | grep MPM
    Server MPM:     worker
    
  • 更改正在使用的 MPM

    在 CentOS7 上,这现在由名为 的配置文件控制。这是一个短文件,任何时候都只能取消注释/etc/httpd/conf.modules.d/00-mpm.conf一个。LoadModule

    LoadModule mpm_worker_module modules/mod_mpm_worker.so

    更改后需要重新启动服务才能激活所需的 MPM。

  • 设置所需的配置值

    许多模块的配置指令在未指定时都有默认值。 当 using = 5 时, StartServersusingworker将默认为 3。prefork更多信息请参见:https://httpd.apache.org/docs/current/mod/mpm_common.html#startservers。我建议创建一个新文件来包含您的覆盖,而不是编辑现有文件。

    就像是/etc/httpd/conf.modules.d/10-worker.conf

    <IfModule mpm_worker_module>
        ServerLimit             250
        StartServers             10
        MinSpareThreads          75
        MaxSpareThreads         250
        ThreadLimit              64
        ThreadsPerChild          32
        MaxClients             8000
        MaxRequestsPerChild   10000
    </IfModule>
    

与任何事情一样,调整确切的数字取决于您对工作负载和应用程序的测试 - 像ab和这样的工具siege可以提供帮助。

相关内容