Propongo familiarizarse con la decodificación del informe de finales de 2019 de Alexander Valyalkin "Optimizaciones de Go en VictoriaMetrics"
VictoriaMetrics es un DBMS rápido y escalable para almacenar y procesar datos en forma de series de tiempo (un registro forma el tiempo y un conjunto de valores correspondientes a este tiempo, por ejemplo, obtenido a través del sondeo periódico del estado del sensor o la recopilación de métricas).

Diapositivas

. – . GitHub . Go . . fast, quick .
VictoriaMetrics. ? .

:
- , VictoriaMetrics.
- , .
- , .
- : .
- , VictoriaMetrics. bitset- Go.

VictoriaMetrics - ? , . . , – . ClickHouse, ClickHouse. , , : MergeTree, , .
VictoriaMetrics .
— . . , . VictoriaMetrics .
VictoriaMetrics — . . VictoriaMetrics, .
, VictoriaMetrics , . Go, .

, ? . — (timestamp, ), . – float64.
. ? -.
. : __name__="cpu_usage" – , instance="my-server" — , , datacenter="us-east" — , .
, -. (timestamp, value). t1, t3, t3, ..., tN — timestamps, 10, 20, 12, ..., 15 — . cpu-usage .

? - ?
- DevOps CPU, RAM, , rps, . .
- IoT – , geo coordinates -.
- – .
- , . , VictoriaMetrics , .
- . , ; ; , ; . .
- . , . .
- Healthcare – , ..
, , , , , , . .

? ?
, . . (timestamp, value) . API , -, , regexp. , , .
, SQL . , SQL , . , PromQL, InfluxQL, Flux, Q. , - . PromQL, , . Prometheus.

VictoriaMetrics.
. . .
, , label=value . .
- TSDB, . timeseries_ids , label=value. , timeseries_ids.

, select-.
- timeseries_ids,- label=value, .
- data points timeseries_ids.
- - data points, . .
. timeseries_ids . VictoriaMetrics, , :)

. , . , ? , . , .
. , . ? label=value, label value — . – timeseries_ids, label=value.
timeseries_ids, label=value.
timeseries_ids label=value, label=regexp. ? timeseries_ids label=value.

. . .
getMetricIDs . label=value. metricIDs.
? , invertedIndex. (map), slice int-. label=value.
: metricIDs label=value, label=value, metricIDs . intersectInts, . .

, . . ? , . . . .
. . , , – out of memory error. .

, LevelDB, RocksDB.
, , .
LevelDB RocksDB – Google Facebook. LevelDB. Facebook LevelDB , RocksDB. RocksDB Facebook , RocksDB MySQL. MyRocks.
LevelDB. ? label=value. – , label=value.
c label=value, timeseries_ids. timeseries_ids, label=prefix, range scan, . . . , label=prefix timeseries_ids.

, Go. . LevelDB.
, . . , map . label=value. label=value metricIDs . .

, . VictoriaMetrics LevelDB. .
? LevelDB , . slice metricIDs. — slice .
LevelDB GetValues , label=value. timeseries_ids. timeseries_ids slice timeseries_ids. , , map' .
, LevelDB C. C- Go . . , , go, 1-5 , . VictoriaMetrics – :)

. mergeset.
Mergeset MergeTree. ClickHouse. , mergeset timeseries_ids . Mergeset Go. VictoriaMetrics GitHub. mergeset /lib/mergeset. , .
API mergeset LevelDB RocksDB. . . .

mergeset . , VictoriaMetrics production .
?
– high churn rate. – . , . .
– . , , . , , , . 4 . , , 100 400 . .
, . , , . 40 , , , 40 .
. , idle, . user space, kernel space . , . 7-8 .
40 8 = 320 . 100, 32 000 400.
Kubernetes. , Kubernetes . Kubernetes . . deployment . . , high-cardinality. VictoriaMetrics .

high churn rate. - high churn rate production? .
, Kubernetes, deployment, . . . Kubernetes - id’ deployment' label.
? , deployment' , deployment_id. .
, , , , , . – high churn rate.
high churn rate , - . .

? . . . . - , . . , .
, . , , id .
, , . . . , , .

. id , .
, , . .
, . VictoriaMetrics . . , . - , partition , , . . . VictoriaMetrics , . , .
. , timeseries_ids , , .

? – . . . label=value, . timeseries_ids .
. N , , , . id .
10 . , label=value N . , labels , Kubernetes.

– . . key=value . . . , . , . . . , ClickHouse. .

– timeseries_ids. , . timeseries_ids label=value.

– . . intersectInts slices — a b. slices.
. slice a, slice b. . , , . result.

? — . , slice a b , . , .

map. map. map slice a. slice b. – slice b map. , .

? , . . . slices. slice 2 , , .
, , map.
– overhead . . , VictoriaMetrics intersection map. , map map.
? Go . . . hash , HashMap. hash’ . VictoriaMetrics.

bitset, . slices. bitset. slice. slice. . . . . , map add has.

, , map, - , , 10 , map VictoriaMetrics.
, map. .
, , .
, – , . . . , ids VictoriaMetrics. , . , , out of memory error .

. , VictoriaMetrics, lib/uint64set. VictoriaMetrics, timeseries_id 64- , 32 32 .
, .

API. . API VictoriaMetrics. . . . , VictoriaMetrics.
add, . has, . del, . len, . clone . appendto slice timeseries_ids.

. set :
- ItemsCount– , set. , , VictoriaMetrics bitset.
 
 
- – - buckets. slice- bucket32.- hi. 32 . slice —- b16his- buckets- bucket16.
 
 
16 64- . bitsets 16 .
Bucket64 uint64. . bucket16 2^16=65536 . 8, 8 . 8, 1000 uint64 . . . Bucket16 – 8- .

, .
uint64 . 32 , 32 . buckets. 32 bucket . , add b32 buckets. 32 . true, , . false, . .
bucket hi-, addAlloc, bucket, bucket-.

b32.add. . 16 , 16 .
16 . . add, bucket16.

, . uint64 id slice bit, bitmask. 64- , , . , , . , ids 10 maps.

VictoriaMetrics . , production.
– , , , , . . production, . , VictoriaMetrics , .

bitset. C++ vector bool, bitset. ?
, . bitset ids timeseries, VictoriaMetrics. , 32 . 32 . , . . C++ , , . , , .
. - ClickHouse . , C++ - . , , , , 32 .
. InfluxDB?
. , InfluxDB 10 high cardinality , , , . , VictoriaMetrics 1 GB , InfluxDB 10 Gb. .
, InfluxDB – Flux InfluxQL. PromQL, VictoriaMetrics. PromQL – Prometheus.
– , InfluxDB , fields . . . .
VictoriaMetrics . -. – – (timestamp, value), – label=value. fields measurements. , , , , , InfluxDB, , . , , .
. , - , , , ?
Go' map'. , , , . . , .
! ! . Wildberries. . . , , , , , , , . . , - ? 2 — bitset , , , ? , ?
. . , . , ?
. , . , .
. , , . churn rate , . . , .
– , – . Prometheus . Prometheus . , - label timeseries. , , , , VictoriaMetrics. VictoriaMetrics , - , .
, , . timeseries-, . . – intersect . , , .
?
.
LevelDB mergeset . . ? – . , . – 5 . 100 000 000 , , .
, . . , , . ? - VictoriaMetrics, ClickHouse . ., ?
, . , ? , , , – . . . . .
, . . , , . , , - ClickHouse , , , . , - , , , ? , , .
, . , Prometheus recording rules. . . , , . VictoriaMetrics , Prometheus, recoding rules.
, . , Go, . . . , . , - . , , . , ClickHouse timeseries-, .
. , , - Graphite Carbon. , . . , . . , , , , , . Prometheus, VictoriaMetrics . ? , ?
. . , (downsampling). . -, downsampling - : - , - , , . , . , . .
– , VictoriaMetrics, ClickHouse, , , , . VictoriaMetrics – 50 000 000 . . . . 20 , , . VictoriaMetrics ClickHouse downsamling.
, VictoriaMetrics . production 0,4 0,8 . – timestamp + . , .
. . ?
. . – . Graphite, , . OpenTSDB . InfluxDB – . VictoriaMetrics – , Prometheus . VictoriaMetrics remote storage Prometheus . .
, , , — , , . DevOps- , 30 , , , . high frequency trading systems, .
VictoriaMetrics DevOps-, , . , – high frequency trading systems.
! . PromQL?
. VictoriaMetrics PromQL. PromQL, MetricsQL. YouTube. Monitoring Meetup .
Telegram VictoriaMetrics.