Improve trace with buffered writes
Introduction
All traces are temporarily written to a on disk log file.
Sections of this file are then read back every ~5 seconds and the latest section published to the GitLab instance.
Problem
All writes are immediately written to the file. This doesn't mean the data is flushed, but it does result in a syscall. This isn't very performant, especially for incredibly small writes.
All reads use io.ReadAll()
and require a temporary buffer. This happens infrequently, but for a runner manager with many concurrent jobs, many buffer allocations can put pressure on GC.
Proposal
I propose we use a buffered writer in front of the log file (bufio.Writer
) and prevent unnecessary allocations by instead returning an io.Reader
of the section, rather than populating a slice.
The buffered writer will use a small buffer per log file (4096 bytes), and flush its data whenever the log file is to be read from. This means that small writes won't perform as badly, because they'll be gathered and written together inbetween reads.