Christophe Fondacci wrote:
Thanks for your replies.


Charles,

I am logging long request in my client code, and a POST request like http://S:8080/solr/select/ can take 250s with 12 posted NameValuePair while this same request can pass OK in hundreds of ms. So I *think* our requests are well formed (I log the request after the Solr server response). According to you, what can cause tomcat to expect more data ? I like the "multithread problem on our client" suggestion and am going to investigate in this way.

Filip,

I have many doubts about an "expected" behaviour.
When our server behaves correctly, almost all http threads have the following call stack :
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:442)
at java.lang.Thread.run(Thread.java:619)

They are waiting, not reading...
My understanding of Tomcat (please correct me if i am wrong) is that the Coyotte connector dispatches http requests to http threads when needed, though awaking them from their waiting state. The http threads should only read one single request, process and return, shouldn't they?
this is what happens,
1. thread goes into socketAccept, waiting for connection
2. thread reads request - parseRequestLine
3. thread executes the request - this is your servlet
4. thread goes into read request - parseRequestLine

if 4 times out (which it almost always does at some point, but using the connectionTimeout value, 20sec) then it closes the connection and goes back to the thread pool

since you most likely have a fair amount of timeouts happening, then you most likely will show lots of time shown in that method using a profiler.

set
maxKeepAliveRequests="1" for your connector, and see if you see a different behavior

Filip


An http thread which is "reading" (executing parseRequestLine) is not able to handle http request. Eventually they were already processing some request. (again please correct me if i'm wrong).

Can you give me more details about why you think that an http thread which is reading a socket for hundreds of seconds is a normal behaviour?

After a while, under heavy load, every http thread is doing "parseRequestLine" and tomcat is not able to serve any more request until these method calls finish. It can last 10 minutes before Tomcat is able to serve new requests. When Tomcat starts to respond again, we can clearly see that some http threads returned to their waiting state.


Thank you.
Christophe.

----- Original Message ----- From: "Filip Hanik - Dev Lists" <[EMAIL PROTECTED]>
To: "Tomcat Users List" <users@tomcat.apache.org>
Sent: Wednesday, July 02, 2008 5:43 AM
Subject: Re: Tomcat bottleneck on InternalInputBuffer.parseRequestLine


if you are using keep alive connections, (Tomcat default config)
then once a request is done, the system goes into reading the next request, and that is done by calling parseRequestLine, so this is not a bottleneck, but expected behavior. if you switch to the NIO connector, that doesn't do block reading during a keep alive, your numbers would show differently. however, the perf numbers you are looking at are no cause for concern

Filip


Caldarale, Charles R wrote:
From: Christophe Fondacci
[mailto:[EMAIL PROTECTED]
Subject: Tomcat bottleneck on InternalInputBuffer.parseRequestLine

This problem may be related to the one listed here :
http://grokbase.com/profile/id:hNxqA0ZEdnD-6GYFRNs-iIkKEvF907F
NWdczKYQ719Q


I would have my doubts about a five-year-old problem description being pertinent to today's Tomcat.


When the problem occurs, we can see threads which are
stucked with the following call stack :

at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at
org.apache.coyote.http11.InternalInputBuffer.fill
(InternalInputBuffer.java:700)
at
org.apache.coyote.http11.InternalInputBuffer.parseRequestLine
(InternalInputBuffer.java:366)


It looks like the parser is waiting for more of the request to show up. Are you positive that the stalled requests are well-formed? Is it possible that there's something not quite thread safe in your client on Server A that might be corrupting the request stream as it's being generated? Can you run a Wireshark or equivalent trace and observe one of the slow ones? (That may be tricky.)

 - Chuck


THIS COMMUNICATION MAY CONTAIN CONFIDENTIAL AND/OR OTHERWISE PROPRIETARY MATERIAL and is thus for use only by the intended recipient. If you received this in error, please contact the sender and delete the e-mail and its attachments from all computers.

---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]






---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]






---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to