<p>Async connections would need a fixed dedicated worker thread with the previous MPMs but not with event.
The status page of <module>mod_status</module> shows new columns under the Async connections section:</p>
<dl>
<dt>Writing</dt>
<dd>While sending the response to the client, it might happen that the TCP write buffer fills up because the connection is too slow. Usually in this case a <code>write()</code> to the socket returns <code>EWOULDBLOCK</code> or <code>EAGAIN</code>, to become writable again after an idle time. The worker holding the socket might be able to offload the waiting task to the listener thread, that in turn will re-assign it to the first idle worker thread available once an event will be raised for the socket (for example, "the socket is now writable"). Please check the Limitations section for more information.
</dd>
<dt>Keep-alive</dt>
<dd>Keep Alive handling is the most basic improvement from the worker MPM.
Once a worker thread finishes to flush the response to the client, it can offload the
socket handling to the listener thread, that in turns will wait for any event from the
OS, like "the socket is readable". If any new request comes from the client, then the
listener will forward it to the first worker thread available. Conversely, if the
<directivemodule="core">KeepAliveTimeout</directive> occurs then the socket will be
closed by the listener. In this way the worker threads are not responsible for idle
sockets and they can be re-used to serve other requests.</dd>
<dt>Closing</dt>
<dd>Sometimes the MPM needs to perform a lingering close, namely sending back an early error to the client while it is still transmitting data to httpd. Sending the response and then closing the connection immediately is not the correct thing to do since the client (still trying to send the rest of the request) would get a connection reset and could not read the httpd's response. So in such cases, httpd tries to read the rest of the request to allow the client to consume the response. The lingering close is time bounded but it can take relatively long time, so a worker thread can offload this work to the listener.</dd>
</dl>
<p>These improvements are valid for both HTTP/HTTPS connections.</p>
<p>The event model was made possible by the introduction of new APIs into the supported operating systems:</p>
<ul>
<li>epoll (Linux) </li>
<li>kqueue (BSD) </li>
<li>event ports (Solaris) </li>
</ul>
<p>Before these new APIs where made available, the traditional <code>select</code> and <code>poll</code> APIs had to be used.
Those APIs get slow if used to handle many connections or if the set of connections rate of change is high.
The new APIs allow to monitor much more connections and they perform way better when the set of connections to monitor changes frequently. So these APIs made it possible to write the event MPM, that scales much better with the typical HTTP pattern of many idle connections.</p>
<p>The MPM assumes that the underlying <code>apr_pollset</code>
implementation is reasonably threadsafe. This enables the MPM to
@@ -81,6 +147,9 @@ of consuming threads only for connections with active processing</description>