tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Anton Piatek1 <anton.pia...@uk.ibm.com>
Subject Re: websockets holding on to threads.
Date Mon, 08 Apr 2013 08:05:39 GMT
"Howard W. Smith, Jr." <smithh032772@gmail.com> wrote on 05/04/2013 
21:22:33:
> On Fri, Apr 5, 2013 at 9:07 AM, Anton Piatek1 
<anton.piatek@uk.ibm.com>wrote:
> 
> > I am seeing what at first appears to be a bug, but given the lack of 
other
> > reports I can't believe I am the only person seeing this, so maybe it 
is
> > user-error.
> >
> > I have tomcat (was 7.0.30, but I just tried with 7.0.39) running a 
website
> > which uses websockets. The websockets code in tomcat isn't that
> > complicated - My servlet returns a new subclass of StreamInbound which 
has
> > overridden the onTextData() and onBinaryData() methods. This seems to
> > generally work fine, and I can send and receive data happily.
> >
> > However when I load up several browser windows I find that tomcat 
hangs. I
> > used jconsole to check the tomcat threads and found that as I open 
each
> > new websocket, the tomcat worker threads go from idle threads waiting 
for
> > work to the following busy, blocking threads waiting for websocket 
data.
> >
> >
> I have not written low-level websocket code as you are doing, but I 
think I
> have seen this behavior even in/with my app, and others have reported 
and
> discussed this issue in more ways than one.
> 
> I am using Atmosphere Framework via PrimeFaces Push to implement 
websockets
> in my app, and it does work well with one browser tab/window, but it is
> commonly reported that websockets do not work when one client (machine) 
has
> multiple simultaneous websocket connections to the server.
> 
> Since I use Atmosphere Framework, I searched their google groups for the
> following:
> 
> browser windows
> 
> and found the following (URL and quote from page at URL below):
> 
> https://github.com/Atmosphere/atmosphere/issues/493
> 
> According to HTTP RFC<
http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html>
> :
> 
> Clients that use persistent connections SHOULD limit the number of
> simultaneous connections that they maintain to a given server. A
> single-user client SHOULD NOT maintain more than 2 connections with any
> server or proxy.
> 
> This can cause problems if you have multiple tabs/window open, which all
> maintain a persistent connection. It would be great if persistent
> connections should be shared (as GWT or Bayeux
> Protocol<http://svn.cometd.com/trunk/bayeux/bayeux.htm> does
> it).

Multiple tabs/windows is one thing, but multiple clients are just as big a 
problem.

Have you looked at how many tomcat threads you have running and what 
happens to each of them as you open more websockets? What if you open more 
websockets than you have threads... 

> > Name: http-bio-4415-exec-5
> > State: RUNNABLE
> > Total blocked: 50  Total waited: 112
> >
> > Stack trace:
> > java.net.SocketInputStream.socketRead0(Native Method)
> > java.net.SocketInputStream.read(SocketInputStream.java:161)
> > java.net.SocketInputStream.read(SocketInputStream.java:132)
> >
> > org.apache.coyote.http11.upgrade.UpgradeBioProcessor.read
> (UpgradeBioProcessor.java:81)
> > org.apache.catalina.websocket.WsFrame.nextFrame(WsFrame.java:214)
> >
> > 
org.apache.catalina.websocket.WsInputStream.nextFrame(WsInputStream.java:68)
> > 
org.apache.catalina.websocket.StreamInbound.onData(StreamInbound.java:149)
> >
> > org.apache.coyote.http11.upgrade.UpgradeProcessor.upgradeDispatch
> (UpgradeProcessor.java:83)
> >
> > org.apache.coyote.AbstractProtocol
> $AbstractConnectionHandler.process(AbstractProtocol.java:587)
> >
> > org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run
> (JIoEndpoint.java:310)
> >    - locked org.apache.tomcat.util.net.SocketWrapper@ddb0d168
> >
> > java.util.concurrent.ThreadPoolExecutor.runWorker
> (ThreadPoolExecutor.java:1156)
> >
> > java.util.concurrent.ThreadPoolExecutor$Worker.run
> (ThreadPoolExecutor.java:626)
> > java.lang.Thread.run(Thread.java:780)
> >
> > I am trying to figure out what I am missing. I didn't think I needed 
to
> > override StreamInbound.onData() in my class, but as that seems to be 
what
> > is keeping the thread busy, presumably waiting for data looking at 
that
> > stack.
> >
> > Am I misunderstanding something, or is this possibly a tomcat bug?
> >
> 
> I don't think this is a tomcat bug, but I could be mistaking.

My thinking about it being a bug is that to support N clients with 
websockets, you need N threads available on tomcat, even though they are 
only getting updates every x seconds. 

It becomes trivial to denial-of-service a tomcat running websockets with 
this sort of behaviour, as all you have to do is open 10 websockets which 
lock up all 10 tomcat worker threads. Now nobody can connect to tomcat.
Sure, I can increase the number of tomcat threads, but if I want to 
support 1000 concurrent users, I need well over 1000 tomcat threads to 
achieve this!

Anton





Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number 
741598. 
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message