Something Can Be Done About It
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.
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.
It looks like the changes that would need to be made, configuration-wise, to implement Worker are as follows:
Anyone else have performance data or other experience with using the Worker MPM with Tomcat / JBoss / Jetty / Glassfish or with a JCR-type CMS?