Go optimizations in VictoriaMetrics. АлСксандр Валялкин

ΠŸΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΎΠΉ Π΄ΠΎΠΊΠ»Π°Π΄Π° ΠΊΠΎΠ½Ρ†Π° 2019 Π³ΠΎΠ΄Π° АлСксандра Валялкина "Go optimizations in VictoriaMetrics"

VictoriaMetrics β€” быстрая ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ Π‘Π£Π‘Π” для хранСния ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΠΎΡ€ΠΌΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ряда (запись ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ врСмя ΠΈ Π½Π°Π±ΠΎΡ€ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… этому Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· пСриодичСский опрос состояния Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈΠ»ΠΈ сбор ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ).

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Π’ΠΎΡ‚ ссылка Π½Π° Π²ΠΈΠ΄Π΅ΠΎ этого Π΄ΠΎΠΊΠ»Π°Π΄Π° β€” https://youtu.be/MZ5P21j_HLE

Π‘Π»Π°ΠΉΠ΄Ρ‹

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

РасскаТу Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎ сСбС. Π― – АлСксандр Валялкин. Π’ΠΎΡ‚ ΠΌΠΎΠΉ GitHub Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚. Π― ΡƒΠ²Π»Π΅ΠΊΠ°ΡŽΡΡŒ Go ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Написал ΠΌΠ½ΠΎΠ³ΠΎ всяких ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΈ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. Они Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ Π»ΠΈΠ±ΠΎ с fast, Π»ΠΈΠ±ΠΎ с quick прСфикса.

Π’ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ я Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ Π½Π°Π΄ VictoriaMetrics. Π§Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅ ΠΈ Ρ‡Ρ‚ΠΎ я Ρ‚Π°ΠΌ дСлаю? Об этом я расскаТу Π² этой ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

План Π΄ΠΎΠΊΠ»Π°Π΄Π° Ρ‚Π°ΠΊΠΎΠΉ:

  • Π’Π½Π°Ρ‡Π°Π»Π΅ я Π²Π°ΠΌ расскаТу, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ VictoriaMetrics.
  • ΠŸΠΎΡ‚ΠΎΠΌ расскаТу, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ряды.
  • ΠŸΠΎΡ‚ΠΎΠΌ расскаТу, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов.
  • Π”Π°Π»Π΅Π΅ расскаТу ΠΏΡ€ΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…: ΠΈΠ· Ρ‡Π΅Π³ΠΎ ΠΎΠ½Π° состоит.
  • И ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ оптимизациям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ Π² VictoriaMetrics. Π­Ρ‚ΠΎ оптимизация ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ индСкса ΠΈ оптимизация для bitset-Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° Go.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ VictoriaMetrics ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² Π°ΡƒΠ΄ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π·Π½Π°Π΅Ρ‚? НичСго сСбС, ΡƒΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ людСй Π·Π½Π°ΡŽΡ‚. Π­Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ Π½ΠΎΠ²ΠΎΡΡ‚ΡŒ. Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ – это Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… для Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов. Она основана Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ ClickHouse, Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… дСталях Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ClickHouse. НапримСр, Π½Π° Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ: MergeTree, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ вычислСниС Π½Π° всСх доступных ядрах процСссора ΠΈ оптимизация ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² кэш процСссора.

VictoriaMetrics прСдоставляСт Π»ΡƒΡ‡ΡˆΠ΅Π΅ сТатиС Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… для Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов.

Она ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ β€” Ρ‚. Π΅. Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ большСС количСство процСссоров, большСС количСство ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΠ΅. VictoriaMetrics Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΡƒΡ‚ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти доступныС рСсурсы ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Ρ‚ΡŒ Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Π’Π°ΠΊΠΆΠ΅ VictoriaMetrics ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎ β€” Ρ‚. Π΅. Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π½ΠΎΠ΄Ρ‹ Π² кластСр VictoriaMetrics, ΠΈ Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ расти ΠΏΠΎΡ‡Ρ‚ΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ.

Как Π²Ρ‹ догадались, VictoriaMetrics быстрая Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… я Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΏΠΈΡΠ°Ρ‚ΡŒ. И ΠΎΠ½Π° написана Π½Π° Go, поэтому я ΠΏΡ€ΠΎ Π½Π΅Π΅ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽ Π½Π° этом ΠΌΠΈΡ‚Π°ΠΏΠ΅.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

ΠšΡ‚ΠΎ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ряд? Π’ΠΎΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ людСй Π·Π½Π°Π΅Ρ‚. Π’Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ряд β€” это сСрия ΠΏΠ°Ρ€ (timestamp, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅), Π³Π΄Π΅ эти ΠΏΠ°Ρ€Ρ‹ отсортированы ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прСдставляСт ΠΈΠ· сСбя число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ – float64.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ряд ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Из Ρ‡Π΅Π³ΠΎ состоит этот ΠΊΠ»ΡŽΡ‡? Он состоит ΠΈΠ· нСпустого Π½Π°Π±ΠΎΡ€Π° ΠΏΠ°Ρ€ ΠΊΠ»ΡŽΡ‡-значСния.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ряда. ΠšΠ»ΡŽΡ‡ΠΎΠΌ этого ряда являСтся список ΠΏΠ°Ρ€: __name__="cpu_usage" – это Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ, instance="my-server" β€” это ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ эта ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ° собрана, datacenter="us-east" β€” это Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€, Π³Π΄Π΅ стоит этот ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€.

Π£ нас ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ имя Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ряда, состоящСС ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ΠΏΠ°Ρ€ ΠΊΠ»ΡŽΡ‡-значСния. Π­Ρ‚ΠΎΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ соотвСтствуСт список ΠΏΠ°Ρ€ (timestamp, value). t1, t3, t3, ..., tN β€” это timestamps, 10, 20, 12, ..., 15 β€” ΡΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ значСния. Π­Ρ‚ΠΎ cpu-usage Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ряда.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Π“Π΄Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ряды? Π£ ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΅ΡΡ‚ΡŒ ΠΈΠ΄Π΅ΠΈ?

  • Π’ DevOps ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ показания Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ CPU, RAM, сСти, rps, количСство ошибок ΠΈ Ρ‚. Π΄.
  • IoT – ΠΌΠΎΠΆΠ΅ΠΌ ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρƒ Π΄Π°Π²Π»Π΅Π½ΠΈΠ΅, geo coordinates ΠΈ Π΅Ρ‰Π΅ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ.
  • Π’Π°ΠΊΠΆΠ΅ финансы – ΠΌΠΎΠΆΠ΅ΠΌ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ Ρ†Π΅Π½Ρ‹ Π½Π° всякиС Π°ΠΊΡ†ΠΈΠΈ ΠΈ Π²Π°Π»ΡŽΡ‚Ρ‹.
  • ΠšΡ€ΠΎΠΌΠ΅ этого, Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ряды ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π΅ производствСнных процСссов Π½Π° Π·Π°Π²ΠΎΠ΄Π°Ρ…. Π£ нас Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ VictoriaMetrics для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Π²Π΅Ρ‚Ρ€ΠΎΠ²Ρ‹Ρ… Ρ‚ΡƒΡ€Π±ΠΈΠ½, для Ρ€ΠΎΠ±ΠΎΡ‚ΠΎΠ².
  • Π’Π°ΠΊΠΆΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ряды ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ для сбора ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ с Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… устройств. НапримСр, для двигатСля; для измСрСния давлСния Π² ΡˆΠΈΠ½Π°Ρ…; для измСрСния скорости, расстояния; для измСрСния расхода Π±Π΅Π½Π·ΠΈΠ½Π° ΠΈ Ρ‚. Π΄.
  • Π’Π°ΠΊΠΆΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ряды ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° самолСтов. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ самолСтС Π΅ΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ ящик, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ собираСт Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ряды ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Π·Π΄ΠΎΡ€ΠΎΠ²ΡŒΡ самолСта. Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ряды Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² аэрокосмичСской ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΡΡ‚ΠΈ.
  • Healthcare – это Π΄Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΡ€ΠΎΠ²ΠΈ, ΠΏΡƒΠ»ΡŒΡ ΠΈ Ρ‚.Π΄.

ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ примСнСния, ΠΏΡ€ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я Π·Π°Π±Ρ‹Π», Π½ΠΎ, надСюсь, Ρ‡Ρ‚ΠΎ Π²Ρ‹ поняли, Ρ‡Ρ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ряды Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² соврСмСнном ΠΌΠΈΡ€Π΅. И объСм ΠΈΡ… использования с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Π³ΠΎΠ΄ΠΎΠΌ растСт.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Для Ρ‡Π΅Π³ΠΎ Π½ΡƒΠΆΠ½Π° Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… для Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов? ΠŸΠΎΡ‡Π΅ΠΌΡƒ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Ρ€Π΅Π»ΡΡ†ΠΈΠΎΠ½Π½ΡƒΡŽ Π±Π°Π·Ρƒ для хранСния Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов?

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядах ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ большой объСм ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слоТно ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ появились спСциализированныС Π‘Π” для Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов. Π­Ρ‚ΠΈ Π±Π°Π·Ρ‹ эффСктивно ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ (timestamp, value) с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Они ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ API для чтСния сохранСнных Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°Ρ€Π΅ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π»ΠΈΠ±ΠΎ ΠΏΠΎ нСскольким Ρ‚Π°ΠΊΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌ, Π»ΠΈΠ±ΠΎ ΠΏΠΎ regexp. НапримСр, Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ процСссора всСх Π²Π°ΡˆΠΈΡ… сСрвисов Π² Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π΅ Π² АмСрикС, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ псСвдозапрос.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… для Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ спСциализированныС языки запросов, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ SQL для Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚. Π₯отя Π΅ΡΡ‚ΡŒ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ SQL ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚, Π½ΠΎ ΠΎΠ½ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚. Π‘ΠΎΠ»Π΅Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ подходят Ρ‚Π°ΠΊΠΈΠ΅ языки запросов, ΠΊΠ°ΠΊ PromQL, InfluxQL, Flux, Q. Π― надСюсь, Ρ‡Ρ‚ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΡΠ»Ρ‹ΡˆΠ°Π» хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· этих языков. О PromQL, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅. Π­Ρ‚ΠΎ язык запросов Prometheus.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° соврСмСнной Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… для Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ VictoriaMetrics.

Она состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй. Π­Ρ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ индСкса ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов. Π­Ρ‚ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹.

Когда ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ новая запись Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ ΠΌΡ‹ сначала обращаСмся Π² ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ индСкс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ряда ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Π½Π°Π±ΠΎΡ€Ρƒ label=value для Π΄Π°Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ. Находим этот ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈ сохраняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

Когда ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ запрос Π½Π° Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· TSDB, ΠΌΡ‹ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π»Π΅Π·Π΅ΠΌ Π² ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ индСкс. ДостаСм всС timeseries_ids записи, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π°Π½Π½ΠΎΠΌΡƒ Π½Π°Π±ΠΎΡ€Ρƒ label=value. И Π·Π°Ρ‚Π΅ΠΌ достаСм всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π΄Π°Π½Π½Ρ‹Ρ…, индСксированного ΠΏΠΎ timeseries_ids.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… для Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ входящий select-запрос.

  • Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΎΠ½Π° достаСт всС timeseries_ids ΠΈΠ· ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ индСкса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Ρ‹ label=value, Π»ΠΈΠ±ΠΎ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‚ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ рСгулярному Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ.
  • ΠŸΠΎΡ‚ΠΎΠΌ ΠΎΠ½Π° достаСт всС data points ΠΈΠ· Ρ…Ρ€Π°Π½Π°Π»ΠΈΡ‰Π° Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… timeseries_ids.
  • ПослС этого Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ вычислСния Π½Π°Π΄ этими data points, согласно запросу ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. И послС этого Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚.

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ†ΠΈΠΈ я Π²Π°ΠΌ расскаТу ΠΏΡ€ΠΎ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ. Π­Ρ‚ΠΎ поиск timeseries_ids ΠΏΠΎ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ индСксу. ΠŸΡ€ΠΎ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ исходники VictoriaMetrics, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° я ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»ΡŽ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄ΠΎΠΊΠ»Π°Π΄Ρ‹ πŸ™‚

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΠΌ ΠΊ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ индСксу. Многим ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ это просто. ΠšΡ‚ΠΎ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ индСкс ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚? О, ΡƒΠΆΠ΅ Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ людСй. Π”Π°Π²Π°ΠΉΡ‚Π΅ попытаСмся ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅.

На самом Π΄Π΅Π»Π΅ всС просто. Π­Ρ‚ΠΎ просто ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΊΠ»ΡŽΡ‡? Π­Ρ‚Π° ΠΏΠ°Ρ€Π° label=value, Π³Π΄Π΅ label ΠΈ value β€” это строки. А значСния – это Π½Π°Π±ΠΎΡ€ timeseries_ids, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ заданная ΠΏΠ°Ρ€Π° label=value.

Π˜Π½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ индСкс позволяСт быстро Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ всС timeseries_ids, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ label=value.

А Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ½ позволяСт быстро Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ timeseries_ids Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ°Ρ€ label=value, Π»ΠΈΠ±ΠΎ для ΠΏΠ°Ρ€ label=regexp. Как это происходит? Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ нахоТдСния пСрСсСчСния мноТСства timeseries_ids для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ label=value.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Рассмотрим Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ индСкса. НачнСм с самой простой Π½Π°ΠΈΠ²Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Она выглядит Π²ΠΎΡ‚ Ρ‚Π°ΠΊ.

Ѐункция getMetricIDs ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ список строк. КаТдая строка содСрТит label=value. Π­Ρ‚Π° функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список metricIDs.

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚? Π’ΠΎΡ‚ Ρƒ нас Π΅ΡΡ‚ΡŒ глобальная пСрСмСнная, которая называСтся invertedIndex. Π­Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ (map), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Ρ‚ строку Π½Π° slice int-ΠΎΠ². Π‘Ρ‚Ρ€ΠΎΠΊΠ° содСрТит label=value.

РСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: достаСм metricIDs для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ label=value, Π·Π°Ρ‚Π΅ΠΌ проходимся ΠΏΠΎ всСм ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ label=value, достаСм metricIDs для Π½ΠΈΡ…. И Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ intersectInts, ΠΏΡ€ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Π΅Ρ‚ рассказано Π΄Π°Π»Π΅Π΅. И эта функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ пСрСсСчСниС этих списков.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Как Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, рСализация ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ индСкса Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ слоТная. Но это наивная рСализация. КакиС Ρƒ Π½Π΅Π΅ Π΅ΡΡ‚ΡŒ нСдостатки? Π“Π»Π°Π²Π½Ρ‹ΠΉ нСдостаток Π½Π°ΠΈΠ²Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ индСкс Ρƒ нас хранится Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти. ПослС пСрСзапуска прилоТСния ΠΌΡ‹ тСряСм этот индСкс. НСт сохранСния этого индСкса Π½Π° диск. Для Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π°ΠΊΠΎΠΉ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ индСкс вряд Π»ΠΈ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ нСдостаток Ρ‚ΠΎΠΆΠ΅ связан с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. Π˜Π½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ индСкс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Если ΠΎΠ½ прСвысит Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти, Ρ‚ΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ – out of memory error. И ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Π”Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ 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 optimizations in VictoriaMetrics. АлСксандр Валялкин

Π’ΠΎΡ‚ примСрная рСализация, ΠΊΠ°ΠΊ ΠΎΠ½Π° выглядСла Π±Ρ‹ Π½Π° Go. Π£ нас Π΅ΡΡ‚ΡŒ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ индСкс. Π­Ρ‚ΠΎ LevelDB.

Ѐункция такая ΠΆΠ΅, ΠΊΠ°ΠΊ для Π½Π°ΠΈΠ²Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Она ΠΏΠΎΡ‡Ρ‚ΠΈ строчка Π² строчку повторяСт Π½Π°ΠΈΠ²Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. ЕдинствСнный ΠΌΠΎΠΌΠ΅Π½Ρ‚, Ρ‡Ρ‚ΠΎ вмСсто обращСния ΠΊ map ΠΌΡ‹ обращаСмся ΠΊ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ индСксу. ДостаСм всС значСния для ΠΏΠ΅Ρ€Π²ΠΎΠΉ label=value. ΠŸΠΎΡ‚ΠΎΠΌ проходимся ΠΏΠΎ всСм ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΌΡΡ ΠΏΠ°Ρ€Π°ΠΌ label=value ΠΈ достаСм ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π½Π°Π±ΠΎΡ€Ρ‹ metricIDs для Π½ΠΈΡ…. Π—Π°Ρ‚Π΅ΠΌ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ пСрСсСчСниС.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Π’Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ Π² этом Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ Π΅ΡΡ‚ΡŒ нСдостатки. 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 – это Π±Ρ‹Π»ΠΎ Ρ„Π°Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ нСдостатком πŸ™‚

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ я написал ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ индСкса. И Π½Π°Π·Π²Π°Π» Π΅Π΅ mergeset.

Mergeset основан Π½Π° структурС Π΄Π°Π½Π½Ρ‹Ρ… MergeTree. Π­Ρ‚Π° структура Π΄Π°Π½Π½Ρ‹Ρ… позаимствована ΠΈΠ· ClickHouse. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ mergeset Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ для быстрого поиска timeseries_ids ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ. Mergeset написан ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π½Π° Go. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ исходники VictoriaMetrics Π½Π° GitHub. РСализация mergeset Π»Π΅ΠΆΠΈΡ‚ Π² ΠΏΠ°ΠΏΠΎΡ‡ΠΊΠ΅ /lib/mergeset. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ происходит.

API mergeset ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° LevelDB ΠΈ RocksDB. Π’. Π΅. ΠΎΠ½ позволяСт быстро ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° Π½ΠΎΠ²Ρ‹Π΅ записи ΠΈ быстро Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ записи ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ прСфиксу.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

ΠŸΡ€ΠΎ нСдостатки 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 с Π½Π΅ΠΉ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ справляСтся ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… для Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Рассмотрим ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ high churn rate. Из-Π·Π° Ρ‡Π΅Π³ΠΎ появляСтся high churn rate Π½Π° production? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ значСния Π»Π΅ΠΉΠ±Π»ΠΎΠ² ΠΈ Ρ‚Π΅Π³ΠΎΠ² постоянно ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ.

НапримСр, возьмСм Kubernetes, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΅ΡΡ‚ΡŒ понятиС deployment, Ρ‚. Π΅. ΠΊΠΎΠ³Π΄Π° выкатываСтся новая вСрсия вашСго прилоТСния. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Kubernetes ΠΏΠΎΡ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ idβ€™ΡˆΠΊΡƒ deployment’Π° Π² label.

К Ρ‡Π΅ΠΌΡƒ это ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ? К Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΌ deployment’Π΅ Ρƒ нас всС старыС Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ряды ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ, Π° вмСсто Π½ΠΈΡ… Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ряды с Π½ΠΎΠ²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π»Π΅ΠΉΠ±Π»Π° deployment_id. Π’Π°ΠΊΠΈΡ… рядов ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сотни тысяч ΠΈ Π΄Π°ΠΆΠ΅ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρ‹.

ВаТная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ всСго этого Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ количСство Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов растСт, Π½ΠΎ количСство Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ приходят Π΄Π°Π½Π½Ρ‹Π΅, остаСтся постоянным. Π’Π°ΠΊΠΎΠ΅ состояниС называСтся – high churn rate.

Основная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° high churn rate Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠΎΡΡ‚ΠΎΡΠ½Π½ΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ поиска всСх Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Π½Π°Π±ΠΎΡ€Ρƒ Π»Π΅ΠΉΠ±Π»ΠΎΠ² Π·Π° ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π° послСдний час ΠΈΠ»ΠΈ Π·Π° послСдний дСнь.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Как эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ? Π’ΠΎΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚. Π­Ρ‚ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ индСкс Π½Π° нСзависимыС части ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’. Π΅. ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ индСксом Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ. И создаСм Π½ΠΎΠ²Ρ‹ΠΉ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ индСкс. ΠŸΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, создаСм Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΈ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½.

И ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅ ΠΈΠ· этих ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… индСксов ΠΌΡ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π°Π±ΠΎΡ€ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… индСксов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π». И, соотвСтствСнно, Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° id Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов.

Π­Ρ‚ΠΎ позволяСт ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ рСсурсы, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ части, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π». Π’. Π΅. ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Ссли ΠΌΡ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ Π·Π° послСдний час, Ρ‚ΠΎ Π·Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρ‹ ΠΌΡ‹ пропускаСм запросы.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Π•ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π­Ρ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ дня ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ список id Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΠ»ΠΈΡΡŒ Π·Π° этот дСнь.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ этого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядах, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΡΡ‡Π΅Π·Π°ΡŽΡ‚ с Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Они постоянно находятся ΠΈ Π½Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ.

НСдостаток Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ слоТнСС Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ слоТнСС Π² Π΄Π΅Π±Π°Π³Π΅. И VictoriaMetrics Π²Ρ‹Π±Ρ€Π°Π»Π° это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Π’Π°ΠΊ слоТилось историчСски. Π’Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ сСбя Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ, ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π±Ρ‹Π»ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ приходится Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ partition для Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ, Ρ‚. Π΅. ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΡΡ‡Π΅Π·Π°ΡŽΡ‚ с Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. VictoriaMetrics Π±Ρ‹Π»Π° Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΏΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΡŽ дискового пространства, ΠΈ прСдыдущая рСализация ΡƒΡ…ΡƒΠ΄ΡˆΠ°Π»Π° ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ дискового пространства. А Π²ΠΎΡ‚ эта рСализация Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ потрСблСния дискового пространства, поэтому ΠΎΠ½Π° Π±Ρ‹Π»Π° Π²Ρ‹Π±Ρ€Π°Π½Π°.

ΠŸΡ€ΠΈΡˆΠ»ΠΎΡΡŒ с Π½Π΅ΠΉ Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ. Π‘ΠΎΡ€ΡŒΠ±Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π»Π°ΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎ всС Ρ€Π°Π²Π½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большСС количСство timeseries_ids для Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ индСкс Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Как ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ? ΠœΡ‹ Π΅Π΅ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ – ΠΏΡƒΡ‚Π΅ΠΌ сохранСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ записи ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ индСкса вмСсто ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°. Π’. Π΅. Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ label=value, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ встрСчаСтся Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌ ряду. И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ сохраняСм нСсколько timeseries_ids Π² ΠΎΠ΄Π½ΠΎΠΉ записи.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. РаньшС Ρƒ нас Π±Ρ‹Π»ΠΎ N записСй, Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° запись, прСфикс Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Ρƒ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ…. Π£ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ записи Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ содСрТит всС id Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов.

Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ сканирования Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ индСкса Π΄ΠΎ 10 Ρ€Π°Π·. И ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти для кэша, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Ρ…Ρ€Π°Π½ΠΈΠΌ строку label=value Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π² кэшС вмСстС N Ρ€Π°Π·. И эта строка ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ большой, Ссли Ρƒ вас Π² Ρ‚Π΅Π³Π°Ρ… ΠΈ labels хранятся Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ строчки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»ΡŽΠ±ΠΈΡ‚ Ρ‚ΡƒΠ΄Π° ΠΏΠΈΡ…Π°Ρ‚ΡŒ Kubernetes.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ускорСния поиска ΠΏΠΎ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ индСксу – это ΡˆΠ°Ρ€Π΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… индСксов вмСсто ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡˆΠ°Ρ€Π΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ. Π­Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ key=value ΠΏΠ°Ρ€. Π’. Π΅. Ρƒ нас получаСтся нСсколько нСзависимых ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… индСксов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… процСссорах. ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ позволяли Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² однопроцСссорном Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‚. Π΅. ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ядрС. Π”Π°Π½Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ позволяСт ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ сразу Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ядрах, ΠΊΠ°ΠΊ это Π»ΡŽΠ±ΠΈΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ ClickHouse. Π­Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ вСрнСмся ΠΊ нашим Π±Π°Ρ€Π°Π½Π°ΠΌ – ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСсСчСния timeseries_ids. Рассмотрим, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π­Ρ‚Π° функция позволяСт Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ timeseries_ids для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° label=value.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ – это наивная рСализация. Π”Π²Π° Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»Π°. Π’ΠΎΡ‚ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½Π° Π²Ρ…ΠΎΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ intersectInts Π΄Π²Π° slices β€” a ΠΈ b. На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½Π°ΠΌ пСрСсСчСниС этих slices.

Наивная рСализация выглядит Ρ‚Π°ΠΊ. ΠœΡ‹ проходимся ΠΏΠΎ всСм значСниям ΠΈΠ· slice a, Π²Π½ΡƒΡ‚Ρ€ΠΈ этого Ρ†ΠΈΠΊΠ»Π° проходимся ΠΏΠΎ всСм значСниям slice b. И сравниваСм ΠΈΡ…. Если ΠΎΠ½ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΌΡ‹ нашли пСрСсСчСниС. И сохраняСм Π΅Π³ΠΎ Π² result.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

КакиС Π΅ΡΡ‚ΡŒ нСдостатки? ΠšΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ β€” это Π³Π»Π°Π²Π½Ρ‹ΠΉ Π΅Π΅ нСдостаток. НапримСр, Ссли Ρƒ вас Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ slice a ΠΈ b ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρƒ, Ρ‚ΠΎ эта функция Π½ΠΈΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½Π΅ Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΅ΠΉ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ‚Ρ€ΠΈΠ»Π»ΠΈΠΎΠ½ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°ΠΆΠ΅ для соврСмСнных ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ².

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Вторая рСализация основана Π½Π° map. ΠœΡ‹ создаСм map. ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² эту map всС значСния ΠΈΠ· slice a. Π—Π°Ρ‚Π΅ΠΌ пробСгаСмся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ ΠΏΠΎ slice b. И провСряСм – Π΅ΡΡ‚ΡŒ Π»ΠΈ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· slice b Π² map. Если ΠΎΠ½ΠΎ Π΅ΡΡ‚ΡŒ, Ρ‚ΠΎ добавляСм Π΅Π³ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

КакиС прСимущСства? ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ линСйная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ. Π’. Π΅. функция Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС выполнится для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² slices. Для ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° slice эта функция выполнится Π·Π° 2 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΈ ΠΎΡ‚ Ρ‚Ρ€ΠΈΠ»Π»ΠΈΠΎΠ½Π° ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠ°ΠΊ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

А нСдостаток Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ эта функция Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ большС памяти для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ эту map.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ нСдостаток – это большой overhead Π½Π° Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π­Ρ‚ΠΎΡ‚ нСдостаток Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ. И для нас ΠΎΠ½ Ρ‚ΠΎΠΆΠ΅ Π±Ρ‹Π» Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, поэтому Π²Π½Π°Ρ‡Π°Π»Π΅ Π² VictoriaMetrics рСализация intersection Π±Ρ‹Π»Π° Ρ‡Π΅Ρ€Π΅Π· map. Но ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΎ, Ρ‡Ρ‚ΠΎ основноС процСссорноС врСмя тратится Π½Π° запись Π² map ΠΈ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ наличия значСния Π² этой map.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π² этих мСстах тратится процСссорноС врСмя? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½Ρ‹Ρ… строчках Go ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. Π’. Π΅. ΠΎΠ½ вычисляСт hash ΠΎΡ‚ ΠΊΠ»ΡŽΡ‡Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ индСксу Π² HashMap. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡŽ hash’а выполняСтся Π·Π° дСсятки наносСкунд. Π­Ρ‚ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ для VictoriaMetrics.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Π― Ρ€Π΅ΡˆΠΈΠ» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ bitset, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для этого случая. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ выглядит пСрСсСчСниС Π΄Π²ΡƒΡ… slices. Π’ΡƒΡ‚ создаСм bitset. ДобавляСм Π² Π½Π΅Π³ΠΎ элСмСнты ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ slice. ΠŸΠΎΡ‚ΠΎΠΌ провСряСм Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ этих элСмСнтов Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ slice. И добавляСм ΠΈΡ… Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π’. Π΅. ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ отличаСтся ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. ЕдинствСнноС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ здСсь Π·Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ map кастомными функциями add ΠΈ has.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Π‘ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ взгляда каТСтся, Ρ‡Ρ‚ΠΎ это Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅ΠΉ, Ссли Ρ€Π°Π½ΡŒΡˆΠ΅ Ρ‚Π°ΠΌ использовалась стандартная map, Π° Ρ‚ΡƒΡ‚ Π΅Ρ‰Π΅ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ, Π½ΠΎ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ эта ΡˆΡ‚ΡƒΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² 10 Ρ€Π°Π· быстрСС, Ρ‡Π΅ΠΌ стандартная map для случая с VictoriaMetrics.

ΠšΡ€ΠΎΠΌΠ΅ этого, ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ мСньшС памяти ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π½Π° map. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…Ρ€Π°Π½ΠΈΠΌ здСсь Π±ΠΈΡ‚Ρ‹ вмСсто Π²ΠΎΡΡŒΠΌΠΈΠ±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

НСдостаток Ρƒ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ такая очСвидная, Π½Π΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π°Ρ.

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ нСдостаток, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ – это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ данная рСализация ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ»ΠΎΡ…ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях. Π’. Π΅. ΠΎΠ½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ случая, для Π΄Π°Π½Π½ΠΎΠ³ΠΎ случая пСрСсСчСния ids Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов VictoriaMetrics. Π­Ρ‚ΠΎ Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ для всСх случаСв. Если Π΅Π΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π½Π΅ прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π° out of memory error ΠΈ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Рассмотрим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π΄Π°Π½Π½ΠΎΠΉ структуры. Если Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‚ΠΎ ΠΎΠ½Π° находится Π² исходниках VictoriaMetrics, Π² ΠΏΠ°ΠΏΠΊΠ΅ lib/uint64set. Она ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΈΠΌΠ΅Π½Π½ΠΎ для случая VictoriaMetrics, Π³Π΄Π΅ timeseries_id прСдставляСт ΠΈΠ· сСбя 64-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π³Π΄Π΅ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 32 Π±ΠΈΡ‚Π° Π² основным постоянныС ΠΈ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послСдниС 32 Π±ΠΈΡ‚Π°.

Π­Ρ‚Π° структура Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ хранится Π½Π° дискС, ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² памяти.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Π’ΠΎΡ‚ Π΅Π΅ API. Он Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ слоТный. API ΠΏΠΎΠ΄ΠΎΠ³Π½Π°Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования VictoriaMetrics. Π’. Π΅. Ρ‚ΡƒΡ‚ Π½Π΅Ρ‚ Π»ΠΈΡˆΠ½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π—Π΄Π΅ΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ явно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ VictoriaMetrics.

Π•ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ add, которая добавляСт Π½ΠΎΠ²Ρ‹Π΅ значСния. Π•ΡΡ‚ΡŒ функция has, которая провСряСт Π½ΠΎΠ²Ρ‹Π΅ значСния. И Π΅ΡΡ‚ΡŒ функция del, которая удаляСт значСния. Π•ΡΡ‚ΡŒ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ функция len, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ мноТСства. Ѐункция clone ΠΊΠ»ΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ мноТСство. И функция appendto ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ этот сСт Π² slice timeseries_ids.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит рСализация этой структуры Π΄Π°Π½Π½Ρ‹Ρ…. Π’ 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-килобайтная структура.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Рассмотрим, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² этой структуры добавлСния Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния.

ВсС начинаСтся с uint64 значСния. ВычисляСм Π²Π΅Ρ€Ρ…Π½ΠΈΠ΅ 32 Π±ΠΈΡ‚Π°, вычисляСм Π½ΠΈΠΆΠ½ΠΈΠ΅ 32 Π±ΠΈΡ‚Π°. ΠŸΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌΡΡ ΠΏΠΎ всСм buckets. Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ Π²Π΅Ρ€Ρ…Π½ΠΈΠ΅ 32 Π±ΠΈΡ‚Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ bucket с добавляСмым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. И Ссли ΠΎΠ½ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ add Π² структурС b32 buckets. И добавляСм Ρ‚ΡƒΠ΄Π° Π½ΠΈΠΆΠ½ΠΈΠ΅ 32 Π±ΠΈΡ‚Π°. И Ссли это Π²Π΅Ρ€Π½ΡƒΠ»ΠΎ true, Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΡƒΠ΄Π° ΠΈ Ρƒ нас Ρ‚Π°ΠΊΠΎΠ³ΠΎ значСния Π½Π΅ Π±Ρ‹Π»ΠΎ. Если ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ false, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ. Π—Π°Ρ‚Π΅ΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ количСство элСмСнтов Π² структурС.

Если ΠΌΡ‹ Π½Π΅ нашли Π½ΡƒΠΆΠ½Ρ‹ΠΉ bucket с Π½ΡƒΠΆΠ½Ρ‹ΠΌ hi-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Ρ‚ΠΎ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ addAlloc, которая Π²Ρ‹Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ bucket, добавляя Π΅Π³ΠΎ Π² bucket-структуру.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Π­Ρ‚ΠΎ рСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ b32.add. Она ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. ΠœΡ‹ вычисляСм ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ 16 Π±ΠΈΡ‚, младшиС 16 Π±ΠΈΡ‚.

ΠŸΠΎΡ‚ΠΎΠΌ ΠΌΡ‹ проходимся ΠΏΠΎ всСм Π²Π΅Ρ€Ρ…Π½ΠΈΠΌ 16 Π±ΠΈΡ‚Π°ΠΌ. Находим совпадСния. И ΠΏΡ€ΠΈ совпадСнии Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ add, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рассмотрим Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ страницС для bucket16.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

И Π²ΠΎΡ‚ самый Π½ΠΈΠΆΠ½ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ максимально ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½. ΠœΡ‹ вычисляСм для uint64 id Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² slice bit, Π° Ρ‚Π°ΠΊΠΆΠ΅ bitmask. Π­Ρ‚ΠΎ маска для Π΄Π°Π½Π½ΠΎΠ³ΠΎ 64-Π±ΠΈΡ‚Π½ΠΎΠ³ΠΎ значСния, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ этого Π±ΠΈΡ‚Π°, Π»ΠΈΠ±ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ. ΠœΡ‹ провСряСм Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ этого Π±ΠΈΡ‚Π°, установлСнного ΠΈ устанавливаСм Π΅Π³ΠΎ, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅. Π’ΠΎΡ‚ такая рСализация Ρƒ нас, которая ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ пСрСсСчСния ids Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов Π² 10 Ρ€Π°Π· ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ maps.

Go optimizations in VictoriaMetrics. АлСксандр Валялкин

Π’ VictoriaMetrics ΠΏΠΎΠΌΠΈΠΌΠΎ этой ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· этих ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½Π΅ просто Ρ‚Π°ΠΊ, Π° послС профилирования ΠΊΠΎΠ΄Π° Π² production.

Π­Ρ‚ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ – Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ, прСдполагая, Ρ‡Ρ‚ΠΎ здСсь Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ·ΠΊΠΎΠ΅ мСсто, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ·ΠΊΠΎΠ³ΠΎ мСста. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡƒΡ…ΡƒΠ΄ΡˆΠ°Π΅Ρ‚ качСство ΠΊΠΎΠ΄Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ стоит ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС профилирования ΠΈ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π² production, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это Π±Ρ‹Π»ΠΈ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. ΠšΠΎΠΌΡƒ интСрСсно, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ исходники VictoriaMetrics ΠΈ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΌ Π΅ΡΡ‚ΡŒ.

Go optimizations in 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.

Волько зарСгистрированныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² опросС. Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅, поТалуйста.

Π§Ρ‚ΠΎ Π²Π°ΠΌ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° VictoriaMetrics ΠΊΠ°ΠΊ долгосрочноС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для Prometheus? (ΠŸΠΈΡˆΠΈΡ‚Π΅ Π² коммСнтариях, я добавлю Π² опрос))

  • 71,4%НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Prometheus5

  • 28,6%НС Π·Π½Π°Π» ΠΏΡ€ΠΎ VictoriaMetrics2

ΠŸΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π»ΠΈ 7 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π’ΠΎΠ·Π΄Π΅Ρ€ΠΆΠ°Π»ΠΈΡΡŒ 12 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com