prometheus/tsdb
Łukasz Mierzwa 3c80963e81
Use a linked list for memSeries.headChunk (#11818)
Currently memSeries holds a single head chunk in-memory and a slice of mmapped chunks.
When append() is called on memSeries it might decide that a new headChunk is needed to use for given append() call.
If that happens it will first mmap existing head chunk and only after that happens it will create a new empty headChunk and continue appending
our sample to it.

Since appending samples uses write lock on memSeries no other read or write can happen until any append is completed.
When we have an append() that must create a new head chunk the whole memSeries is blocked until mmapping of existing head chunk finishes.
Mmapping itself uses a lock as it needs to be serialised, which means that the more chunks to mmap we have the longer each chunk might wait
for it to be mmapped.
If there's enough chunks that require mmapping some memSeries will be locked for long enough that it will start affecting
queries and scrapes.
Queries might timeout, since by default they have a 2 minute timeout set.
Scrapes will be blocked inside append() call, which means there will be a gap between samples. This will first affect range queries
or calls using rate() and such, since the time range requested in the query might have too few samples to calculate anything.

To avoid this we need to remove mmapping from append path, since mmapping is blocking.
But this means that when we cut a new head chunk we need to keep the old one around, so we can mmap it later.
This change makes memSeries.headChunk a linked list, memSeries.headChunk still points to the 'open' head chunk that receives new samples,
while older, yet to be mmapped, chunks are linked to it.
Mmapping is done on a schedule by iterating all memSeries one by one. Thanks to this we control when mmapping is done, since we trigger
it manually, which reduces the risk that it will have to compete for mmap locks with other chunks.

Signed-off-by: Łukasz Mierzwa <l.mierzwa@gmail.com>
2023-07-31 11:10:24 +02:00
..
agent tsdb/agent: ensure that new series get written to WAL on rollback (#12592) 2023-07-27 09:28:26 -04:00
chunkenc Hide histogram chunk append and reset header internals (#12352) 2023-07-26 15:08:16 +02:00
chunks Use a linked list for memSeries.headChunk (#11818) 2023-07-31 11:10:24 +02:00
docs
encoding
errors Fix context.Canceled wrapping in compaction 2023-03-23 11:10:00 +01:00
fileutil
goversion lint: Adjust to the lint warnings raised by current versions of golint-ci 2023-04-19 17:10:10 +02:00
index Merge pull request #10623 from songjiayang/update-index 2023-07-18 13:47:27 +02:00
record tsdb: Support native histograms in snapshot on shutdown (#12258) 2023-07-05 11:44:13 +02:00
testdata
tombstones Copy tombstone intervals to avoid race (#12245) 2023-05-17 15:15:12 +02:00
tsdbutil Hide histogram chunk append and reset header internals (#12352) 2023-07-26 15:08:16 +02:00
wlog Add Zstandard compression option for wlog (#11666) 2023-07-11 14:57:57 +02:00
.gitignore
block_test.go enable gocritic, unconvert and unused linters 2023-04-13 19:20:22 +00:00
block.go tsdb: sort values for Postings only when required 2023-01-05 14:05:54 +00:00
blockwriter_test.go Name float values as "floats", not as "values" 2023-04-13 19:25:24 +02:00
blockwriter.go
CHANGELOG.md
compact_test.go Add Zstandard compression option for wlog (#11666) 2023-07-11 14:57:57 +02:00
compact.go Replace sort.Slice with faster slices.SortFunc 2023-07-02 22:17:08 +00:00
db_test.go Use a linked list for memSeries.headChunk (#11818) 2023-07-31 11:10:24 +02:00
db.go Use a linked list for memSeries.headChunk (#11818) 2023-07-31 11:10:24 +02:00
example_test.go storage: allow re-use of iterators 2022-12-15 18:32:45 +00:00
exemplar_test.go
exemplar.go scrape: Enable ingestion of multiple exemplars per sample 2023-07-13 14:16:10 +02:00
head_append.go Use a linked list for memSeries.headChunk (#11818) 2023-07-31 11:10:24 +02:00
head_bench_test.go
head_read_test.go Use a linked list for memSeries.headChunk (#11818) 2023-07-31 11:10:24 +02:00
head_read.go Use a linked list for memSeries.headChunk (#11818) 2023-07-31 11:10:24 +02:00
head_test.go Use a linked list for memSeries.headChunk (#11818) 2023-07-31 11:10:24 +02:00
head_wal.go Use a linked list for memSeries.headChunk (#11818) 2023-07-31 11:10:24 +02:00
head.go Use a linked list for memSeries.headChunk (#11818) 2023-07-31 11:10:24 +02:00
isolation_test.go
isolation.go ci(lint): enable predeclared linter 2023-05-21 07:33:54 +00:00
mocks_test.go
ooo_head_read_test.go Add Zstandard compression option for wlog (#11666) 2023-07-11 14:57:57 +02:00
ooo_head_read.go remove repetitive words (#12556) 2023-07-13 15:53:40 +02:00
ooo_head_test.go Name float values as "floats", not as "values" 2023-04-13 19:25:24 +02:00
ooo_head.go Name float values as "floats", not as "values" 2023-04-13 19:25:24 +02:00
querier_bench_test.go Apply relevant label matchers in LabelValues before fetching extra postings (#12274) 2023-07-04 10:37:58 +01:00
querier_test.go tsdbutil/ChunkFromSamplesGeneric should not panic 2023-07-20 17:01:34 +02:00
querier.go Hide histogram chunk append and reset header internals (#12352) 2023-07-26 15:08:16 +02:00
README.md
repair_test.go Simplify IndexReader.Series interface 2022-12-19 15:22:09 +00:00
repair.go
tsdbblockutil.go Support FloatHistogram in TSDB (#11522) 2022-12-28 14:25:07 +05:30
wal_test.go Add Zstandard compression option for wlog (#11666) 2023-07-11 14:57:57 +02:00
wal.go Add Zstandard compression option for wlog (#11666) 2023-07-11 14:57:57 +02:00

TSDB

GoPkg

This directory contains the Prometheus TSDB (Time Series DataBase) library, which handles storage and querying of all Prometheus v2 data.

Documentation

External resources

A series of blog posts explaining different components of TSDB: