http2: refactor outgoing write mechanism#17718
http2: refactor outgoing write mechanism#17718addaleax wants to merge 3 commits intonodejs:masterfrom
Conversation
src/node_http2.cc
Outdated
|
I love it. Initial read through looks good but will give a more thorough review a bit later on today. |
|
#17406 has landed. This can be rebased to remove those carried over commits :-) |
`nghttp2_stream_write_t` was not a necessary redirection layer
and came with the cost of one additional allocation per stream write.
Also, having both `nghttp2_stream_write` and `nghttp2_stream_write_t`
as identifiers did not help with readability.
$ ./node benchmark/compare.js --new ./node --old ./node-before --runs 100 --filter write --set streams=20 --set length=1024 --set size=16 http2 | Rscript benchmark/compare.R
[00:26:09|% 100| 1/1 files | 200/200 runs | 1/1 configs]: Done
improvement confidence p.value
http2/write.js benchmarker="h2load" size=16 length=1024 streams=20 0.58 % ** 0.005535241
- Only finish outgoing `WriteWrap`s once data has actually been
passed to the underlying socket.
- This makes HTTP2 streams respect backpressure
- Use `DoTryWrite` as a shortcut for sending out as much of
the data synchronously without blocking as possible
- Use `NGHTTP2_DATA_FLAG_NO_COPY` to avoid copying DATA frame
contents into nghttp2’s buffers before sending them out.
$ ./node benchmark/compare.js --new ./node --old ./node-before --runs 10 --filter write --set streams=20 --set length=1024 --set size=16 http2 | Rscript benchmark/compare.R
[00:02:30|% 100| 1/1 files | 20/20 runs | 1/1 configs]: Done
improvement confidence p.value
http2/write.js benchmarker="h2load" size=16 length=1024 streams=20 6.88 % *** 2.261566e-08
beca4ab to
548cacf
Compare
| // fails. | ||
| CHECK_EQ(fn(&session_, callbacks, this, *opts), 0); | ||
|
|
||
| outgoing_storage_.reserve(4096); |
There was a problem hiding this comment.
may want to play with some different numbers here. The default max frame size is 16k.
There was a problem hiding this comment.
@jasnell This storage is only for data that comes out of nghttp2, not the actual DATA frame payload … and I’m just realizing that padding could also just come from a static buffer. :)
jasnell
left a comment
There was a problem hiding this comment.
Looks good. thanks for this. It was the next big chunk to work on. :-)
|
CI looks good except for some build bot failures on linux, trying again on those just to be safe: https://ci.nodejs.org/job/node-test-commit-linux/15097/ |
`nghttp2_stream_write_t` was not a necessary redirection layer and came with the cost of one additional allocation per stream write. Also, having both `nghttp2_stream_write` and `nghttp2_stream_write_t` as identifiers did not help with readability. PR-URL: #17718 Reviewed-By: James M Snell <jasnell@gmail.com>
- Only finish outgoing `WriteWrap`s once data has actually been passed to the underlying socket. - This makes HTTP2 streams respect backpressure - Use `DoTryWrite` as a shortcut for sending out as much of the data synchronously without blocking as possible - Use `NGHTTP2_DATA_FLAG_NO_COPY` to avoid copying DATA frame contents into nghttp2’s buffers before sending them out. PR-URL: #17718 Reviewed-By: James M Snell <jasnell@gmail.com>
`nghttp2_stream_write_t` was not a necessary redirection layer and came with the cost of one additional allocation per stream write. Also, having both `nghttp2_stream_write` and `nghttp2_stream_write_t` as identifiers did not help with readability. PR-URL: nodejs#17718 Reviewed-By: James M Snell <jasnell@gmail.com>
- Only finish outgoing `WriteWrap`s once data has actually been passed to the underlying socket. - This makes HTTP2 streams respect backpressure - Use `DoTryWrite` as a shortcut for sending out as much of the data synchronously without blocking as possible - Use `NGHTTP2_DATA_FLAG_NO_COPY` to avoid copying DATA frame contents into nghttp2’s buffers before sending them out. PR-URL: nodejs#17718 Reviewed-By: James M Snell <jasnell@gmail.com>
`nghttp2_stream_write_t` was not a necessary redirection layer and came with the cost of one additional allocation per stream write. Also, having both `nghttp2_stream_write` and `nghttp2_stream_write_t` as identifiers did not help with readability. Backport-PR-URL: #18050 PR-URL: #17718 Reviewed-By: James M Snell <jasnell@gmail.com>
- Only finish outgoing `WriteWrap`s once data has actually been passed to the underlying socket. - This makes HTTP2 streams respect backpressure - Use `DoTryWrite` as a shortcut for sending out as much of the data synchronously without blocking as possible - Use `NGHTTP2_DATA_FLAG_NO_COPY` to avoid copying DATA frame contents into nghttp2’s buffers before sending them out. Backport-PR-URL: #18050 PR-URL: #17718 Reviewed-By: James M Snell <jasnell@gmail.com>
`nghttp2_stream_write_t` was not a necessary redirection layer and came with the cost of one additional allocation per stream write. Also, having both `nghttp2_stream_write` and `nghttp2_stream_write_t` as identifiers did not help with readability. Backport-PR-URL: #18050 PR-URL: #17718 Reviewed-By: James M Snell <jasnell@gmail.com>
- Only finish outgoing `WriteWrap`s once data has actually been passed to the underlying socket. - This makes HTTP2 streams respect backpressure - Use `DoTryWrite` as a shortcut for sending out as much of the data synchronously without blocking as possible - Use `NGHTTP2_DATA_FLAG_NO_COPY` to avoid copying DATA frame contents into nghttp2’s buffers before sending them out. Backport-PR-URL: #18050 PR-URL: #17718 Reviewed-By: James M Snell <jasnell@gmail.com>
`nghttp2_stream_write_t` was not a necessary redirection layer and came with the cost of one additional allocation per stream write. Also, having both `nghttp2_stream_write` and `nghttp2_stream_write_t` as identifiers did not help with readability. Backport-PR-URL: nodejs#18050 PR-URL: nodejs#17718 Reviewed-By: James M Snell <jasnell@gmail.com>
- Only finish outgoing `WriteWrap`s once data has actually been passed to the underlying socket. - This makes HTTP2 streams respect backpressure - Use `DoTryWrite` as a shortcut for sending out as much of the data synchronously without blocking as possible - Use `NGHTTP2_DATA_FLAG_NO_COPY` to avoid copying DATA frame contents into nghttp2’s buffers before sending them out. Backport-PR-URL: nodejs#18050 PR-URL: nodejs#17718 Reviewed-By: James M Snell <jasnell@gmail.com>
`nghttp2_stream_write_t` was not a necessary redirection layer and came with the cost of one additional allocation per stream write. Also, having both `nghttp2_stream_write` and `nghttp2_stream_write_t` as identifiers did not help with readability. Backport-PR-URL: #18050 Backport-PR-URL: #20456 PR-URL: #17718 Reviewed-By: James M Snell <jasnell@gmail.com>
- Only finish outgoing `WriteWrap`s once data has actually been passed to the underlying socket. - This makes HTTP2 streams respect backpressure - Use `DoTryWrite` as a shortcut for sending out as much of the data synchronously without blocking as possible - Use `NGHTTP2_DATA_FLAG_NO_COPY` to avoid copying DATA frame contents into nghttp2’s buffers before sending them out. Backport-PR-URL: #18050 Backport-PR-URL: #20456 PR-URL: #17718 Reviewed-By: James M Snell <jasnell@gmail.com>
The first commits in this are from #17406. It’s blocked on that merge-conflict-wise but generally ready for review.
http2: remove redundant write indirection
nghttp2_stream_write_twas not a necessary redirection layerand came with the cost of one additional allocation per stream write.
Also, having both
nghttp2_stream_writeandnghttp2_stream_write_tas identifiers did not help with readability.
http2: refactor outgoing write mechanism
Only finish outgoing
WriteWraps once data has actually beenpassed to the underlying socket.
Use
DoTryWriteas a shortcut for sending out as much ofthe data synchronously without blocking as possible
Use
NGHTTP2_DATA_FLAG_NO_COPYto avoid copying DATA framecontents into nghttp2’s buffers before sending them out.
Checklist
make -j4 test(UNIX), orvcbuild test(Windows) passesAffected core subsystem(s)
http2 @nodejs/http2
CI: https://ci.nodejs.org/job/node-test-commit/14902/