Background:

We have a moderately high traffic web application (between 8 to 21 million 
hits/day) running Apache to serve static content (also to load balance and 
create a DMZ) and Weblogic to serve dynamic content (Struts 1.1 based Java web 
application).
We are trying to replace Weblogic with Tomcat and we have ported our code to 
work with Tomcat. All works well in Tomcat in the DEV, QA, and STAGING 
environment as long as there is no real load.

The Issue - Load Testing:

In our staging environment for load testing, when we run the load test using 
525 concurrent users, the app doesn't perform at all. The CPU usage (on Apache 
and Tomcat Servers) hovers between 7% to 8%. The database server CPU usage is 
also between 4 and 5%.

Setup for Load Testing:

We have setup 2 apache web servers (4 Quad Processors i.e. 16 CPUs each), 2 
Tomcat (version 6.0.29) servers (4 Quad Processors i.e. 16 CPUs each). Each 
server has 32 Gb ram. We are using AJP 1.3 to connect Tomcat and Apache.

Mentioned below is the version information:
Apache Version 2.2.14 (with mod_jk module)
Tomcat: 6.0.29
Database: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bits
Connection Pool: DBCP.

Mentioned below are connector settings in conf/server.xml:

  <Connector
        address="stagingTCserver01"
        backlog="300"
        connectionTimeout="60000"
        enableLookups="false"
        maxPostSize="2097152"
        maxSpareThreads="10"
        maxThreads="30"
        minSpareThreads="5"
        port="8006"
        protocol="AJP/1.3"
        tcpNoDelay="true"
    />

Mentioned below are the settings for JNDI resource configured in 
conf/context.xml:

  <Resource
        name="jdbc/onlinedb"
        auth="Container"
        type="javax.sql.DataSource"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@192.168.12.10:1521:WEBDB"
        initialSize="1"
        maxActive="30"
        minIdle="1"
        maxIdle="5"
        maxWait="300000"
        poolPreparedStatements="true"
        maxOpenPreparedStatements="300"
        validationQuery="SELECT 1 FROM BB_DUAL"
        testOnBorrow="true"
        validationInterval="10000"
        testWhileIdle="true"
    />

JVM Parameters:

-Xms512m -Xmx2048m
-XX:PermSize=128m -XX:MaxPermSize=256m
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/WL2TC/app/
-verbose:gc -Xloggc:/logs/WL2TC/app/WL2TC_1-gc.log

It must be noted that Weblogic setup performs very well using similar settings.

Garbage Collection: While the load test is running, Garbage collection works 
just fine i.e. Young GC occurring every 2-3 minutes and takes less than half a 
second. Full GC occurs every hour and takes a little over 2 seconds.

Any tips/pointers will be greatly appreciated.

Talha.

Reply via email to