On Wed, Jul 24, 2024 at 8:31 AM Mark Thomas <ma...@apache.org> wrote: > > On 23/07/2024 21:30, Christopher Schultz wrote: > > Mark, > > > > On 7/23/24 13:13, Mark Thomas wrote: > >> Prompted by some folks at $dayjob, I have been looking at the > >> performance of Tomcat's HTTP/2 implementation using [1] > >> > >> Initially, I was seeing ~79k req/s. > >> > >> Restoring lazy init for the StreamInputBuffer increased that to ~106k > >> req/s. > > > > O_O > > > >> Moving the HttpParser from Processor to Protocol increased that to > >> ~108k req/s. > >> > >> Now I am looking at recycling and reusing the coyote request and > >> response. That increases throughput to 124k req/s. > > > > This information would be good to put (with a datestamp and > > environmental details) into the documentation for discardFacades and/or > > similar capabilities. > > > > In Bratislava, we idly speculated that "throwing those objects away > > should not affect performance much and improve security" but if it > > really is a 15% speed improvement, it might be really critical for some > > applications. > > It really does depend on which objects you are talking about. Looking at > the flame graph for HTTP/2, it appears that the objects that require the > creation of buffers are the expensive ones to create. I thought we were > talking about the (inexpensive) facades in Bratislava. > > Someone (I forget who) tested the performance impact of not recycling > the processors and it was horrible.
That would be me. > >> Given the significant performance increase I am considering the > >> following: > >> - switching HTTP/2 to recycle and reuse coyote request and response > >> objects by default > > > > Note that we just changed that default in the other direction for > > HTTP/1.1. I think we should probably be consistent. > > I think you might be getting your objects mixed up. There are three sets: > a) coyote request/response > b) catalina request/response > c) catalina request/response facade > > Currently HTTP/2 recreates all of the above for every stream. > > HTTP/1.1 always recycles and re-uses a) and b). It is c) that we changed > to always create new objects by default for 9.0.x (to align with 10.1.x > and 11.0.x). > > This proposal would align HTTP/2 with HTTP/1.1 and recycle and re-use a) > and b) by default but with an option to re-create every time (mainly in > case there is a regression due to an application and/or Tomcat issue). +1 > >> - providing an option to restore the current behaviour of creating a new > >> coyote request and response object for every HTTP/2 stream > > > > +1 but with a different default. > > If that is for alignment with HTTP/1.1 then I disagree. We should > recycle and re-use a) and b). If it is to avoid possible regressions > then I think there is a discussion to be had due to the the performance > benefits vs regression risk trade off. +1 Having the extra setting is good, but there's no huge incentive for it to be the default. Rémy > Mark > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > For additional commands, e-mail: dev-h...@tomcat.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org