Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Moneo te legere transcriptum nuper MMXIX renuntiationis ab Alexandro Valyalkin "Ite optimizationes in VictoriaMetrics"

VictoriaMetrics β€” ieiunium et scalabile DBMS ad notitias recondendas et dispensandas in forma temporis seriei (formae recordationis tempus et copia valorum huic tempori respondentium, exempli gratia, per periodicum status sensoriis vel collectione consecuta. metrice).

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Hic nexus est relationis videndi huius - https://youtu.be/MZ5P21j_HLE

Slides

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Dic nobis de te. Ego sum Alexander Valyalkin. Hic mihi GitHub rationem. Sum iracundus de Ite et perficiendi ipsum. Scribebam multa utilia et non ita utilis librariis. Incipiunt vel fastaut cum quick praepositionem.

Hodie in VictoriaMetrics laboro. Quid est et quid ibi facio? De hoc in hac propositione loquar.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Forma relationis talis est;

  • Primum dicam quid sit VictoriaMetrica.
  • Tunc dicam tibi quo tempore series sint.
  • Tunc tibi narrabo quomodo temporis series operarum datorum.
  • Deinde de architectura datorum dicam: quid sit.
  • Et tunc transeamus ad optimizations quas VictoriaMetrics habet. Haec optimatio est pro inverso indice et optimizationi ad exsequendam morsum in Go.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Num quis in auditorio scit quid sit VictoriaMetrics? Wow, multum homines iam sciunt. Bonum nuntium est. Illis qui nesciunt, temporis series datorum est. Fundatur in architectura ClickHouse, in aliquibus singularibus exsequendi ClickHouse. Exempli gratia, super his ut: MergeTree, ratio parallela in omnibus nuclei processus processus et perficiendi optimization operando in notitia caudices, qui in cella processus ponuntur.

VictoriaMetrics compressionem melioris notitiae praebet quam alii temporis series databases.

Perpendiculariter scandit - hoc est, plures processus addere potes, plus ram in uno computatorio. VictoriaMetrics his facultatibus promptis feliciter utetur et productivitatem linearem emendabit.

VictoriaMetrics etiam scandit horizontaliter, hoc est, nodos additos ad botrum VictoriaMetrics addere potes, et effectus eius fere lineariter augebit.

Ut coniectans, VictoriaMetrics database ieiunium est, quia alios scribere non possum. Et in Go scriptum est, ut in hoc congressu de eo loquor.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Quis novit temporis seriem? Etiam multum scit. Tempus series est series paria (timestamp, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅)ubi haec paria tempore disponantur. Valitudo fluctuetur numerus – float64.

Singulis temporis series a clavis unice notatur. Quid haec clavis est? Constat ex non-vacuis paria clavium valoris.

Exemplum est temporis seriei. Clavis huius seriei est index bini: __name__="cpu_usage" nomen metricum est; instance="my-server" β€” Haec computatio est ex qua haec metrica colligitur; datacenter="us-east" - haec est centrum tabellariorum ubi hic computatorium situm est.

Nos cum temporis serie finivimus nomen trium clavium valorum constantium. Haec clavis correspondet indice paria (timestamp, value). t1, t3, t3, ..., tN β€” haec sunt indicationes; 10, 20, 12, ..., 15 - valorum correspondentium. Haec est ratio usui dato tempore pro ordine dato.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Ubi temporis series adhiberi potest? Num quis habet ullam ideam?

  • In DevOps metiri potes CPU, RAM, retis, rps, errorum numero, etc.
  • IoT - metiri possumus temperiem, pressuram, coordinatas geo et aliquid aliud.
  • Etiam oeconomicis - possumus monitores pretium pro omnibus generibus nervorum et valΕ«tārum.
  • Praeterea series temporis in officinis productionis vigilantia adhiberi potest. Utentes habemus, qui VictoriaMetrics ad monitores ventorum turbines utuntur, pro robots.
  • Temporis series etiam utiles sunt ad informationes colligendas ex variis machinis sensoriis. Puta, tormentum; for metiendi fatigationem pressus; ad celeritatem metiendam, distantiam; ad gasolineum metiendam consumptionem, etc.
  • Temporis series etiam ad monitorem aircraft adhiberi potest. Quisque elit capsam nigram habet quae seriem temporis colligit pro variis parametris valetudinis aircraft. Series temporis etiam in industria aerospace adhibentur.
  • Curis est pressura sanguinis, pulsus, etc.

Plura possunt esse applicationes quas oblitus sum, sed spero te intelligere seriem temporis activo modo in mundo hodierno adhiberi. Atque earum usus in annos singulos crescit.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Cur series database temporis opus est? Cur non potest ordinariis relationibus datorum uteris ad seriem temporis condere?

Quia temporis series magnam copiam notitiarum plerumque continent, quod difficile est condere ac processum in databases conventionales. Ideo propriae databases pro temporis serie apparuerunt. Haec bases puncta congregem efficaciter (timestamp, value) clavis datis. API praebent ut notitias clavis conditas legentes, uno clavi pretii par, vel plurium pretiis clavis, vel regexp. Exempli gratia, onus CPU omnium officiorum vestrorum in centrum datae in America invenire vis, hac pseudo-inquisitione uti debes.

De more temporis series databases praebet proprias interrogationes linguas, quia series temporis SQL non est aptissima. Etsi databases sunt quae SQL sustentant, non valde convenit. Quaero linguae ut PromQL, InfluxQL, influunt,, Q. Spero aliquem saltem unum ex his linguis audivisse. Multi homines probabiliter de PromQL audiverunt. Haec est Promethei lingua quaesita.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Hoc est quod moderni temporis series architecturae datorum datorum similis est utens VictoriaMetrics ut exemplum.

Constat duabus partibus. Hoc repositum est pro inverso indice ac repositione pro tempore valores series. Repositoria haec separata sunt.

Cum novus recordus in datorum pervenerit, primum accessum inverso indice ad inveniendum temporis seriem identifier pro certo statuto. label=value pro dato metrico. Hanc identificantem invenimus et valorem in notitia copia servamus.

Cum petitio venit ut notitias ex TSDB capias, primum in inverso indice imus. Lets 'adepto omnia timeseries_ids refert quod inserere hoc statuto label=value. Et tunc omnia necessaria notitia ex notitiis horreis colligimus, indexes timeseries_ids.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Inspice exemplum quomodo temporis series datorum processuum selectorum advenientis quaesitum est.

  • Primum omnium quae accipit omnia timeseries_ids ex inverso indice continentes data paria label=valueaut iustam expressionem.
  • Tunc omnia puncta data ex notitia repono per tempus dato invenit pro inventis timeseries_ids.
  • Post hoc, datorum rationes in his notitiis quasdam praestat, secundum petitionem usoris. Et post hoc responsum redit.

In hac propositione de prima parte dicam. Hoc est quaerere timeseries_ids inverso indice a. Spectare potes de secunda parte et de tertia parte postea Fontes VictoriaMetricsaut expectare donec alias relationes preparare

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

In inverso indice transeamus. Multi hoc simplex putant. Quis scit quid sit index inversus et quomodo operatur? Oh, non ita multi adesse. Conemur intelligere quid sit.

Est vere simplex. Dictionarium simpliciter est quod clavem ad valorem describit. Quid est clavis? Hoc copulabis label=valuequibus label ΠΈ value β€” hi versus sunt. Valores autem sunt timeseries_ids, quod includit datam par label=value.

Index inversus permittit ut omnia cito invenias timeseries_idsqui dederunt label=value.

Etiam sino te cito invenire timeseries_ids series aliquot temporis paria label=value, vel pro conjugibus label=regexp. Quomodo hoc fiet? Inveniens sectio set timeseries_ids nam quisque par label=value.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Inspiciamus varias exsecutiones inversi indices. Incipiamus ad exsecutionem simplicissimam simplicem. Spectat hoc modo.

munus getMetricIDs indicem chordarum accipit. Singulae lineae label=value. Hoc munus refert album metricIDs.

Quomodo facitur? Hic habemus globalem variabilem vocatam invertedIndex. Hoc est regularis dictionary (map) quae filum ad scalpere ints describet. Linea continet label=value.

Munus exsecutionem: posside metricIDs ad primum label=valueergo imus per omnia label=value, dabimus tibi metricIDs pro iis. Et vocant munus intersectIntsde quo infra dicetur. Et hoc munus reddit intersectio istorum tabularum.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Ut videre potes, index inversus insequens non admodum implicatus est. Sed hoc rustica exsecutio est. Quae incommoda habet? Praecipuum incommodum exsecutionis simplicis est quod talis index inversus in RAM reponitur. Postquam applicationes restoimus, hunc indicem amittimus. Nulla est huius index ad discum salutaris. Talis index inversus non abhorret aptum datorum.

Secundum etiam incommodum se habet ad memoriam. Index inversus in RAM convenire debet. Si magnitudinem arietis excedit, manifesto dabimus - ex errore memoriae. Et programma non operabitur.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Haec quaestio solvi potest solutiones paratae utendo LevelDBuel RocksDB.

In summa, nobis opus est database quod tres operationes cito facere permittit.

  • Prima operatio est memoria ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ huic datorum. Hoc celerrime facit, ubi ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ chordae arbitrariae sunt.
  • Secunda operatio est velox quaerendi valorem data clavis utendi.
  • Et tertia operatio est certa praeposita omnium bonorum inquisitio.

LevelDB et RocksDB - haec database a Google et Facebook sunt. Primus venit LevelDB. Tunc guys ex Facebook LevelDB acceperunt et emendare inceperunt, RocksDB fecerunt. Nunc fere omnes databases interni in RocksDB intra Facebook operantur, iis quae in RocksDB et MySQL translata sunt. nominaverunt eum MyRocks.

Index inversus effici potest utens LevelDB. Quomodo facere? Serva in clavis label=value. Et valor est identificans temporis seriei ubi par est praesens label=value.

Si multa tempora seriei data cum par label=value, plures erunt ordines in hac datorum cum eadem clavibus et differentibus timeseries_ids. Ut a album omnium timeseries_idsquae ab hoc label=prefix, scan magnum facimus pro quo haec datorum optimized est. Hoc est, omnes lineas ab eo incipientes eligimus label=prefix atque in opus timeseries_ids.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Hic exemplum exsequendi quod in Go videretur. Indicem inverso habemus. Hoc est LevelDB.

Officium idem est ac rustica exsecutio. Incautum exsecutionem paene per lineam repetit. Solum punctum est quod pro convertendi map accedimus inverso indice. Omnes valores primi sumus label=value. Deinde per omnia reliqua paria label=value and get the sets of metricIDs for them respondentes. Deinde invenimus intersectionem.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Omnia denique videntur, sed huic solutioni incommodis sunt. VictoriaMetrics initio inversum indicem in LevelDB implevit. Sed in fine habui eam tradere.

Quare? Quia LevelDB est tardius quam exsecutio rustica. In simplice exsecutione, data clavis data, statim totum segmentum recuperamus metricIDs. Haec operatio velocissima est - totum segmentum usui paratum est.

In LevelDB, omni tempore munus vocatur GetValues debes ire per omnes lineas incipientes label=value. Et pro qualibet linea adepto valorem timeseries_ids. De talibus timeseries_ids colligendum segmentum horum timeseries_ids. Patet, hoc est multo tardius quam per clavem tabulam regularem accessionem simpliciter.

Secundum Incommodum est quod LevelDB scriptum est in C. Vocatio C functiones ab Go non est velocissima. Capit nanoseconds centum. Hoc non est valde velox, quod ad munus vocatum regulariter comparatum scriptum in go, quod 1-5 nanoseconds accipit, differentia in effectu est decies vicies. Nam VictoriaMetrics hoc vitium fatale fuit :)

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Itaque inverso indice manu mea propria exsecutionem scripsi. Et vocavit eam mergeset.

Mergeset fundatur in structura notitia MergeTree. Haec notitia compages sumitur a ClickHouse. Patet, mergeset debet optimized pro ieiunium inquisitione timeseries_ids iuxta clavem datam. Mergeset plane scribitur in Go. Potes videre VictoriaMetrics fontes in GitHub. Exsequendam mergeset in folder /lib/mergeset. Conemur ut instar quid ibi agatur.

Mergeset API simillimum est cum LevelDB et RocksDB. Hoc est, permittit tibi cito novas tabulas ibi servare et cito tabulas selectas per praepositionem datam.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Mergeset postea de incommodis loquemur. Nunc fama est de quibus problemata cum VictoriaMetrics in productione orta sunt, cum inverso indice insequente.

quare surrexerunt?

Prima ratio est excelsum contorquens rate. Translata in Russiam, haec est crebra mutatio seriei temporis. Hoc est, cum temporis series finitur et series nova incipit, aut multae novae temporis series incipiunt. Idque saepe accidit.

Secunda ratio est temporis seriei copiosa. In principio, cum vigilantia popularis esset, numerus temporis series parva erat. Exempli gratia, pro quolibet computatorio debes monitorem CPU, memoriam, retis et orbis pondera. 4 series temporis per computatrum. Dicamus te habere 100 computatrales et 400 series temporis. Hoc minimum est.

Subinde homines figurabant se plus notitias granulares metiri posse. Verbi gratia, metire onus non totius processus, sed separatim cujusvis processus nuclei. Si quadraginta choros processus habes, 40 plus temporis seriem habes ut processus onus metiaris.

Sed id nulla est. Quisque processus nucleus plures civitates habere potest, ut otiosus, cum est otiosus. Etiam in spatio usoris operantur, in spatio nucleo et aliis civitatibus operantur. Et quilibet talis status potest etiam metiri ut separatum temporis seriem. Hoc etiam auget numerum ordinum 7-8 temporibus.

Ex uno metrico venimus 40 x 8 = 320 metri causa pro uno tantum computatorio. Multiplica per 100, pro 32 fiunt 000.

Inde Kubernetes pervenerunt. Et eo gravius ​​factum est quod Kubernetes multa officia et varia hospitari possunt. Unumquodque ministerium in Kubernetes multis siliquis constat. Et haec omnia viverra debent. Insuper novas versiones officiorum vestrorum assidue instruere debemus. Utraque versionis nova, temporis series nova creari debet. Quam ob rem, numerus temporis series exponentialiter crescit et coram nobis occurrit problema magnae seriei temporis, quae summus cardinalitas appellatur. VictoriaMetrics cum ea capas feliciter comparavit cum aliis databases series temporis.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Propius inspiciamus in altum contorquens ratem. Quid facit magnum contorquens in productione? Quia nonnullae significationes pittacii et texti perpetuo mutantur.

Exempli gratia: Kubernetes, qui conceptum habet deployment, i.e., cum nova applicationis tuae versio evolvit. Horum autem causa tincidunt Kubernetes instruere id ad pittacium addere decreverunt.

Quid hoc ad rem? Praeterea, singulis novis instruendis, interrumpantur omnes antiqui temporis series, et pro illis novae temporis series a novo valore pittacii incipiunt. deployment_id. Possunt esse centena milia et etiam decies centena milia talium ordinum.

Magna de his omnibus est quod series temporis numerus augetur, sed series temporis numerus actuosus et notitia recipiens constantes sunt. Haec res publica appellatur rate alta torquentes.

Praecipua quaestionis altae contorquens rate est, ut assidua quaerendi celeritas in omni tempore series pro certo pittacorum certo temporis intervallo curet. De more hoc est tempus intervallum horae novissimae vel diei novissimi.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Quomodo hanc solvendam quaestionem? Hic est prima optio. Hoc est inversum indicem in partes independentes temporis dividere. Aliquantum temporis intervallum hoc est, cum indice inverso currenti perficimus opus. & novo inverso indice creo. Intervallum aliud tempus transit, nos aliud atque aliud creamus.

Et cum ab his inversis indicibus samplinger inversorum indices intra datum intervallum cadentes invenimus. Ac proinde id temporis seriem inde eligimus.

Hoc opes servat quia partes spectare non debemus quae intra datum spatium non cadunt. Hoc est, plerumque, si ultimae horae notitias eligimus, tum praecedentibus temporis intervallis queries omittimus.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Alia est optio ad solvendam hanc quaestionem. Hoc est singulis diebus singula seriei temporis indices, quae eo die acciderunt.

Commodum solutionis huius solutionis in praecedenti solutione est quod nos non duplicare temporis seriem informationem quae per tempus non evanescit. Constanter adsunt et non mutantur.

Incommodum est quod talis solutio difficilior est ad efficiendum et difficilius debug. Et hanc solutionem elegerunt VictoriaMetrics. Ita historice factum est. Haec solutio etiam bene comparat cum priori. Quia haec solutio non impletur ex eo quod necesse est duplicare notitias in unaquaque partitione temporis seriei quae non mutantur, i.e., quae super tempus non evanescunt. VictoriaMetrics praesertim optimized pro discri spatio consummatio, et prior exsecutio spatii discri consumptio peior facta est. Sed haec exsecutio aptior est ad consummationem orbis tractus extenuando, ut eligeretur.

I. quam pugnandi causa. Pugnatum est quod in hac exsecutione adhuc opus est multo maiorem numerum eligere timeseries_ids pro notitia quam cum inverso indice temporis partita est.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Quomodo hanc problema solvemus? Solvimus hoc modo originali - identificantes seriem plurium temporum in unoquoque inverso indice ingressu pro uno identificante. Hoc est, clavem habemus label=valuequod omni tempore accidit. Et nunc plures servamus timeseries_ids in uno introitu.

Hic exemplum est. Antea N introitum habuimus, nunc unum ingressum habemus, cuius praepositio eadem est cum ceteris omnibus. Ad priorem ingressum, valor ids series omne tempus continet.

Inde effecit ut celeritas inverso index talis inversi usque ad 10 tempora augeretur. Et licet nobis ad consumptionem cache memoriam reducere, quia nunc chordas condimus label=value semel tantum in cella simul N temporibus. Haec linea magna esse potest si lineas longas in tags ac pittaciis reponetis, quae Kubernetes illuc trudere vult.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Alia optio ad accelerandum inquisitionem in inverso indice est sarcophagus. Plures inversos indices creandi pro uno et per clavem inter se datas obeundis. Hoc est a paro key=value vaporis. Hoc est, aliquot indices inversos independentes dabimus, quos in pluribus processibus in parallelis investigare possumus. Antecedens exsecutiones permissae sunt operationes in modo unius processus, i.e., notitias tantum in nucleo intuentes. Haec solutio te permittit ut notitias aliquot nucleorum simul scatentium, sicut ClickHouse placet facere. Hoc est quod instituimus peragendum.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Nunc ad oves nostras - ad functionem sectionis revertamur timeseries_ids. Quae sint exsecutiones consideremus. Munus hoc concedit ut invenias timeseries_ids ad datum paro label=value.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Prima optio simplicis exsecutio est. Ansas duae nestrae. Hic munus initus obtinemus intersectInts duo segmenta - a ΠΈ b. In output, intersectio harum crustarum ad nos redire debet.

Simplex exsecutio hoc spectat. Iteramur super omnia bona ex scalpere a, intra hanc fasciam percurramus omnes valores segmenti b. et comparamus. Si pares, intersectionem invenimus. Et salvum facere in result.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Quae sunt incommoda? Incommodum quadraticum principale est eius complexio. Exempli gratia, si dimensiones tuae sunt scalpere a ΠΈ b semel decies centena millia, hoc munus numquam tibi responsum reddet. Quia unum trillion iterationes facere necesse est, quod etiam in recentioribus computatoribus multum est.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Secunda exsecutio in tabula sumitur. Tabulam creamus. Omnes valores e segmento in hanc tabulam posuimus a. Tum per segmentum separatum ansam b. Et inspicimus an valor iste sit ex scalpere b in map. Si est, adde effectum.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Quae sunt beneficia? Utilitas est tantum complexionis linearis. Hoc est, munus multo velocius pro majoribus segmentis facient. Pro segmento decies centena millia, hoc munus in 2 decies centena millia iterationes faciet, ut trillion iterationes prioris functionis adversantur.

In downside est ut hoc munus maiorem memoriam ad hanc tabulam creandam requirat.

Secundum incommodum est magnum caput ad hashing. Incommodum hoc non est manifestissimum. Et nobis etiam non satis perspicuum fuit, ideo primo in VictoriaMetrics exsecutio intersectionis per chartam facta est. Sed tunc profiling ostendit tempus principale processus scribens in tabula et inspiciendi praesentia valoris in hac tabula.

Cur CPU tempus in his locis consumitur? Quia Go exercet has lineas hasting operationem. Hoc est, clavem detrahere computat ut tunc accedere ad illum in indice dato in HashMap. Nulla operatio calculi in decem nanoseconds perficitur. Hoc lentum est pro VictoriaMetrics.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Decrevi peculiarem hanc causam efficiendi bitset optimized. Haec intersectio duorum segmentorum nunc similis est. Hic buccellam creamus. Elementa a primo segmento addimus. Tunc in secundo segmento harum elementorum praesentiam refutamus. Eos ad et consequatur. Hoc est, fere non differt a priore exemplo. Sola res hic est quod accessum posuimus ad tabulas cum functionibus usitatis add ΠΈ has.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Primo intuitu, videtur hoc tardius laborare, si antea in tabula vexillum ibi adhibita est, et alia quaedam officia vocantur, sed profiling ostendit hanc rem ocius operari quam tabula mensuralis in VictoriaMetrics.

Praeterea multo minus memoriae in tabula exsequenda comparat. Quia hic frena recondimus pro valoribus octo-byte.

Incommodum huius exsecutionis est quod non ita evidens est, non leve.

Alterum incommodum quod multi animadvertere non possunt, haec exsecutio in quibusdam bene operari non potest. Id est, optimized est pro casu certo, ob hoc casu intersectio VictoriaMetrics series ids temporis. Non quod omnibus idoneus sit. Si perperam adhibetur, non incrementa perficiendi, sed erroris memoria et tarditas in effectu obtinebimus.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Exsecutionem huius structurae consideremus. Si spectare vis, sita est in fontibus VictoriaMetrics, in folder lib/uint64set. In casu VictoriaMetrics specialiter optimized est, ubi timeseries_id valorem 64 frenum, ubi prima 32 minuta basically constant et sola ultima 32 minuta mutatio.

Haec data structura in orbe non condita est, sed solum in memoria operatur.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

API hic est eius. Etiam non ipsum turpis. API specie ad certum exemplum utendi VictoriaMetrics formatur. Id est, munera hic non sunt necessaria. Hic sunt munera quae a VictoriaMetrics expresse utuntur.

Munera sunt addqui nova bona addit. Munus est hasqui pro novis valoribus impedit. Et est munus delqui bona privat. Est adiutor munus lenque reddit quantitatem statuto. Officium clone clones multum. Et munus appendto vertit hoc ad scalpere timeseries_ids.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Hoc est quod spectat exsecutionem huius notitiae structurae simile. set duo elementa habet:

  • ItemsCount agrum adiuvat ut cito numerum elementorum in statuto reddat. Posset facere sine hoc agro auxiliari, sed hic addendum erat quod VictoriaMetrics saepe in algorithmis suis morsum longitudinem querit.

  • Secundus ager est buckets. Hoc est scalpere ex structuram bucket32. Quisque structuram stores hi agrum. Haec sunt superiora 32 calcaria. Et duo segmenta - b16his ΠΈ buckets ex bucket16 structurae.

Caput XVI frusta secundae partis 16-bit structura hic reposita sunt. Et hic reponuntur bitseta pro inferioribus 64 cuiuslibet byte.

Bucket64 ex acie uint64. Longitudo his constantibus computata est. In uno bucket16 maximum potest condi 2^16=65536 frenum. Si hoc per 8 dividas, id est 8 chiliobyte. Si iterum per VIII dividas, suus 8 uint64 significatione. Ille est Bucket16 β€” haec nostra structura 8-kilobyte est.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Intueamur quomodo unus modus huius structurae ad novum valorem augendum perficiatur.

Omnia incipit cum uint64 significationes. Superiores 32 minutas computamus, inferiores 32 minutas computamus. Eamus per omnia buckets. Comparamus cacumen 32 minutas in unaquaque situla cum valore addito. Et si pares, munus vocamus add in structuram b32 buckets. Et adde particulam 32 inferiorem. Et si redierit trueergo hoc est quod ibi tantum addimus et non habuimus talem valorem. Si redit falseergo talis sensus iam erat. Deinde numerum elementorum augemus in structura.

Si non inveni unum opus bucket cum requiritur hi-value, tunc munus vocamus addAllocquae novam producet bucketeamque ad situlae structuram addens.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Haec est exsecutio muneris b32.add. Simile est cum praecedenti exsecutione. XVI frena insignium computamus, minimum significant 16 calcaria.

Deinde per omnia superiora 16 calcatur. Invenimus par. Et si par sit, modum addendi vocamus, quem in proxima pagina tractabimus bucket16.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Et hic est infimus gradus, qui debet esse optimized quam maxime. Computamus uint64 id valorem in scalpere frenum et etiam bitmask. Haec persona est valoris 64 obolo dato, qui ad reprimendam huius frenum praesentiam adhiberi potest vel apponere. Reprehendimus videre, si hoc frenum positum et ponemus, et praesentiam revertamur. Haec est nostra exsecutio, quae nobis permisit accelerare operationem intersecantium temporum seriei a 10 temporibus mappis conventionalibus comparati.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Praeter hanc optimam, VictoriaMetrics multas alias optimizations habet. Pleraque ex his optimizations causa additae sunt, sed posteaquam codicem in productione profixerunt.

Haec est principalis regula optimizationis - optimization non additis, si bottleneck hic erit, quia eveniat illic non erit bottleneck ibi. Optimization plerumque tollit qualitatem codicis. Valet ergo optimizing solum post profiling et potius in productione, ut haec notitia realis sit. Si quis interest, videre potes fontem codicem VictoriaMetrics et alias optimizations quae ibi sunt explorare.

Vade in optimizationes VictoriaMetrics. Alexander Valyalkin

Habeo quaestionem de bitset. Simillima cum C++ vector bool exsequendi, bitset optimized. Nonne inde exsequendam tulistis ?

Nullam non ex enim. Cum hoc bitset implendo, scientia ductus sum structuram harum ids temporum, quae in VictoriaMetrics adhibentur. Eorum structura talis est, ut superiores 32 frusta plerumque constant. In inferioribus 32 frena mutationibus obnoxia sunt. Frenum inferior, eo saepius mutare potest. Ergo haec exsecutio speciei optimized pro hac notitia structura. C++ exsecutio, quantum scio, est optimized pro generali causa. Si in generali causa optimize, id quod non erit optimal pro certo casu.

Moneo etiam te ut auditum Alexey Milovid videas. Circiter ante mensem, de optimizatione in ClickHouse loquebatur de specialibus rebus specialibus. Sicut dicit in generali casu, exsecutionem C++ vel aliam exsequendam formandam esse ad bene operandum in mediocris in nosocomio. Gravius ​​facere potest quam ad exsecutionem cognitionis specialium sicut nostrarum, ubi scimus summos 32 frenos plerumque constantes esse.

Secunda quaestio est. Quid interest fundamentalis ab InfluxDB?

Multae differentiae fundamentales sunt. In terminis executionis et memoriae consumptionis, InfluxDB in probationibus ostendit 10 tempora plus memoriae consumptionis ad altam cardinalitatis seriem temporis, cum multum ex illis habes, exempli gratia, decies centena millia. Exempli gratia, VictoriaMetrics 1 GB per decies ordines activos consumit, dum InfluxDB consumit 10 GB. Et hoc magna differentia est.

Secunda differentia fundamentalis est quod InfluxDB ignotas interrogationes habet linguas - Flux et InfluxQL. Non sunt valde commoda operandi cum seriebus temporis comparati PromQLquod adstipulatur VictoriaMetrics. PromQL quaesitum est a Prometheo sermone.

Et magis interest, quod InfluxDB exemplum notae leviter alienae habet, ubi singulae lineae plures agros cum diversis textorum statutis condere possunt. Porro hi versus in varias tabulas dividuntur. Hae inpedimenta additamenta subsequentem opus cum hoc database inpediunt. Difficile est auxilium et intelligere.

In VictoriaMetrics omnia multo simpliciora sunt. Ibi, singulis temporis seriei valorem key est. Valor punctarum est copia - (timestamp, value)et clavis est paro label=value. Nulla est separatio inter agros et mensuras. Permittit ut data quaevis deligere ac deinde conjungere, addere, minuere, multiplicare, dividere, dissimiles InfluxDB ubi calculi inter diversos ordines adhuc non implentur quantum scio. Etiam si perficiantur, difficile est, multam codicem scribere.

Habeo quaestionem declarandam. Nonne recte intellexi esse aliquod genus problematis quod dixisti, hunc inversum indicem in memoriam non aptum esse, ut ibi partiatur?

Primum demonstravi simplicem exsecutionem inversi indicis in signo Go map. Haec exsecutio non competit databases quia index inversus hic in disco servatus non est, et database salvare debet ad disco ut haec notitia super sileo praesto manet. In hac exsecutione, cum applicationem sileo, inversus index tuus abibit. Et accessum perdes ad omnia notitia quia eam invenire non poteris.

Salve! Gratias pro fama! Nomen mihi Pavel est. Ego Wildberries ex. Habeo tibi paucas quaestiones. Q. unum. Putas, si aliud principium elegisses cum architecturae applicationis aedificandae et notitias temporis partita, tum fortasse notitias cum inquisitione intersecare potuisses, eo tantum quod una partitio data pro uno continetur. temporis spatium, hoc est in uno temporis intervallo, et non debes curare de eo quod membra tua aliter dispersa sunt? Quaeritur numerus 2 - Cum simile algorithmum cum morsu et omnibus aliis exsequeris, tunc fortasse instructionibus processus processus uti conatus es? Forsitan tales optimizationes probasti?

Respondebo secundo statim. Non tamen eo loco adepti sumus. sed si opus fuerit, illuc perveniemus. Et primo, quae fuit quaestio?

Duos missiones tractasti. Et dixerunt quod alterum elegerunt multiplicius exsequendum. Et non prius, ubi notitia temporis partita est.

Ita. In primo casu totum volumen indicis maius esset, quod in singulis partitionibus notitias duplicatas illis temporis seriei per omnes istas partitiones condere debebimus. Et si temporis tui series contorquens rate est parva, i.e. eadem serie assidue adhibita, in primo casu multo plus amitteremus in quantitate orbis spatii occupato casu secundo comparato.

Itaque - sic, tempus partitionis est bene optio. Prometheus eo utitur. Sed aliud incommodum est Prometheus. Cum hae partes datae merguntur, necesse est ut meta notitiarum omnium pittacium et timeseriorum memoria tenere possit. Si igitur partes notitiarum, quae merguntur, sunt magnae, memoria consummatio multum crescit in bus, dissimilis VictoriaMetrics. Cum bus, VictoriaMetrics memoriam omnino non consumit, duo tantum kilobytes consumpti sunt, cuiuscumque molis notitias immersas.

Algorithmus quo utitur memoria. Notat timeseries tags quae valores continent. Et hoc modo quaeras pro paria praesentia in una notitia ordinata et in alia. Et scias utrum concurrat factum vel non. De more, databases efficiunt cursores et iteratores qui reponunt contentum currentem et per digesta data currunt ob simplicis harum operationum multiplicitatem.

Cur non utimur cursoribus ad notitias percurrendas?

Quod sic.

Condimus ordines digestos in LevelDB vel mergeset. cursorem movere possumus et intersectionem invenire. Cur non utimur? Quia tardus est. Quia cursores significant opus esse te vocare ad singulas lineas functionem. Munus vocationis 5 nanoseconds. Et si 100 lineas habes, tunc evenit ut dimidiae secundae vocationis munus impendamus.

Tale quid est, Etiam. Et ultima quaestio. Ut sonet paulo minim quaestio. Cur non possibilia sunt omnia necessaria aggregata legere, tempore quo notitia advenit et salvare in forma inquisita? Cur nisi ingentia volumina in quibusdam systematibus ut VictoriaMetrics, ClickHouse, etc., et tunc multum temporis in illis expendas?

Exemplum dabo quo clarius fiat. Dicamus quomodo parva ludibrio speedometer operatur? Commemorat spatium, quod perrexeris, omne tempus addens ad unum valorem, tempusque secundo. & dividit. Mediocris accipit celeritas. Hoc idem facere potes. Adde omnia quae necessaria sunt in musca.

Bene, intelligo quaestionem. Exemplum tuum locum habet. Si scias quid aggregata indigeas, haec optima est exsecutio. Sed quaestio est quia homines istos metricos salvant, quaedam notitia in ClickHouse et nondum sciunt quomodo eos aggregabunt et in futurum emittunt, ut omnia rudis notitia salvare debeant. Sed si scias debes aliquid in mediocritate calculare, cur non calculare pro fasciculum rudium bonorum ibi accommodare? Sed hoc tantum est, si plane scis quod tibi necessarium est.

Viam temporis series databases pro repono sustentationem aggregatorum computatis. Prometheus sustinet memoria praecepta. Id est, hoc fieri potest si scias quibus locis opus erit. Hoc tamen VictoriaMetrica non habet, sed plerumque a Prometheo praecedere, in quo id fieri potest in recensendis regulis.

Exempli causa, in priore officio meo opus erat rerum numerum in fenestra illabili in hora ultima computare. Problema est quod consuetudo deducendi in Go, i.e., servitium pro computatione rei facere debebam. Hoc officium ultimo non-levis fuit, quia ratiocinari difficile est. Exsecutio simplex esse potest, si certum temporis intervalla aliqua aggregata numerare debes. Si res numerare in fenestra illapsum vis, non tam simplex ut videtur. Hoc puto nondum impletum esse in databases ClickHouse vel in temporibuseries, quia difficile est ad efficiendum.

Et alia quaestio. Mox de averinge locuti sumus, et recordatus sum olim tale aliquid fuisse quod Graphite cum Carbon backend. Et sciebat antiquas notitias tenuare, id est, relinquere unum punctum per minutum, unum punctum per horam, etc. attenuari. Sed Prometheus et VictoriaMetrics hanc functionem non sustinent. Numquid cogitavit hoc favere? si non, quidni?

Gratias ago pro qu. Nostri usores hanc quaestionem interrogent. Quaerunt, cum auxilium downsampling addemus. Plures quaestiones hic sunt. Uno modo, omnis usor intelligit downsampling aliquid diversum: quis vult arbitrarium aliquod punctum dato intervallo obtinere, quis velit maximos, minimos, mediocris valores. Si plures systemata notitias datorum vestrorum scribunt, ea omnia simul massa facere non potes. Fortassis singula ratio requirit extenuandum diversum. Idque difficile est aggredi.

Secundum est quod VictoriaMetrics, sicut ClickHouse, est optimized ad operandum in magna copia rudium notitiarum, ut in minus quam secundum lineas sescenti trudere potest, si plures nucleos in tuo systemate habes. Series temporis intuens puncta in VictoriaMetrics – 50 puncta per secundam per core. Et hoc faciendum squamis nucleis existentibus. Hoc est, si 000 metretas habeas, verbi gratia, puncta per alterum miliardis lustrabis. Et haec proprietas VictoriaMetrics et ClickHouse opus reducit ad downsamling.

Aliud notabile est quod VictoriaMetrics efficaciter hanc notitiam comprimit. Compressio mediocris in productione ab 0,4 ad 0,8 bytes per punctum. Uniuscuiusque rei indicatione + pretii est. Et comprimatur in minus quam unum byte in mediocris.

Sergey. Habeo qu. Quid est minimum temporis quantum?

Alter millisecond. Nuper colloquium cum aliis temporis seriebus datorum datorum nuper habuimus. Segmentum minimum temporis alterum est. Et in Graphite, exempli gratia, etiam una secunda est. Est etiam in OpenTSDB una secunda. InfluxDB nanosecond habet subtilitatem. In VictoriaMetrics est unum milli alterum, quia in Prometheo est unum milli alterum. Et VictoriaMetrics primum evoluta est ut reposita Prometheo remota. Nunc sed mauris ex.

Persona locutus sum ut secundo ad secundum accurate se habere - id eis satis est quod pendet a genere notitiarum quae in datorum serie temporis repositae sunt. Si haec DevOps notitia vel notitia ex infrastructura est, ubi eam colliges interiectis 30 secundis per minutias, secunda accuratio satis est, nihilo minus eges. Et si hanc notitias ab alto systematis frequentiae negotiandi colliges, accuratione nanoseconda debes.

Accuratio millis altera in VictoriaMetrics etiam ad casus DevOps aptus est, et aptior esse potest pluribus casibus quos in principio relationis commemoravi. Restat ut non sit idoneus ratio frequentia negotiatione alta.

Gratias tibi! Et alia quaestio. Quid est compatibilitas in PromQL?

Plena verfuum convenientia. Plene VictoriaMetrics tuetur PromQL. Praeterea addit functionem provectam in PromQL, quae appellatur MetricsQL. Sermo in YouTube est de hac functione extensa. Locutus sum ad vigilantiam Meetup in fonte St. Petersburg.

telegraphum channel VictoriaMetrics.

Tantum usores descripserunt in aliquet participare possunt. InscribeTe gratissimum esse.

Quid te prohibet de commutatione ad VictoriaMetrics ut diuturnum tempus pro Prometheo repono? (Scribe in commentarios, ego eam ad suffragium addam))

  • 71,4%Non utor Prometheus5

  • 28,6%Nesciebat de VictoriaMetrics2

7 utentes censuerunt. 12 Utentes abstinuerunt.

Source: www.habr.com