You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Azitabh Ajit <az...@gmail.com> on 2015/02/08 04:50:51 UTC

Latency Between Apache And Tomcat

We have a setup where we have a Elastic LB that spreads load over two
Apache servers A1 and A2. These apache servers render a few php pages and
primarily redirects the API requests to tomcat appplication servers T1 and
T2 as per the following diagram:

    Incoming Request
        |
        |
        |
        \/
        LB
        /\
       /  \
      /    \
    A1     A2
    |\     /|
    | \   / |
    |  \ /  |
    |  / \  |
    T1      T2

We have recently started to note delays between apache and tomcat. Here is
an example log lines from apache mod_slow log and tomcat access log for the
same request:

    APACHE_MOD_SLOW: VNSdtwoAAJkAACnXb-cAAACJ [06/Feb/2015:16:25:51 +0530]
elapsed: 50.58 cpu: 0.00(usr)/0.00(sys) pid: 10711 ip: 10.0.0.153 host:
www.example.com:443 reqinfo: GET /data/v1/url?url=test-508324 HTTP/1.1

    TOMCAT: [06/Feb/2015:16:26:42 +0530] "GET /data/v1/url?url=test-508324
HTTP/1.1" 200 65 10

Apache says the incoming request came at `06/Feb/2015:16:25:51 +0530` and
it took ``50s`` to process the request. Whereas tomcat says it took only
``10ms`` to process the request whereas it received the request at
``06/Feb/2015:16:26:42 +0530``.

It means it took nearly 50s for apache to connect and send the whole
request to tomcat. Apache is using ``mod_proxy_ajp`` to connect to apache.
  Here is the configuration:

    <Proxy balancer://prod>
       BalancerMember ajp://127.0.0.1:8009 route=jvmRoute-8009
connectiontimeout=1 retry=300
       BalancerMember ajp://10.0.0.153:8009 route=jvmRoute-8009
connectiontimeout=1 retry=300
       ProxySet lbmethod=byrequests
    </Proxy>

Here is the connector configuration from tomcat:

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
maxThreads="4096" minSpareThreads="25" maxSpareThreads="75"/>

As per connectiontimeout value, I am assuming apache shouldn't take more
than 1 sec to establish connection. Since both apache and tomcat are both
on the same machine, there shouldn't be much time lag once connection is
established.

If it helps, we are using ``https`` requests. But that, I don'y think has
anything to do with this. We have done ``ab`` test in order to compare
performance using ``https``, ``http`` and connecting tomcat directly. Here
are the stats:

    ab -n5000 -c5 https://example.com/test/100001


    Requests per second:    13.67 [#/sec] (mean)

    Time per request:       365.851 [ms] (mean)

    Time per request:       73.170 [ms] (mean, across all concurrent
requests)
    Transfer rate:          79.96 [Kbytes/sec] received


    Connection Times (ms)
                  min  mean[+/-sd] median   max

    Connect:      236  267  95.5    247    3401

    Processing:    83   98  58.6     89    1959

    Waiting:       82   96  57.5     87    1959

    Total:        319  365 134.0    338    3571


    Percentage of the requests served within a certain time (ms)

      50%    338
      66%    347
      75%    356
      80%    364
      90%    399
      95%    477
      98%    689
      99%    869
     100%   3571 (longest request)

    ab -n5000 -c5 http://example.com/test/100001


    Time per request:       186.015 [ms] (mean)
    Time per request:       37.203 [ms] (mean, across all concurrent
requests)
    Transfer rate:          155.55 [Kbytes/sec] received

    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:       74   79  33.4     76    1278
    Processing:    83  107  82.3     91    3964
    Waiting:       82  105  60.9     89     940
    Total:        157  186  90.1    168    4042

    Percentage of the requests served within a certain time (ms)
      50%    168
      66%    174
      75%    180
      80%    184
      90%    211
      95%    259
      98%    379
      99%    507
     100%   4042 (longest request)

    ab -n5000 -c5 http://IP:8080/test/100001


    Requests per second:    31.32 [#/sec] (mean)
    Time per request:       159.624 [ms] (mean)
    Time per request:       31.925 [ms] (mean, across all concurrent
requests)
    Transfer rate:          181.30 [Kbytes/sec] received

    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:       71   76  68.4     73    3079
    Processing:    78   84  13.1     81     594
    Waiting:       77   83   6.5     81     185
    Total:        149  159  71.2    154    3313

    Percentage of the requests served within a certain time (ms)
      50%    154
      66%    157
      75%    160
      80%    161
      90%    166
      95%    171
      98%    177
      99%    189
     100%   3313 (longest request)

Following observation leads me to believe this that bad performance is
depending on sequence of events because none of the requests in the test
performed that badly.

Versions:
    Apache: 2.2.4
    Tomcat: 8.0.16


Any ideas where the lag is coming from and how to reduce the  same?