perf: Reuse rand for shuffling queues #916
Closed
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.
Instead of creating a new
rand.Rand
every time we need the next queues, we create it once and reuse it.The reason for this change comes from monitoring our application: After a few minutes, the
github.com/hibiken/asynq.(*processor).queues
method will consume a tremendous amount of CPU time and create a lot of garbage.Since the
queue
method is called in its own goroutine, there is no need to add any synchronization primitives.Here is the profiling flame graph of our application in a time window of 5 minutes: