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 Merge branch 'main' into sparsehistogram 2022-08-10 17:54:37 +02:00
encoding Merge 'main' into sparsehistogram 2022-10-05 22:14:49 +02:00
errors Fix context.Canceled wrapping in compaction 2023-03-23 11:10:00 +01:00
fileutil Update go to 1.19, set min version to 1.18 (#11279) 2022-09-07 11:30:48 +02:00
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 tsdb: Delete blocks atomically; Remove tmp blocks on start; Added test. (#7772) 2020-08-11 06:56:08 +01:00
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 Moving tsdb into its own subdirectory 2019-08-13 13:58:49 +05:30
block.go tsdb: sort values for Postings only when required 2023-01-05 14:05:54 +00:00
block_test.go enable gocritic, unconvert and unused linters 2023-04-13 19:20:22 +00:00
blockwriter.go Merge 'main' into sparsehistogram 2022-10-05 22:14:49 +02:00
blockwriter_test.go Name float values as "floats", not as "values" 2023-04-13 19:25:24 +02:00
CHANGELOG.md Rename default branch to main 2021-02-22 20:28:02 +01:00
compact.go Replace sort.Slice with faster slices.SortFunc 2023-07-02 22:17:08 +00:00
compact_test.go Add Zstandard compression option for wlog (#11666) 2023-07-11 14:57:57 +02:00
db.go Use a linked list for memSeries.headChunk (#11818) 2023-07-31 11:10:24 +02:00
db_test.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.go scrape: Enable ingestion of multiple exemplars per sample 2023-07-13 14:16:10 +02:00
exemplar_test.go tsdb: in tests use labels.FromStrings 2022-09-09 13:34:49 +02:00
head.go Use a linked list for memSeries.headChunk (#11818) 2023-07-31 11:10:24 +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 Add out-of-order sample support to the TSDB (#11075) 2022-09-20 22:35:50 +05:30
head_read.go Use a linked list for memSeries.headChunk (#11818) 2023-07-31 11:10:24 +02:00
head_read_test.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
isolation.go ci(lint): enable predeclared linter 2023-05-21 07:33:54 +00:00
isolation_test.go tsdb: turn off transaction isolation for head compaction (#11317) 2022-09-27 19:31:23 +05:30
mocks_test.go Move packages out of deprecated pkg directory 2021-11-09 08:03:10 +01:00
ooo_head.go Name float values as "floats", not as "values" 2023-04-13 19:25:24 +02:00
ooo_head_read.go remove repetitive words (#12556) 2023-07-13 15:53:40 +02:00
ooo_head_read_test.go Add Zstandard compression option for wlog (#11666) 2023-07-11 14:57:57 +02:00
ooo_head_test.go Name float values as "floats", not as "values" 2023-04-13 19:25:24 +02:00
querier.go Hide histogram chunk append and reset header internals (#12352) 2023-07-26 15:08:16 +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
README.md Fixed broken link in tsdb README.md 2022-10-07 16:20:20 +00:00
repair.go refactor: move from io/ioutil to io and os packages (#10528) 2022-04-27 11:24:36 +02:00
repair_test.go Simplify IndexReader.Series interface 2022-12-19 15:22:09 +00:00
tsdbblockutil.go Support FloatHistogram in TSDB (#11522) 2022-12-28 14:25:07 +05:30
wal.go Add Zstandard compression option for wlog (#11666) 2023-07-11 14:57:57 +02:00
wal_test.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: