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.
While looking into celery/celery#4843 (comment), I noticed Connection._avail_channel_ids seems to be the thing that uses the most memory on a
Connection
:Currently
_avail_channel_ids
is defined onConnection
like this:It creates an array of all possible channel ids and removes them as they're used.
This PR reduces the memory usage of the
Connection
by reversing that logic and turning_avail_channel_ids
into_used_channel_ids
. This will only store the channel ids that are currently used, which is almost always going to be a much smaller array.You can see the empty arrays use a lot less memory:
There's downside though: It's going to take a little bit longer to
_get_free_channel_id
, because it's now going to start counting from the 1 to channel_max and return the first number that doesn't exist in_used_channel_ids
.However, this could potentially reduce the severity of memory leaks.