(sorry for the previous reply, wrong account) and sorry I wasn't clear enough: I already use the replace directive for x/net. this works fine for the POC but only when explicitly using a http2 transport. But this doesn't for the net/http because of the h2_bundle thing. see https://www.youtube.com/watch?v=FARQMJndUn0&t=814s So for instance if I change the line golang.org/x/net/http2/transport.go:2418 like you suggested in github it's not working with the default http server unless I rebuild the std lib.
On Friday, November 19, 2021 at 6:34:11 PM UTC+1 ren...@ix.netcom.com wrote: > > Use the replace directive to point the net package to your local copy. > > Much easier to test X changes than stdlib changes. > > On Nov 19, 2021, at 10:58 AM, Kirth Gersen <kirth...@gmail.com> wrote: > > Your CL works well with the POC. > > > Side question not specific to this issue: how to test changes to > golang.org/x/net with net/http ? > The 'h2_bundle' trick with go generate & bundle requires to fork the std > lib too ? > I have a hard time figuring how to do this. I tried with gotip but I get > an error with "gotip generate" (bundle: internal error: package "strings" > without types was imported from "golang.org/x/net/http2") > Any doc/tutorial on how to deal with this 'bundle' trick ? > > thx > Le lundi 15 novembre 2021 à 17:32:48 UTC+1, ren...@ix.netcom.com a écrit : > >> Since http2 multiplexes streams it will delicately affect latency on >> other streams. This is why I suggested using multiple transports - one for >> high throughput transfers and another for lower latency “interactive” >> sessions. >> >> On Nov 15, 2021, at 9:23 AM, Kevin Chowski <ke...@chowski.com> wrote: >> >> These are interesting results, thanks for investigating and sharing >> results! >> >> >> I see that you have mostly been focusing on throughput in your posts, >> have you done testing for latency differences too? >> >> On Saturday, November 13, 2021 at 6:11:40 PM UTC-7 ren...@ix.netcom.com >> wrote: >> >>> As another data point, I decided to test a few implementations of http2 >>> downloads on OSX. >>> >>> Using a Go server with default frame size (16k): >>> >>> Go client: 900 MB/s >>> Java client: 1300 MB/s >>> curl: 1500 MB/s >>> >>> Using a Java server with default frame size (16k): >>> >>> Go client: 670 MB/s >>> Java client: 720 MB/s >>> curl: 800 M/s >>> >>> Using Go server using 256k client max frame size: >>> >>> Go client: 2350 MB/s >>> Java client: 2800 MB/s >>> h2load: 4300 MB/s >>> >>> Using Java server using 256k client max frame size: >>> >>> Go client: 2900 MB/s >>> Java client: 2800 MB/s >>> h2load: 3750 MB/s >>> >>> For h2load, I needed to create a PR to allow the frame size to be set, >>> see https://github.com/nghttp2/nghttp2/pull/1640 >>> >>> >>> On Nov 10, 2021, at 7:04 PM, robert engels <ren...@ix.netcom.com> wrote: >>> >>> No worries. I updated the issue and the CL. I will comment in the CL >>> with a few more details. >>> >>> On Nov 10, 2021, at 2:30 PM, Andrey T. <xnow4f...@sneakemail.com> wrote: >>> >>> Thank you Robert, >>> I somehow missed the reference to the ticket in the first message, sorry >>> about that. >>> >>> As for the CL - I think adding link to the github issue, and add a bit >>> of explanation in a commit message would help. >>> I added link to your CL to the github issue's discussion, hopefully it >>> will bring more attention to it. >>> >>> A. >>> >>> On Wednesday, November 10, 2021 at 1:22:42 PM UTC-7 ren...@ix.netcom.com >>> wrote: >>> >>>> As reported in the OP, the issue was filed long ago >>>> https://github.com/golang/go/issues/47840 >>>> >>>> My CL https://go-review.googlesource.com/c/net/+/362834 is a viable >>>> fix (and should of been supported originally). >>>> >>>> On Nov 10, 2021, at 12:59 PM, Andrey T. <xnow4f...@sneakemail.com> >>>> wrote: >>>> >>>> Fellas, >>>> I would say the 5x throughput difference is a serious problem.Would you >>>> be kind and open an issue on github about it? >>>> Also, the PR that you have might benefit from explanation about what >>>> you are trying to solve (and probably link to an issue on github), so it >>>> would get more attention. >>>> >>>> Thanks! >>>> >>>> Andrey >>>> >>>> >>>> On Tuesday, November 9, 2021 at 4:50:34 PM UTC-7 ren...@ix.netcom.com >>>> wrote: >>>> >>>>> Well, I figured out a way to do it simply. The CL is here >>>>> https://go-review.googlesource.com/c/net/+/362834 >>>>> >>>>> The frame size will be used for all connections using that transport, >>>>> so it is probably better to create a transport specifically for the >>>>> high-throughput transfers. >>>>> >>>>> You can also create perform single shot requests like: >>>>> >>>>> if useH2C { >>>>> rt = &http2.Transport{ >>>>> AllowHTTP: true, >>>>> DialTLS: func(network, addr string, cfg *tls.Config) >>>>> (net.Conn, error) { >>>>> return dialer.Dial(network, addr) >>>>> }, >>>>> MaxFrameSize: 1024*256, >>>>> } >>>>> } >>>>> >>>>> var body io.ReadCloser = http.NoBody >>>>> >>>>> req, err := http.NewRequestWithContext(ctx, "GET", url, body) >>>>> if err != nil { >>>>> return err >>>>> } >>>>> >>>>> resp, err := rt.RoundTrip(req) >>>>> >>>>> >>>>> On Nov 9, 2021, at 3:31 PM, Robert Engels <ren...@ix.netcom.com> >>>>> wrote: >>>>> >>>>> To be clear, I have no plans to submit a Cl to improve this at this >>>>> time. >>>>> >>>>> It would require some api changes to implement properly. >>>>> >>>>> On Nov 9, 2021, at 12:19 PM, Kirth Gersen <kirth...@gmail.com> wrote: >>>>> >>>>> Great ! >>>>> >>>>> > *I made some local mods to the net library, increasing the frame >>>>> size to 256k, and the http2 performance went from 8Gbps to 38Gbps.* >>>>> That is already enormous for us. thx for finding this. >>>>> >>>>> 4 -> Indeed a lot of WINDOW_UPDATE messages are visible when >>>>> using GODEBUG=http2debug=1 >>>>> >>>>> >>>>> On Tuesday, November 9, 2021 at 6:28:16 PM UTC+1 ren...@ix.netcom.com >>>>> wrote: >>>>> >>>>>> I did a review of the codebase. >>>>>> >>>>>> Http2 is a multiplexed protocol with independent streams. The Go >>>>>> implementation uses a common reader thread/routine to read all of the >>>>>> connection content, and then demuxes the streams and passes the data via >>>>>> pipes to the stream readers. This multithreaded nature requires the use >>>>>> of >>>>>> locks to coordinate. By managing the window size, the connection reader >>>>>> should never block writing to a steam buffer - but a stream reader may >>>>>> stall waiting for data to arrive - get descheduled - only to be quickly >>>>>> rescheduled when reader places more data in the buffer - which is >>>>>> inefficient. >>>>>> >>>>>> Out of the box on my machine, http1 is about 37 Gbps, and http2 is >>>>>> about 7 Gbps on my system. >>>>>> >>>>>> Some things that jump out: >>>>>> >>>>>> 1. The chunk size is too small. Using 1MB pushed http1 from 37 Gbs to >>>>>> 50 Gbps, and http2 to 8 Gbps. >>>>>> >>>>>> 2. The default buffer in io.Copy() is too small. Use io.CopyBuffer() >>>>>> with a larger buffer - I changed to 4MB. This pushed http1 to 55 Gbs, >>>>>> and >>>>>> http2 to 8.2. Not a big difference but needed for later. >>>>>> >>>>>> 3. The http2 receiver frame size of 16k is way too small. There is >>>>>> overhead on every frame - the most costly is updating the window. >>>>>> >>>>>> *I made some local mods to the net library, increasing the frame size >>>>>> to 256k, and the http2 performance went from 8Gbps to 38Gbps.* >>>>>> >>>>>> 4. I haven’t tracked it down yet, but I don’t think the window size >>>>>> update code is not working as intended - it seems to be sending window >>>>>> updates (which are expensive due to locks) far too frequently. I think >>>>>> this >>>>>> is the area that could use the most improvement - using some heuristics >>>>>> there is the possibility to detect the sender rate, and adjust the >>>>>> refresh >>>>>> rate (using high/low water marks). >>>>>> >>>>>> 5. The implementation might need improvements using lock-free >>>>>> structures, atomic counters, and busy-waits in order to achieve maximum >>>>>> performance. >>>>>> >>>>>> So 38Gbps for http2 vs 55 Gbps for http1. Better but still not great. >>>>>> Still, with some minor changes, the net package could allow setting of a >>>>>> large frame size on a per stream basis - which would enable much higher >>>>>> throughput. The gRPC library allows this. >>>>>> >>>>>> On Nov 8, 2021, at 10:58 AM, Kirth Gersen <kirth...@gmail.com> wrote: >>>>>> >>>>>> http/2 implementation seems ~5x slower in bytes per seconds (when >>>>>> transfer is cpu capped). >>>>>> >>>>>> POC: https://github.com/nspeed-app/http2issue >>>>>> >>>>>> I submitted an issue about this 3 months ago in the Go Github ( >>>>>> https://github.com/golang/go/issues/47840 ) but first commenter >>>>>> misunderstood it and it got buried (they're probably just swamped with >>>>>> too >>>>>> many open issues (5k+...)). >>>>>> >>>>>> Everything using Golang net/http is impacted, the Caddy web server >>>>>> for instance. >>>>>> >>>>>> I know it probably doesn't matter for most use cases because it's >>>>>> only noticeable with high throughput transfers (>1 Gbps). >>>>>> Most http benchmarks focus on "requests per second" and not "bits per >>>>>> seconds" but this performance matters too sometimes. >>>>>> >>>>>> If anyone with expertise in profiling Go code and good knowledge of >>>>>> the net/http lib internal could take a look. It would be nice to >>>>>> optimize >>>>>> it or at least have an explanation. >>>>>> >>>>>> thx (sorry if wrong group to post this). >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "golang-nuts" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to golang-nuts...@googlegroups.com. >>>>>> To view this discussion on the web visit >>>>>> https://groups.google.com/d/msgid/golang-nuts/89926c2f-ec73-43ad-be49-a8bc76a18345n%40googlegroups.com >>>>>> >>>>>> <https://groups.google.com/d/msgid/golang-nuts/89926c2f-ec73-43ad-be49-a8bc76a18345n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>> . >>>>>> >>>>>> >>>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "golang-nuts" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to golang-nuts...@googlegroups.com. >>>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/golang-nuts/7332f727-6716-4c4d-85c5-a86cacd0c89fn%40googlegroups.com >>>>> >>>>> <https://groups.google.com/d/msgid/golang-nuts/7332f727-6716-4c4d-85c5-a86cacd0c89fn%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>>> >>>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "golang-nuts" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to golang-nuts...@googlegroups.com. >>>> >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/golang-nuts/1bfe6aec-abd2-4f63-bf77-bbfa6fd213ban%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/golang-nuts/1bfe6aec-abd2-4f63-bf77-bbfa6fd213ban%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>>> >>>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "golang-nuts" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to golang-nuts...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/golang-nuts/1b63863b-45af-45d0-a885-8716acc65ac7n%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/golang-nuts/1b63863b-45af-45d0-a885-8716acc65ac7n%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >>> >>> >>> -- >> You received this message because you are subscribed to the Google Groups >> "golang-nuts" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to golang-nuts...@googlegroups.com. >> >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/golang-nuts/3138434b-d480-4473-8b20-2598412a0eden%40googlegroups.com >> >> <https://groups.google.com/d/msgid/golang-nuts/3138434b-d480-4473-8b20-2598412a0eden%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> >> -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts...@googlegroups.com. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/03b1493a-bf8a-4cd2-b10d-20e2cc57cad9n%40googlegroups.com > > <https://groups.google.com/d/msgid/golang-nuts/03b1493a-bf8a-4cd2-b10d-20e2cc57cad9n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/4b30e2d5-05bb-41bb-9b07-93dd7d3a6727n%40googlegroups.com.