如何configurationApache“工作者”以获得最大的并发性

希望这是一个很好的问题,对于类似情况的任何人都有用。 最近,我接pipe了我公司的一位非常资深的Linuxpipe理员,并且第一次必须build立一个新的服务器来向我们的客户提供我们的内容。 我的前任在这个问题上留下了有限的文件,因为在他离开的时候,其他事项是更高的优先事项。 我已经广泛地提到了我有什么文档,加上以前的服务器configuration和大量的在线阅读来设置一切。

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

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

服务器,我认为是第9代惠普服务器,它有一个RAID 1arrays的32GB内存和固态硬盘。 在开始工作之后,我现在关心的是如何最大限度地同时为用户提供服务,我预计数百名用户的爆发并不罕见。 为了达到这个目的,我希望能够防止堆栈中的任何瓶颈:从Tomcat和MariaDB开始,并采取特定的措施,使我感到满意。 转到Apache,但我觉得更难理解我应该做什么。

有三种不同types的“工人”,我有三个主要问题优化:
1.有三个选项,prefork,mpm_worker和mpm_event。 我真的不明白如何configuration它们,但是我对每个function都有一个大致的了解。
2.与以前的服务器中的Apache不同,StartServers,ServerLimit,MaxRequestsPerChild等选项没有在/etc/httpd/conf/httpd.conf中列出。 可以有默认设置,我必须手动覆盖? 除了“上次手动添加”之外,还有什么原因可以在旧的httpd.conf中find,而不是新的?

我指的是在旧的httpd.conf中,在新的configuration文件中我看不到任何类似的东西,只有一个规范:

// prefork MPM
// StartServers:启动的服务器进程数
// MinSpareServers:保留备用服务器进程的最小数量
// MaxSpareServers:保留备用的服务器进程的最大数量
// ServerLimit:服务器生命周期中MaxClients的最大值
// MaxClients:允许启动的最大服务器进程数
// MaxRequestsPerChild:服务器进程提供的最大请求数

StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000

//工人MPM
// StartServers:启动的服务器进程的初始数量
// MaxClients:最大并发客户端连接数
// MinSpareThreads:保留备用的最小工作线程数
// MaxSpareThreads:保留备用的工作线程的最大数目
// ThreadsPerChild:每个服务器进程中的工作线程数量不变
// MaxRequestsPerChild:服务器进程提供的最大请求数

StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0

请注意,我使用//replace了散列符号以表示httpd.conf中的注释,因为散列符号会使文本显示为标题。

在新服务器上的问题逆转之后,我无法确定哪个工作人员正在使用旧的工作,有prefork和mpm_worker的设置,但没有实际的说明,我可以find。

  1. 经过一点调整,我可以启动服务器mpm_worker,如果我想要(必须先禁用一个php.conf文件),但我不知道是否控制一切的模块是线程安全的(虚拟主机模块,openssl,mod_proxy_ajp)。 mod_proxy_ajp是我使用的唯一的东西,在任何意义上都是不寻常的。

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

如果我想确保大概有大约400人可以在特定的时间使用服务器,没有任何人看到http 500types的错误,那么我应该使用哪些Apache设置?

在此先感谢,希望这不是太白痴。

这里似乎有很多可能的问题,对于一个“回应”来说,有一些非结构性的问题。 让我看看我能否帮助回答一些问题。

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

    “最简单”的方法是转储任何当前正在运行的模块,并selectmpm的模块来查看正在运行的模块。 这里有两个方法:

     # 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的configuration文件中进行控制。 这是一个简短的文件,并且任何时候只有一个LoadModule应该被取消注释。

    LoadModule mpm_worker_module modules/mod_mpm_worker.so

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

  • 设置你想要的configuration值

    未指定时,模块的许多configuration指令都有默认值。 当使用prefork = 5时,使用worker StartServers默认为3。 我会build议创build一个新的文件来包含您的覆盖,而不是编辑一个现有的。

    /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> 

与其他任何事情一样,调整确切的数字留给您来testing您的工作负载和应用程序 – absiege等工具可以提供帮助。