perf(loki.source.file): Reduce allocations during file reading#5405
Merged
perf(loki.source.file): Reduce allocations during file reading#5405
Conversation
Contributor
Author
|
Benchmark diff against main |
d264307 to
b013c1b
Compare
b013c1b to
e50714d
Compare
Contributor
There was a problem hiding this comment.
Pull request overview
Reduces allocation pressure in the Loki file tailer’s line-reading path by reusing buffers and avoiding per-read allocations from bufio.Reader.
Changes:
- Switch line reading from
ReadBytestoReadSliceand adjust looping/error handling to reduce intermediate allocations. - Reuse the
pendingbuffer by resetting length instead of allocating new slices on each consumed line/flush. - Update test helpers to accept
testing.TBand add a benchmark to track allocations.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| internal/component/loki/source/file/internal/tail/reader.go | Uses ReadSlice and buffer resets to reduce allocations while reading/consuming lines; fixes an error-return bug in reset. |
| internal/component/loki/source/file/internal/tail/file_test.go | Refactors helper signatures for TB compatibility and adds a benchmark for allocation tracking. |
ptodev
approved these changes
Feb 2, 2026
Contributor
|
grafana-alloybot bot
pushed a commit
that referenced
this pull request
Feb 2, 2026
### Pull Request Details There is a lot of allocations being performed while reading files. I can clearly see this being a hot spot in our internal clusters. Two of the biggest issues are: 1. We allocate a new pending buffer as soon as we have completed a line 2. We use ReadBytes api causing new allocation for every call that we just move to pending Instead we can use `ReadSlice`, this api will not allocate but return a slice pointing to the internal buffer while still advancing read position. We copy it into pending so this is fine and we remove the intermediate allocation done by `ReadBytes`. We can also reset length of `pending` and this buffer. This is fine because we never read past newline boundary. ### Issue(s) fixed by this Pull Request <!-- Fixes #issue_id --> ### Notes to the Reviewer <!-- Add any relevant notes for the reviewers and testers of this PR. --> ### PR Checklist <!-- Remove items that do not apply. For completed items, change [ ] to [x]. --> - [ ] Documentation added - [x] Tests updated - [ ] Config converters updated (cherry picked from commit 899467a)
3 tasks
kalleep
added a commit
that referenced
this pull request
Feb 2, 2026
…ort] (#5416) ## Backport of #5405 This PR backports #5405 to release/v1.13. ### Original PR Author @kalleep ### Description ### Pull Request Details There is a lot of allocations being performed while reading files. I can clearly see this being a hot spot in our internal clusters. Two of the biggest issues are: 1. We allocate a new pending buffer as soon as we have completed a line 2. We use ReadBytes api causing new allocation for every call that we just move to pending Instead we can use `ReadSlice`, this api will not allocate but return a slice pointing to the internal buffer while still advancing read position. We copy it into pending so this is fine and we remove the intermediate allocation done by `ReadBytes`. We can also reset length of `pending` and this buffer. This is fine because we never read past newline boundary. ### Issue(s) fixed by this Pull Request <!-- Fixes #issue_id --> ### Notes to the Reviewer <!-- Add any relevant notes for the reviewers and testers of this PR. --> ### PR Checklist <!-- Remove items that do not apply. For completed items, change [ ] to [x]. --> - [ ] Documentation added - [x] Tests updated - [ ] Config converters updated --- *This backport was created automatically.* Co-authored-by: Karl Persson <23356117+kalleep@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
Pull Request Details
There is a lot of allocations being performed while reading files. I can clearly see this being a hot spot in our internal clusters.
Two of the biggest issues are:
Instead we can use
ReadSlice, this api will not allocate but return a slice pointing to the internal buffer while still advancing read position. We copy it into pending so this is fine and we remove the intermediate allocation done byReadBytes.We can also reset length of
pendingand this buffer. This is fine because we never read past newline boundary.Issue(s) fixed by this Pull Request
Notes to the Reviewer
PR Checklist