为什么不总是使用Apache的事件MPM而不是工作者MPM?

5 apache concurrency events worker apache2.4

mpm_eventmpm_worker不同的是mpm_event管理与一个单独的,专用的所有线程(非SSL)的KeepAlive连接,而不是具有每个线程管理每个单独的连接.通过为每个KeepAlive连接提供然后保留专用线程,mpm_worker无论是否正在处理请求,都将该线程及其资源绑定到该连接.mpm_event另一方面,通过允许线程及其资源在请求完成后再循环回系统,可以降低高并发环境中的系统资源使用.

在我看来,在高并发性,KeepAlive长时间超时的非SSL环境中,mpm_event有可能使系统能够使用与具有相同资源的系统相同的资源来处理更高的工作负载mpm_worker.更重要的是,在我看来,在资源使用和功能方面,mpm_event至少mpm_worker在所有情况下都好,如果不是更好的话.

尽管我的理解mpm_event总是至少同样好,可能更好,但我最喜欢的Linux发行版默认使用mpm_worker从存储库安装Apache 2.4时.这让我想知道我的想法是否不完整,是否有一些技术原因我缺少使用mpm_worker而不是mpm_eventApache 2.4.

因此,我的问题是,我说mpm_worker的至少与mpm_event所有情况下的情况一样好,如果不是更好,并且(2)如果没有,那么mpm_worker在Apache 2.4中使用哪些技术优势?

cov*_*ner 2

我能想到的“优点”有两个。两者都相当晦涩难懂。

Worker 不需要在每个进程中争夺锁来保护 keepalive 连接列表。这意味着存在退化的工作负载,这些工作负载可能会在相对较低的客户端总数中出现锁定争用,因此根本无法从事件的可扩展性中受益。

其次,一些非常不起眼的第三方模块可能在事件下存在微妙的错误,例如异步写入完成意味着某些回调发生在“不同”线程上。异步写入完成是指当对客户端的写入发生阻塞(客户端读取缓慢)时发生的情况,因此请求被挂起,并在客户端套接字再次可写时在新线程上恢复。