Hi, Christopher, Please find the answer in-line: How... exactly? private String getRequestBody(HttpServletRequest request) throws IOException { StringBuilder sb = new StringBuilder(); BufferedReader reader = request.getReader(); try { String line; while( ( line = reader.readLine() ) != null ) { sb.append( line ).append( '\n' ); } } finally { reader.close(); } return sb.toString(); } I am trying to reproduce the StackOverflowError with a sample application , Once it is reproduced I will share it across.
Thanks and Regards Arshiya Shariff -----Original Message----- From: Christopher Schultz <ch...@christopherschultz.net> Sent: Thursday, October 15, 2020 12:01 AM To: users@tomcat.apache.org Subject: Re: FW: HTTP2: memory filled up fast on increasing the connections to 1000/2000 (Embedded tomcat 9.0.38) Arshiya, On 10/14/20 01:23, Arshiya Shariff wrote: > Please find the answers in-line Mark. > > Http2 requests with message payload of 34KB are pumped from JMeter at > 20 TPS with 700 connections to an application with Embedded tomcat > - 9.0.39 (max-Threads : 200, all other values are the tomcat > defaults) > >> What does that URL do with the POSTed content? Ignore it? Read it >> from an InputStream? Read it via getParameter()? > > The posted content is read via BufferedReader reader = > request.getReader() and processed asynchronously How... exactly? > Is JMeter run on the same machine as Tomcat? > JMeter is run from a different machine. > > Do you use the JMeter GUI or the command line? > Launched via Command line (JMeter heap increased to 10 GB ) > > What are the specs of the server(s) being used? > The server is a VM with 12 CPUs and 120 GB RAM > > Please let us know if you require more details. This would probabyl be easier if you'd just provide a test-case: a sample (simple!) web application which reproduces what you are reporting. -chris > -----Original Message----- > From: Mark Thomas <ma...@apache.org> > Sent: Monday, October 12, 2020 7:28 PM > To: users@tomcat.apache.org > Subject: Re: HTTP2: memory filled up fast on increasing the > connections to 1000/2000 (Embedded tomcat 9.0.38) > > On 12/10/2020 08:02, Arshiya Shariff wrote: >> Hi Mark , >> >> The issue is reproduced with version 9.0.39 as well. Max threads in Tomcat >> is 200. >> >> Please find the case: >> Client:JMeter 5.2.1 (With http2 plugin) >> TPS: around 20 >> No of users from JMeter : 700 >> Message payload size: 6 KB to 34 KB >> Loop: Infinite >> We let the loop run infinitely and see the java.lang.StackOverflowError >> trace printed multiple times in the log within few minutes of starting the >> test. > > POSTing to what URL? > > What does that URL do with the POSTed content? Ignore it? Read it from an > InputStream? Read it via getParameter()? > > Is JMeter run on the same machine as Tomcat? > > Do you use the JMeter GUI or the command line? > > What are the specs of the server(s) being used? > > You need to provide the exact steps to recreate this issue on a clean install > of Tomcat 9.0.39 as provided by the ASF. > > Mark > > >> Please help us with this . What is the impact of StackOverflowError ? >> >> Thanks and Regards >> Arshiya Shariff >> >> -----Original Message----- >> From: Mark Thomas <ma...@apache.org> >> Sent: Friday, October 9, 2020 5:31 PM >> To: users@tomcat.apache.org >> Subject: Re: HTTP2: memory filled up fast on increasing the >> connections to 1000/2000 (Embedded tomcat 9.0.38) >> >> On 09/10/2020 12:32, Arshiya Shariff wrote: >>> Hi, >>> >>> Mark , with the test runs that I performed over clean 9.0.x branch I was >>> not able to reproduce this. >> >> Good. But I'd really like to understand why... >> >>> But with 9.0.38 and the jars built from 9.0.x with hash: >>> c8ec2d4cde3a31b0e9df9a30e7915d77ba725545 , with 700 or 1000 users >>> (connections) and on sending 1000 Requests per second (or even lesser) , >>> payload of 16K from JMeter I can see that this Exception occurs within few >>> minutes of starting the test . The maxThreads configured in tomcat is 200 . >>> >>> How often do you see these errors in your test run? >>> Randomly, at times 2 or 3 such traces. >> >> OK. Definitely a timing issue then. >> >>> Do you have the other end of that stack trace? >>> It is only the two lines that is recursively printed till the end about >>> ~500 times in one trace : >>> at >>> org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper$NioOperationState.run(NioEndpoint.java:1511) >>> at >>> org.apache.tomcat.util.net.SocketWrapperBase$VectoredIOCompletionHan >>> d >>> l >>> er.completed(SocketWrapperBase.java:1100) >> >> Doesn't tell me much unfortunately. >> >>> I see the trace starting with : >>> Exception in thread "http-nio-x.y.z-1090-exec-107" >>> java.lang.StackOverflowError >>> at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:446) >>> at org.apache.tomcat.util.net.NioChannel.read(NioChannel.java:174) >>> at >>> org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper$NioOperationState.run(NioEndpoint.java:1468) >>> at >>> org.apache.tomcat.util.net.SocketWrapperBase$VectoredIOCompletionHan >>> d >>> l >>> er.completed(SocketWrapperBase.java:1100) >>> >>> (OR) >>> >>> Exception in thread "http-nio-x.y.z-1090-exec-87" >>> java.lang.StackOverflowError >>> at sun.nio.ch.IOVecWrapper.get(IOVecWrapper.java:96) >>> at sun.nio.ch.IOUtil.read(IOUtil.java:240) >>> at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:440) >>> at org.apache.tomcat.util.net.NioChannel.read(NioChannel.java:174) >>> at >>> org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper$NioOperationState.run(NioEndpoint.java:1468) >>> at >>> org.apache.tomcat.util.net.SocketWrapperBase$VectoredIOCompletionHandler.completed(SocketWrapperBase.java:1100) >>> at >>> org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper$NioOperationState.run(NioEndpoint.java:1511) >>> at >>> org.apache.tomcat.util.net.SocketWrapperBase$VectoredIOCompletionHandler.completed(SocketWrapperBase.java:1100) >>> ..... >>> ..... >>> ..... >>> ..... >>> at >>> org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper$NioOperationState.run(NioEndpoint.java:1511) >>> at >>> org.apache.tomcat.util.net.SocketWrapperBase$VectoredIOCompletionHandler.completed(SocketWrapperBase.java:1100) >>> at >>> org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper$NioOperationState.run(NioEndpoint.java:1511) >>> at >>> org.apache.tomcat.util.net.SocketWrapperBase$VectoredIOCompletionHan >>> d >>> l >>> er.completed(SocketWrapperBase.java:1100) >>> >>> Is there anything that was fixed around this in latest 9.0.x branch ? >> >> Not obviously. I've reviewed every commit since c8ec2d4c. There is nothing >> that directly works with the I/O. There is 1e97ab2 which fixes a relatively >> recent regression in the HTTP/2 code. I guess it is possible (but it seems a >> bit of a stretch) that that bug is triggering an issue in JMeter which in >> turn is sending invalid HTTP/2 packets. >> >> I think at this point, given the relatively small number of commits between >> c8ec2d4c and HEAD, the most useful thing you could do is run a binary search >> to find out at which commit the issue is fixed. If we know which commit to >> look at that should help track down the root cause. >> >> Mark >> >>> >>> Thanks and Regards >>> Arshiya Shariff >>> >>> -----Original Message----- >>> From: Mark Thomas <ma...@apache.org> >>> Sent: Monday, October 5, 2020 9:52 PM >>> To: users@tomcat.apache.org >>> Subject: Re: HTTP2: memory filled up fast on increasing the >>> connections to 1000/2000 (Embedded tomcat 9.0.38) >>> >>> On 05/10/2020 10:56, Arshiya Shariff wrote: >>>> Hi All, >>>> >>>> Thank you so much Mark . >>>> We tested the jars built from latest 9.0.x with 2000 / 5000 users >>>> (connections) from JMeter , We see a very good improvement with the >>>> heap usage >>> >>> Good news. As is the fact that the other errors have been cleared up. >>> >>>> But I see this exception printed multiple times , I am not sure why this >>>> occurs : >>>> Exception in thread "http-nio-x.y.z-1234-exec-213" >>>> java.lang.StackOverflowError >>>> at sun.nio.ch.IOUtil.read(IOUtil.java:240) >>>> at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:440) >>>> at org.apache.tomcat.util.net.NioChannel.read(NioChannel.java:174) >>>> at >>>> org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper$NioOperationState.run(NioEndpoint.java:1468) >>>> at >>>> org.apache.tomcat.util.net.SocketWrapperBase$VectoredIOCompletionHandler.completed(SocketWrapperBase.java:1100) >>>> at >>>> org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper$NioOperationState.run(NioEndpoint.java:1511) >>>> at >>>> org.apache.tomcat.util.net.SocketWrapperBase$VectoredIOCompletionHandler.completed(SocketWrapperBase.java:1100) >>>> at >>>> org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper$NioOperationState.run(NioEndpoint.java:1511) >>>> at >>>> org.apache.tomcat.util.net.SocketWrapperBase$VectoredIOCompletionHandler.completed(SocketWrapperBase.java:1100) >>>> at >>>> org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper$NioOperatio >>>> n >>>> S >>>> t >>>> ate.run(NioEndpoint.java:1511) >>> >>> That looks like an infinite loop reading an incoming frame. >>> New frames are read using a 9 byte buffer for the header and a 16k buffer >>> for the payload (since Tomcat sets this as the max frame size). >>> >>> The loop is occurring because one of those buffers is simultaneously both >>> full and still has more data to read. That should not be possible and I >>> haven't yet been able to figure out how this is happening. >>> >>> How easy is this to reproduce? >>> >>> How often do you see these errors in your test run? >>> >>> Do you have a reliable test case that reproduces this on a clean Tomcat >>> 9.0.x build? If is, can you share the details? >>> >>> Do you have the other end of that stack trace? I'm interested in how the >>> code enters the loop. >>> >>> Thanks, >>> >>> Mark >>> >>> -------------------------------------------------------------------- >>> - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org >>> For additional commands, e-mail: users-h...@tomcat.apache.org >>> >>> >>> -------------------------------------------------------------------- >>> - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org >>> For additional commands, e-mail: users-h...@tomcat.apache.org >>> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org >> For additional commands, e-mail: users-h...@tomcat.apache.org >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org >> For additional commands, e-mail: users-h...@tomcat.apache.org >> > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org > For additional commands, e-mail: users-h...@tomcat.apache.org > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org > For additional commands, e-mail: users-h...@tomcat.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org