You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by 侯树成 <ch...@gmail.com> on 2013/12/27 08:09:14 UTC

how http connector backlog attribute works?

Hi,
I find a problem of http bio connector,I need help.
You can find it in flowing steps:

1.set tomcat connector like this:
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" acceptCount="1" maxThreads="1"
minSpareThreads="1"/>

2. deploy a war file, which contains a servlet that will sleep 60s in it's
doPost method

3. use LR or JMeter send 5 requests to the serlvet above

4. use command jstack print current thread stack

NOTE: now the main acceptor thread stack like this:
"http-bio-8080-Acceptor-0" daemon prio=6 tid=0x04b49800 nid=0x1a88 waiting
on condition [0x0536f000]
   java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x29a06cd0> (a
org.apache.tomcat.util.threads.LimitLatch$Sync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:969)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1281)
at
org.apache.tomcat.util.threads.LimitLatch.countUpOrAwait(LimitLatch.java:115)
at
org.apache.tomcat.util.net.AbstractEndpoint.countUpOrAwaitConnection(AbstractEndpoint.java:733)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:210)
at java.lang.Thread.run(Thread.java:662)

Now, In the 5 requests, 3 request will served correctly, but another 2
requests will received "Connection refused error" like this

Caused by: java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)

Why the 2 requests not entering the thread pool executor or taskQueue, but
get refused quickly?

Thanks in advance.

Re: how http connector backlog attribute works?

Posted by 侯树成 <ch...@gmail.com>.
Hi,
Today, I find the acceptCount  of connector is not work like it's config.
You can try it like this:
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" acceptCount="2" maxThreads="1"
minSpareThreads="1"/>

Also use LR/JMeter make more requests( >10) .  You will find that 5
requests will served correctly, others will be refused.

When the acceptCount=3
   <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" acceptCount="3" maxThreads="1"
minSpareThreads="1"/>

 You will find that 7 requests will served correctly, others will be
refused.


When the acceptCount=4
   <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" acceptCount="4" maxThreads="1"
minSpareThreads="1"/>

Also use LR/JMeter make more requests( >10) .  You will find that 9
requests will served correctly, others will be refused.

Yes, the SUCCESS requests = 2 * acceptCount + maxthead , is it right?

why the acceptCount is not work like it's configuration?

Could you help me?



2013/12/27 侯树成 <ch...@gmail.com>

> Yes, this must use BIO mode, because the NIO maxConnections=10000 in
> default, it won't block the LimitLatch. In my test case,(use JMeter, thread
> number is 5), 2 requests will refused soon(just 1s-2s later), then another
> 3 requests will served correctly.In source code, I find the backlog
> attribute will send to ServerSocket constructor, So, the backlog attribute
> is worked inside of JDK, not in Tomcat?
> Thank you all for reply.
>
>
> 2013/12/27 Mark Thomas <ma...@apache.org>
>
>> On 27/12/2013 08:53, Mark Eggers wrote:
>> > On 12/27/2013 12:37 AM, Mark Thomas wrote:
>> >> On 27/12/2013 07:27, Mark Eggers wrote:
>> >>> On 12/26/2013 11:09 PM, 侯树成 wrote:
>> >>
>> >>>> 1.set tomcat connector like this:
>> >>>>       <Connector port="8080" protocol="HTTP/1.1"
>> >>>>                  connectionTimeout="20000"
>> >>>>                  redirectPort="8443" acceptCount="1" maxThreads="1"
>> >>>> minSpareThreads="1"/>
>> >>>>
>> >>>> 2. deploy a war file, which contains a servlet that will sleep 60s in
>> >>>> it's
>> >>>> doPost method
>> >>>>
>> >>>> 3. use LR or JMeter send 5 requests to the serlvet above
>> >>>>
>> >>
>> >>> I'm going to guess based on the Tomcat 7 documentation:
>> >>>
>> >>> request 1 gets executed and sits in your doPost for 60 seconds
>> >>> request 2 consumes the minSpareThread
>> >>> request 3 consumes the acceptCount
>> >>>
>> >>> Per documentation, connections 4 and 5 are dropped immediately.
>> >>
>> >> That is almost right except that there should not be a spare thread at
>> >> step 2 since maxThreads includes any spare threads.
>> >>
>> >
>> > Yep, that's what I would expect as well. I was just trying to
>> > rationalize the third accept.
>> >
>> > I agree, I would think that 1 would be served, 2 would wait, and 3-5
>> > would be dropped.
>>
>> Figured it out. The OP is using BIO where maxConnections == maxThreads
>> by default.
>>
>> Request 1 uses the one available request processing thread.
>>
>> Request 2 is accepted but is blocked since the maximum number of
>> connections has been reached.
>>
>> Request 3 uses the accept count.
>>
>> Requests 4 & 5 are blocked.
>>
>> It might be worth a note in the docs that the number of connections
>> accepted will always be maxConnections + 1 with the "+ 1" being blocked
>> in the acceptor thread until the number of connections drops below
>> maxConnections again. I'll try and add something later today.
>>
>> Mark
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>> For additional commands, e-mail: users-help@tomcat.apache.org
>>
>>
>

Re: how http connector backlog attribute works?

Posted by Christopher Schultz <ch...@christopherschultz.net>.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

侯树成,

On 12/27/13, 4:24 AM, 侯树成 wrote:
> Yes, this must use BIO mode, because the NIO maxConnections=10000
> in default, it won't block the LimitLatch. In my test case,(use
> JMeter, thread number is 5), 2 requests will refused soon(just
> 1s-2s later), then another 3 requests will served correctly.In
> source code, I find the backlog attribute will send to ServerSocket
> constructor, So, the backlog attribute is worked inside of JDK, not
> in Tomcat?

The "backlog" is technically handled in the OS kernel/TCP stack. This
page is Linux-specific, but implements a BSD standard.

- -chris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
Comment: GPGTools - http://gpgtools.org
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQIcBAEBCAAGBQJSwaKaAAoJEBzwKT+lPKRYuwQP/2loOTXAeSXg15ptpUPOcRH6
8bKk/zf5bxuUCClrYSEaxiDT+RpD8yINynGZRrR+c+wVYuOBoKSSoFwpoFFgovrk
8KvNZHC6GC3/qDwDGs4t69cuiN/KBjLiSygJI/arxIoxDVbc1jKUzUsvGpBYC4Hm
FdiTddvyslQy+xR8Klw1Ak4ccTYKcZSPXDXZ/s9z8ELYlswAWq7LGRSJqdJI2BNG
Ja92dLSEQ4NTHSxfEXeWusrf51tJFqXLq1kjfALGlXdL9FC05Phc+PCXPBAbcQsW
acaUMy6ry8aqtZ3rdAdIHFSjxqHtxr5Ffehe8VmjcGXYqWBa7ez6q8zd+Ku9BDBB
NCna9X8NFRZT4J8/uJxaXiAiUvxUVEBG4uwRTMx8UebKWQNm8v25tKMHl0z0T/Jt
/YsqoTFjQ8/KniDrKaqTcn9BrQLiiTFUTI26t9e7S0V5xF2r8Pk98mkf0mCDl2+7
D7GCGAOwkOhyMFc9fQ2PGKzlKb3EjCas5+7ICRp6qFoa2NLvRls64E6iLlcAEcf1
lC86qqJbHVhE1KNAmSS0pGo/b7zTi54LkssmPzg7Z/3iJ0ugL0KbamPMfetr1HYP
9yINYpVlJK55zKgsvOz63UnUnciDJGxf9IRrgcGNZSaupPKbtj15ewqNLBr30X4F
sRcDOHUX8RdojgBljhAX
=ZYMg
-----END PGP SIGNATURE-----

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: how http connector backlog attribute works?

Posted by 侯树成 <ch...@gmail.com>.
Yes, this must use BIO mode, because the NIO maxConnections=10000 in
default, it won't block the LimitLatch. In my test case,(use JMeter, thread
number is 5), 2 requests will refused soon(just 1s-2s later), then another
3 requests will served correctly.In source code, I find the backlog
attribute will send to ServerSocket constructor, So, the backlog attribute
is worked inside of JDK, not in Tomcat?
Thank you all for reply.


2013/12/27 Mark Thomas <ma...@apache.org>

> On 27/12/2013 08:53, Mark Eggers wrote:
> > On 12/27/2013 12:37 AM, Mark Thomas wrote:
> >> On 27/12/2013 07:27, Mark Eggers wrote:
> >>> On 12/26/2013 11:09 PM, 侯树成 wrote:
> >>
> >>>> 1.set tomcat connector like this:
> >>>>       <Connector port="8080" protocol="HTTP/1.1"
> >>>>                  connectionTimeout="20000"
> >>>>                  redirectPort="8443" acceptCount="1" maxThreads="1"
> >>>> minSpareThreads="1"/>
> >>>>
> >>>> 2. deploy a war file, which contains a servlet that will sleep 60s in
> >>>> it's
> >>>> doPost method
> >>>>
> >>>> 3. use LR or JMeter send 5 requests to the serlvet above
> >>>>
> >>
> >>> I'm going to guess based on the Tomcat 7 documentation:
> >>>
> >>> request 1 gets executed and sits in your doPost for 60 seconds
> >>> request 2 consumes the minSpareThread
> >>> request 3 consumes the acceptCount
> >>>
> >>> Per documentation, connections 4 and 5 are dropped immediately.
> >>
> >> That is almost right except that there should not be a spare thread at
> >> step 2 since maxThreads includes any spare threads.
> >>
> >
> > Yep, that's what I would expect as well. I was just trying to
> > rationalize the third accept.
> >
> > I agree, I would think that 1 would be served, 2 would wait, and 3-5
> > would be dropped.
>
> Figured it out. The OP is using BIO where maxConnections == maxThreads
> by default.
>
> Request 1 uses the one available request processing thread.
>
> Request 2 is accepted but is blocked since the maximum number of
> connections has been reached.
>
> Request 3 uses the accept count.
>
> Requests 4 & 5 are blocked.
>
> It might be worth a note in the docs that the number of connections
> accepted will always be maxConnections + 1 with the "+ 1" being blocked
> in the acceptor thread until the number of connections drops below
> maxConnections again. I'll try and add something later today.
>
> Mark
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
>
>

Re: how http connector backlog attribute works?

Posted by Mark Thomas <ma...@apache.org>.
On 27/12/2013 08:53, Mark Eggers wrote:
> On 12/27/2013 12:37 AM, Mark Thomas wrote:
>> On 27/12/2013 07:27, Mark Eggers wrote:
>>> On 12/26/2013 11:09 PM, 侯树成 wrote:
>>
>>>> 1.set tomcat connector like this:
>>>>       <Connector port="8080" protocol="HTTP/1.1"
>>>>                  connectionTimeout="20000"
>>>>                  redirectPort="8443" acceptCount="1" maxThreads="1"
>>>> minSpareThreads="1"/>
>>>>
>>>> 2. deploy a war file, which contains a servlet that will sleep 60s in
>>>> it's
>>>> doPost method
>>>>
>>>> 3. use LR or JMeter send 5 requests to the serlvet above
>>>>
>>
>>> I'm going to guess based on the Tomcat 7 documentation:
>>>
>>> request 1 gets executed and sits in your doPost for 60 seconds
>>> request 2 consumes the minSpareThread
>>> request 3 consumes the acceptCount
>>>
>>> Per documentation, connections 4 and 5 are dropped immediately.
>>
>> That is almost right except that there should not be a spare thread at
>> step 2 since maxThreads includes any spare threads.
>>
> 
> Yep, that's what I would expect as well. I was just trying to
> rationalize the third accept.
> 
> I agree, I would think that 1 would be served, 2 would wait, and 3-5
> would be dropped.

Figured it out. The OP is using BIO where maxConnections == maxThreads
by default.

Request 1 uses the one available request processing thread.

Request 2 is accepted but is blocked since the maximum number of
connections has been reached.

Request 3 uses the accept count.

Requests 4 & 5 are blocked.

It might be worth a note in the docs that the number of connections
accepted will always be maxConnections + 1 with the "+ 1" being blocked
in the acceptor thread until the number of connections drops below
maxConnections again. I'll try and add something later today.

Mark


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: how http connector backlog attribute works?

Posted by Mark Eggers <it...@yahoo.com>.
On 12/27/2013 12:37 AM, Mark Thomas wrote:
> On 27/12/2013 07:27, Mark Eggers wrote:
>> On 12/26/2013 11:09 PM, 侯树成 wrote:
>
>>> 1.set tomcat connector like this:
>>>       <Connector port="8080" protocol="HTTP/1.1"
>>>                  connectionTimeout="20000"
>>>                  redirectPort="8443" acceptCount="1" maxThreads="1"
>>> minSpareThreads="1"/>
>>>
>>> 2. deploy a war file, which contains a servlet that will sleep 60s in
>>> it's
>>> doPost method
>>>
>>> 3. use LR or JMeter send 5 requests to the serlvet above
>>>
>
>> I'm going to guess based on the Tomcat 7 documentation:
>>
>> request 1 gets executed and sits in your doPost for 60 seconds
>> request 2 consumes the minSpareThread
>> request 3 consumes the acceptCount
>>
>> Per documentation, connections 4 and 5 are dropped immediately.
>
> That is almost right except that there should not be a spare thread at
> step 2 since maxThreads includes any spare threads.
>

Yep, that's what I would expect as well. I was just trying to 
rationalize the third accept.

I agree, I would think that 1 would be served, 2 would wait, and 3-5 
would be dropped.

> I'd expect request 2 to use the accept count and 3, 4 & 5 to be dropped.
> There may be an off-by-one error somewhere or it could just be an
> artefact of how the limit is enforced.
>
>> Please read the following and see if my interpretation is reasonable:
>>
>> http://tomcat.apache.org/tomcat-7.0-doc/config/http.html
>>
>> Pay particular attention to the Introduction section.
>>
>> If I have the particulars wrong, hopefully someone will come along and
>> correct me.
>
> Mark

I guess some tests are in order?

/mde/


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: how http connector backlog attribute works?

Posted by Mark Thomas <ma...@apache.org>.
On 27/12/2013 07:27, Mark Eggers wrote:
> On 12/26/2013 11:09 PM, 侯树成 wrote:

>> 1.set tomcat connector like this:
>>      <Connector port="8080" protocol="HTTP/1.1"
>>                 connectionTimeout="20000"
>>                 redirectPort="8443" acceptCount="1" maxThreads="1"
>> minSpareThreads="1"/>
>>
>> 2. deploy a war file, which contains a servlet that will sleep 60s in
>> it's
>> doPost method
>>
>> 3. use LR or JMeter send 5 requests to the serlvet above
>>

> I'm going to guess based on the Tomcat 7 documentation:
> 
> request 1 gets executed and sits in your doPost for 60 seconds
> request 2 consumes the minSpareThread
> request 3 consumes the acceptCount
> 
> Per documentation, connections 4 and 5 are dropped immediately.

That is almost right except that there should not be a spare thread at
step 2 since maxThreads includes any spare threads.

I'd expect request 2 to use the accept count and 3, 4 & 5 to be dropped.
There may be an off-by-one error somewhere or it could just be an
artefact of how the limit is enforced.

> Please read the following and see if my interpretation is reasonable:
> 
> http://tomcat.apache.org/tomcat-7.0-doc/config/http.html
> 
> Pay particular attention to the Introduction section.
> 
> If I have the particulars wrong, hopefully someone will come along and
> correct me.

Mark


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: how http connector backlog attribute works?

Posted by Mark Eggers <it...@yahoo.com>.
On 12/26/2013 11:09 PM, 侯树成 wrote:
> Hi,
> I find a problem of http bio connector,I need help.
> You can find it in flowing steps:
>
> 1.set tomcat connector like this:
>      <Connector port="8080" protocol="HTTP/1.1"
>                 connectionTimeout="20000"
>                 redirectPort="8443" acceptCount="1" maxThreads="1"
> minSpareThreads="1"/>
>
> 2. deploy a war file, which contains a servlet that will sleep 60s in it's
> doPost method
>
> 3. use LR or JMeter send 5 requests to the serlvet above
>
> 4. use command jstack print current thread stack
>
> NOTE: now the main acceptor thread stack like this:
> "http-bio-8080-Acceptor-0" daemon prio=6 tid=0x04b49800 nid=0x1a88 waiting
> on condition [0x0536f000]
>     java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for  <0x29a06cd0> (a
> org.apache.tomcat.util.threads.LimitLatch$Sync)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:969)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1281)
> at
> org.apache.tomcat.util.threads.LimitLatch.countUpOrAwait(LimitLatch.java:115)
> at
> org.apache.tomcat.util.net.AbstractEndpoint.countUpOrAwaitConnection(AbstractEndpoint.java:733)
> at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:210)
> at java.lang.Thread.run(Thread.java:662)
>
> Now, In the 5 requests, 3 request will served correctly, but another 2
> requests will received "Connection refused error" like this
>
> Caused by: java.net.ConnectException: Connection refused: connect
> at java.net.PlainSocketImpl.socketConnect(Native Method)
> at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
> at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
> at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
> at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
> at java.net.Socket.connect(Socket.java:529)
>
> Why the 2 requests not entering the thread pool executor or taskQueue, but
> get refused quickly?
>
> Thanks in advance.
>

I'm going to guess based on the Tomcat 7 documentation:

request 1 gets executed and sits in your doPost for 60 seconds
request 2 consumes the minSpareThread
request 3 consumes the acceptCount

Per documentation, connections 4 and 5 are dropped immediately.

Please read the following and see if my interpretation is reasonable:

http://tomcat.apache.org/tomcat-7.0-doc/config/http.html

Pay particular attention to the Introduction section.

If I have the particulars wrong, hopefully someone will come along and 
correct me.

. . . just my two cents
/mde/

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: how http connector backlog attribute works?

Posted by André Warnier <aw...@ice-sa.com>.
侯树成 wrote:
> Hi,
> I find a problem of http bio connector,I need help.
> You can find it in flowing steps:
> 
> 1.set tomcat connector like this:
>     <Connector port="8080" protocol="HTTP/1.1"
>                connectionTimeout="20000"
>                redirectPort="8443" acceptCount="1" maxThreads="1"
> minSpareThreads="1"/>
> 
> 2. deploy a war file, which contains a servlet that will sleep 60s in it's
> doPost method
> 
> 3. use LR or JMeter send 5 requests to the serlvet above
> 
> 4. use command jstack print current thread stack
> 
> NOTE: now the main acceptor thread stack like this:
> "http-bio-8080-Acceptor-0" daemon prio=6 tid=0x04b49800 nid=0x1a88 waiting
> on condition [0x0536f000]
>    java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for  <0x29a06cd0> (a
> org.apache.tomcat.util.threads.LimitLatch$Sync)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:969)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1281)
> at
> org.apache.tomcat.util.threads.LimitLatch.countUpOrAwait(LimitLatch.java:115)
> at
> org.apache.tomcat.util.net.AbstractEndpoint.countUpOrAwaitConnection(AbstractEndpoint.java:733)
> at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:210)
> at java.lang.Thread.run(Thread.java:662)
> 
> Now, In the 5 requests, 3 request will served correctly, but another 2
> requests will received "Connection refused error" like this
> 
> Caused by: java.net.ConnectException: Connection refused: connect
> at java.net.PlainSocketImpl.socketConnect(Native Method)
> at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
> at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
> at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
> at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
> at java.net.Socket.connect(Socket.java:529)
> 
> Why the 2 requests not entering the thread pool executor or taskQueue, but
> get refused quickly?
> 
> Thanks in advance.
> 
Which java and Tomcat versions ?


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org