Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description
Chainxchg is slow. Requests with depth >3 are timed out (60 seconds by default). High CPU usage on server side.
We profiled chainxchg methods and found a bottleneck.
Problem
From profiling we found that the longest operation is response writing.
Response is marshalled by
MarshalCBOR
directly to network stream.MarshalCBOR
makes a lot of small writes with average size of 1 byte (because it writes each CBOR header separately).Each of these writes is treated like network packet.
Each packet is encrypted and wrapped by underlying security and multiplexing protocols, which adds overhead to packet size.
A lot of small writes with large overhead are causing timeouts.
Solution
Buffered writes.
With this patch we could make requests with larger depth (e.g. 100) without timing out.
Would be good to have this patch applied on mainnet nodes.