Fix copy on write behaviour in QuiescingHelper #298
Merged
+136
−54
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.
Fix a copy on write issue in QuiescingHelper that led to significant performance problems when the number of channels became large, or connection churn.
Motivation:
When using QuiescingHelper, every channel holds onto a reference to ChannelCollector, which leads to copy on write behaviour for
openChannels[]. This has performance issues when a large number of channels are open (e.g. 25k channels can be hundreds of KB), and every time a channel is opened, or closed this is copied. As accepting channels happens on a single NIO thread, this work is all done on that thread, and can lead to saturation, and no more channels being accepted.Modifications:
Move the state into a non copyable LifecycleStateMachine, to avoid the copies.
Result:
Overhead from ChannelCollector disappears (as seen in traces from http://github.com/apple/swift-profile-recorder).