Yes, since you know in advance how many connections you are going to get to
the AJP connector, you can configure it so that it has enough threads to
handle all of those connections.  That is why it doesn't attempt to handle
the case when the concurrency goes above maxThreads.

 

> -----Original Message-----
> From: Jess Holle [mailto:[EMAIL PROTECTED] 
> Sent: Thursday, June 14, 2007 2:58 PM
> To: Tomcat Developers List
> Cc: Dobson, Simon; Wang, Andy; Fenlason, Josh
> Subject: Serious non-native AJP connector issue
> 
> We're facing a /serious /issue with the non-native AJP connector.
> 
> To put it most simply, some requests seem to "get lost" in Tomcat in 
> various cases involving concurrent requests -- and not 
> egregious numbers 
> of concurrent requests, either.
> 
> For instance,
> 
>    1. Use a Tomcat 5.5.23 with a configuration like:
> 
>         <Connector port="8010"
>                    minSpareThreads="4" maxSpareThreads="12"
>     maxThreads="18" acceptCount="282"
>                    tomcatAuthentication="false"
>     useBodyEncodingForURI="true" URIEncoding="UTF-8"
>                    enableLookups="false" redirectPort="8443"
>     protocol="AJP/1.3" />
> 
>     (which are intended solely for making it easier to test 
> concurrency
>     issues that to overrun a realistic 'maxThreads' setting) and as a
>     control, similar thread pool settings on the direct HTTP 
> connector:
> 
>         <Connector port="8080" maxHttpHeaderSize="8192"
>                    minSpareThreads="4" maxSpareThreads="12"
>     maxThreads="18" acceptCount="282"
>                    enableLookups="false" redirectPort="8443"
>                    connectionTimeout="20000" 
> disableUploadTimeout="true" />
> 
>    2. Use an Apache 2.2.4 with mod_proxy_ajp with a 
> configuration like:
> 
>         <Proxy balancer://ajpWorker>
>         BalancerMember ajp://localhost:8010 min=16 max=300 smax=40
>         ttl=900 keepalive=Off timeout=900
>         </Proxy>
> 
>         RewriteEngine on
>         RewriteRule ^(/TestApp/(.*\.jsp(.*)|servlet/.*|.*\.jar))$
>         balancer://ajpWorker$1 [P]
> 
>     (on Windows in this case; similar results can be obtained on Linux
>     at least)
> 
>    3. Use a simple test JSP page (placed in a web app 
> containing nothing
>       else):
> 
>         <[EMAIL PROTECTED] session="false"
>         %><[EMAIL PROTECTED] contentType="text/html" pageEncoding="UTF-8"
>         %><%!
>           private static final String  titleString = "Sleepy 
> Test JSP Page";
>         %><html>
>         <head>
>         <%
>           String  sleepSeconds = request.getParameter( "secs" );
>           if ( sleepSeconds == null )
>             sleepSeconds = "1";
>           long  secsToSleep = Long.parseLong( sleepSeconds );
>           Thread.sleep( 1000L * secsToSleep );
>         %>
>         <meta http-equiv="Content-Type" content="text/html; 
> charset=UTF-8"/>
>         <title><%=titleString%></title>
>         </head>
>         <body>
>         <center>
>         <h2><%=titleString%>: SUCCESS!</h2>
>         [Slept <%= secsToSleep %> seconds.]
>         </center>
>         </body>
>         </html>
> 
>    4. Hit the page with ab
>           * First, test direct Tomcat connections:
>                 o ab -n 24 -c 24 -A wcadmin:wcadmin
>                   http://hostname:*8080*/TestApp/test.jsp?secs=3
>                       + Result: All requests complete sucessfully in
>                         6118 ms.
>           * Second, test connections via Apache:
>                 o ab -n 24 -c 24 -A wcadmin:wcadmin
>                   http://hostname/TestApp/test.jsp?secs=3
>                       + Result: Only 17 requests complete before ab
>                         times out.
>           * Third, test connections via Apache again soon (under the
>             BalancerMember 'timeout' seconds) after the last test
>                 o ab -n 24 -c 24 -A wcadmin:wcadmin
>                   http://hostname/TestApp/test.jsp?secs=3
>                       + Result: Only 9 requests complete 
> before ab times
>                         out.
> 
> Something is clearly /horribly/ wrong with the handling of any 
> concurrency over 'maxThreads' in this case.  Even so, there 
> seems to be 
> some sort of "off-by-one" error in that only 17 requests 
> complete, not 
> 18.  Worse, this has a lingering effect that decreases 
> Tomcat's ability 
> to concurrent requests thereafter (with this impact seemingly 
> being much 
> worse the longer the BalancerMember timeout is set to -- and we have 
> some very long running requests and thus need this timeout to 
> be /very/ 
> large).
> 
> This is not the only ill effect we've seen when hitting Tomcat 5.5.24 
> with concurrent requests in this manner, but it is a good 
> place to start.
> 
> As for the native connector, it just works here.  So why don't I just 
> use it?  Well, first off, we have to support Tomcat on 
> Windows (32 and 
> 64-bit), Linux, Solaris, HPUX (PA-RISC and Itanium), and AIX.  We've 
> been unable to get the connector built on some of these 
> platforms and on 
> some we can't get the resulting binary to function (specifically on 
> AIX).  Further, we had some stability issues with the native 
> connector 
> in the past and had considered the Java connector the safest, if not 
> fastest, option -- and to a degree given that everything is 
> Java I still 
> feel that's the case.  Finally, however, this connector should just 
> plain work.  Tomcat shouldn't be a cripple unless/until you manage to 
> build a native connector for your platform.
> 
> Any troubleshooting and/or debugging ideas (e.g. where 
> exactly to place 
> breakpoints, what logs to turn on, etc, etc) would be 
> /greatly/ appreciated.
> 
> --
> Jess Holle
> [EMAIL PROTECTED]
> 
> P.S. If this should go to the user's mailing list instead 
> that's fine, 
> but this really seemed like a developer-oriented issue to me.
> 
> 



This message is intended only for the use of the person(s) listed above as the 
intended recipient(s), and may contain information that is PRIVILEGED and 
CONFIDENTIAL.  If you are not an intended recipient, you may not read, copy, or 
distribute this message or any attachment. If you received this communication 
in error, please notify us immediately by e-mail and then delete all copies of 
this message and any attachments.

In addition you should be aware that ordinary (unencrypted) e-mail sent through 
the Internet is not secure. Do not send confidential or sensitive information, 
such as social security numbers, account numbers, personal identification 
numbers and passwords, to us via ordinary (unencrypted) e-mail.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to