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 <kirthal...@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. >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> 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. >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> 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. >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> 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. >>>>> >>>> >>> >>> -- >>> 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. > > -- > 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/03b1493a-bf8a-4cd2-b10d-20e2cc57cad9n%40googlegroups.com. -- 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/8CDA24E0-7BA4-4FB8-9527-27817953C7F4%40ix.netcom.com.