After suffering some major performance problems on an Apache system that’s fronting two different Java web apps (via mod_jk and mod_dispatcher) I’m looking into implementing the Worker MPM vs. the stock Prefork MPM that comes on Redhat systems. Following are my own notes on such, mostly as a personal placeholder. Hopefully some others have had experience with this.
Why move to Worker?
Per the Apache documentation on multiprocess modules:
workerMPM uses multiple child processes with many threads each. Each thread handles one connection at a time. Worker generally is a good choice for high-traffic servers because it has a smaller memory footprint than the prefork MPM.
preforkMPM uses multiple child processes with one thread each. Each process handles one connection at a time. On many systems, prefork is comparable in speed to worker, but it uses more memory. Prefork’s threadless design has advantages over worker in some situations: it can be used with non-thread-safe third-party modules, and it is easier to debug on platforms with poor thread debugging support.
ref: http://httpd.apache.org/docs/2.0/misc/perf-tuning.html – Section “Choosing an MPM”
I didn’t find many performance comparisons of prefork vs worker for folks using Apache in front of JBoss or other app servers (mostly just Ruby / PHP / Python) though all reported a higher average throughput (req/sec) with about half the memory utilization. Very curious how it will perform with our Java apps.
Changes Required on a Redhat (RHEL) System
It looks like the changes that would need to be made, configuration-wise, to implement Worker are as follows:
- Edit /etc/sysconfig/httpd and uncomment the line that reads “#HTTPD=/usr/sbin/httpd.worker“
- Worker requires a threadsafe version of mod_cgi called mod_cgid.so which is presently NOT included on our RHEL machines.
Anyone else have performance data or other experience with using the Worker MPM with Tomcat / JBoss / Jetty / Glassfish or with a JCR-type CMS?