Sometime ago, I posted an message about Nginx performance when paired
with Tomcat.
We recently did extensive in-house testing of various workload against
Nginx with Tomcat vs Apache vs Tomcat.
Apache wins hands down.
Here’s the basic setup
- Nginx (2 proc/8192 connections) -> http/1.0 -> Tomcat (HTTP
connector) - Apache (512 prefork) -> AJP -> Tomcat (AJP)
Both KeepAlive off (we don’t use KeepAlive due to L4 switch)
The physical server is 2 core Intel Xeon, which is typical web server
config here.
We have three grinder 3.2 load generators.
We tested 4K and 20K Tomcat simple HTML file, 20K simple HTML with
intentional 10% 200ms
sleep in Tomcat serving (emulate slow DB query), etc.
Every single case, Apache wins by at least 10-15%.
Throughput and response time.
Nginx uses a bit less CPU cycles (10-20%), but it is not able drive
Tomcat to 100% CPU.
Here’s my take on this performance problem.
-
Lack of AJP support, which is an optimized HTTP protocol
First of all, this is a serious bottleneck.- AJP has much less communication overhead than HTTP
-
Lack of HTTP KeepAlive support for proxy
- Lack of AJP may be compensated with HTTP keepalive support since
there are
at least twice the number of TIME_WAIT sockets (connection
establishment mean time
is at least twice - three times slower than that of Apache)
- Lack of AJP may be compensated with HTTP keepalive support since
-
Lack of connection pooling
- Ey-balancer makes things a bit easier, response times are
stable, but still the same
average TPS and response time.
- Ey-balancer makes things a bit easier, response times are
-
There seems to be a huge bug in connection management code
Two mix of transactions: 20K HTML serving and 8K HTML with
intentional 200ms delay in Tomcat logicWith Apache, 20K HTML serving took 36 ms on average while 8K HTML
took 258 ms
With Nginx, 20K HTML serving took 600 ms on average while 8K HTML
took 817 msI really cannot explain these difference. Not even TCP connection
overhead or lack of AJP.
My questions is “should I abandon nginx at this point”?
I know nginx is great proxy and static file server but I cannot prove
my point with Tomcat over and over again.
Thank you
Chang