Laika rindu datubÄze (TSDB) programmÄ Prometheus 2 ir lielisks inženierijas risinÄjuma piemÄrs, kas piedÄvÄ ievÄrojamus uzlabojumus salÄ«dzinÄjumÄ ar Prometheus 2 v1 krÄtuvi datu uzkrÄÅ”anas Ätruma, vaicÄjumu izpildes un resursu efektivitÄtes ziÅÄ. MÄs ieviesÄm Prometheus 2 programmÄ Percona Monitoring and Management (PMM), un man bija iespÄja izprast Prometheus 2 TSDB veiktspÄju. Å ajÄ rakstÄ es runÄÅ”u par Å”o novÄrojumu rezultÄtiem.
VidÄjÄ Prometeja darba slodze
Tiem, kas pieraduÅ”i strÄdÄt ar vispÄrÄjas nozÄ«mes datu bÄzÄm, tipiskÄ Prometheus darba slodze ir diezgan interesanta. Datu uzkrÄÅ”anas Ätrums mÄdz bÅ«t stabils: parasti jÅ«su pÄrraudzÄ«tie pakalpojumi nosÅ«ta aptuveni tÄdu paÅ”u rÄdÄ«tÄju skaitu, un infrastruktÅ«ra mainÄs salÄ«dzinoÅ”i lÄni.
InformÄcijas pieprasÄ«jumi var nÄkt no dažÄdiem avotiem. Daži no tiem, piemÄram, brÄ«dinÄjumi, arÄ« tiecas pÄc stabilas un paredzamas vÄrtÄ«bas. Citi, piemÄram, lietotÄju pieprasÄ«jumi, var izraisÄ«t sÄriju, lai gan lielÄkajai daļai darba slodžu tas tÄ nav.
Slodzes tests
TestÄÅ”anas laikÄ es koncentrÄjos uz spÄju uzkrÄt datus. Es izvietoju Prometheus 2.3.2, kas kompilÄts ar Go 1.10.1 (kÄ daļa no PMM 1.14), Linode pakalpojumÄ, izmantojot Å”o skriptu:
Visi tÄlÄk minÄtie testi tika veikti Linode serverÄ« ar astoÅiem virtuÄlajiem kodoliem un 32 GB atmiÅu, palaižot 20 slodzes simulÄcijas, pÄrraugot divus simtus MySQL gadÄ«jumu. Vai, runÄjot Prometeja izteiksmÄ, 800 mÄrÄ·i, 440 skrÄpÄjumi sekundÄ, 380 tÅ«kstoÅ”i ierakstu sekundÄ un 1,7 miljoni aktÄ«vo laikrindu.
Dizains
ParastÄ pieeja tradicionÄlajÄm datu bÄzÄm, ieskaitot to, ko izmanto Prometheus 1.x, ir storage.tsdb.min-block-duration
, kas nosaka, cik ilgi ieraksti tiks saglabÄti atmiÅÄ pirms izskaloÅ”anas diskÄ (noklusÄjums ir 2 stundas). NepiecieÅ”amais atmiÅas apjoms bÅ«s atkarÄ«gs no neto ienÄkoÅ”ajai straumei pievienoto laikrindu, etiÄ·eÅ”u un skrÄpÄjumu skaita. RunÄjot par diska vietu, Prometheus mÄrÄ·is ir izmantot 3 baitus vienam ierakstam (paraugam). No otras puses, atmiÅas prasÄ«bas ir daudz augstÄkas.
Lai gan ir iespÄjams konfigurÄt bloka lielumu, nav ieteicams to konfigurÄt manuÄli, tÄpÄc esat spiests pieŔķirt Prometheus tik daudz atmiÅas, cik tas prasa jÅ«su darba slodzi.
Ja nav pietiekami daudz atmiÅas, lai atbalstÄ«tu ienÄkoÅ”o metrikas straumi, Prometheus izkritÄ«s no atmiÅas vai OOM slepkava tiks pie tÄs.
MijmaiÅas pievienoÅ”ana, lai aizkavÄtu avÄriju, kad Prometheus beidzas atmiÅa, Ä«sti nepalÄ«dz, jo Ŕīs funkcijas izmantoÅ”ana izraisa eksplozÄ«vu atmiÅas patÄriÅu. Es domÄju, ka tas ir kaut kas saistÄ«ts ar Go, tÄ atkritumu savÄcÄju un veidu, kÄ tas nodarbojas ar mijmaiÅas darÄ«jumiem.
VÄl viena interesanta pieeja ir konfigurÄt galvas bloku tÄ, lai tas noteiktÄ laikÄ tiktu izskalots diskÄ, nevis skaitÄ«tu to no procesa sÄkuma.
KÄ redzams diagrammÄ, diska skaloÅ”ana notiek ik pÄc divÄm stundÄm. Ja mainÄt parametru min-block-duration uz vienu stundu, Ŕīs atiestatÄ«Å”anas tiks veiktas katru stundu, sÄkot pÄc pusstundas.
Ja vÄlaties izmantot Å”o un citus grafikus savÄ Prometheus instalÄcijÄ, varat izmantot Å”o
Mums ir aktÄ«vs bloks, ko sauc par galvas bloku, kas tiek saglabÄts atmiÅÄ; bloki ar vecÄkiem datiem ir pieejami, izmantojot mmap()
. Tas novÄrÅ” nepiecieÅ”amÄ«bu atseviŔķi konfigurÄt keÅ”atmiÅu, bet arÄ« nozÄ«mÄ, ka jums ir jÄatstÄj pietiekami daudz vietas operÄtÄjsistÄmas keÅ”atmiÅai, ja vÄlaties vaicÄt datus, kas ir vecÄki par to, ko var uzÅemt galvas blokÄ.
Tas arÄ« nozÄ«mÄ, ka Prometheus virtuÄlÄs atmiÅas patÄriÅÅ” izskatÄ«sies diezgan augsts, par ko nav jÄuztraucas.
VÄl viens interesants dizaina aspekts ir WAL izmantoÅ”ana (uzrakstÄ«t žurnÄlu). KÄ redzams uzglabÄÅ”anas dokumentÄcijÄ, Prometheus izmanto WAL, lai izvairÄ«tos no avÄrijÄm. KonkrÄti mehÄnismi datu saglabÄÅ”anas garantÄÅ”anai diemžÄl nav labi dokumentÄti. Prometheus versija 2.3.2 izskalo WAL diskÄ ik pÄc 10 sekundÄm, un Å”o opciju lietotÄjs nevar konfigurÄt.
BlÄ«vÄjumi
Prometheus TSDB ir veidots kÄ LSM (Log Structured Merge) veikals: galvas bloks periodiski tiek izskalots diskÄ, savukÄrt blÄ«vÄÅ”anas mehÄnisms apvieno vairÄkus blokus, lai izvairÄ«tos no pÄrÄk daudzu bloku skenÄÅ”anas vaicÄjumu laikÄ. Å eit jÅ«s varat redzÄt bloku skaitu, ko es novÄroju testa sistÄmÄ pÄc slodzes dienas.
Ja vÄlaties uzzinÄt vairÄk par veikalu, varat izpÄtÄ«t failu meta.json, kurÄ ir informÄcija par pieejamajiem blokiem un to raÅ”anos.
{
"ulid": "01CPZDPD1D9R019JS87TPV5MPE",
"minTime": 1536472800000,
"maxTime": 1536494400000,
"stats": {
"numSamples": 8292128378,
"numSeries": 1673622,
"numChunks": 69528220
},
"compaction": {
"level": 2,
"sources": [
"01CPYRY9MS465Y5ETM3SXFBV7X",
"01CPYZT0WRJ1JB1P0DP80VY5KJ",
"01CPZ6NR4Q3PDP3E57HEH760XS"
],
"parents": [
{
"ulid": "01CPYRY9MS465Y5ETM3SXFBV7X",
"minTime": 1536472800000,
"maxTime": 1536480000000
},
{
"ulid": "01CPYZT0WRJ1JB1P0DP80VY5KJ",
"minTime": 1536480000000,
"maxTime": 1536487200000
},
{
"ulid": "01CPZ6NR4Q3PDP3E57HEH760XS",
"minTime": 1536487200000,
"maxTime": 1536494400000
}
]
},
"version": 1
}
SablÄ«vÄÅ”anÄs Prometheus ir saistÄ«ta ar laiku, kad galvas bloks tiek izskalots ar disku. Å ajÄ brÄ«dÄ« var veikt vairÄkas Å”Ädas darbÄ«bas.
Å Ä·iet, ka blÄ«vÄÅ”ana nekÄdÄ veidÄ nav ierobežota un izpildes laikÄ var izraisÄ«t lielus diska I/O tapas.
CPU slodzes tapas
Protams, tas diezgan negatÄ«vi ietekmÄ sistÄmas Ätrumu, kÄ arÄ« rada nopietnu izaicinÄjumu LSM krÄtuvei: kÄ veikt blÄ«vÄÅ”anu, lai atbalstÄ«tu augstu pieprasÄ«jumu Ätrumu, neradot pÄrÄk lielas izmaksas?
Diezgan interesanti izskatÄs arÄ« atmiÅas izmantoÅ”ana blÄ«vÄÅ”anas procesÄ.
MÄs redzam, kÄ pÄc sablÄ«vÄÅ”anas lielÄkÄ daļa atmiÅas maina statusu no KeÅ”atmiÅas uz BrÄ«vu: tas nozÄ«mÄ, ka no turienes ir noÅemta potenciÄli vÄrtÄ«gÄ informÄcija. Interesanti, vai tas tiek izmantots Å”eit fadvice()
vai kÄds cits minimizÄÅ”anas paÅÄmiens, vai tas ir tÄpÄc, ka keÅ”atmiÅa tika atbrÄ«vota no blÄ«vÄÅ”anas laikÄ iznÄ«cinÄtajiem blokiem?
AtveseļoÅ”anÄs pÄc neveiksmes
AtgÅ«Å”anÄs no neveiksmÄm prasa laiku, un tam ir labs iemesls. IenÄkoÅ”ajai straumei miljona ierakstu sekundÄ man bija jÄgaida apmÄram 25 minÅ«tes, kamÄr tika veikta atkopÅ”ana, Åemot vÄrÄ SSD disku.
level=info ts=2018-09-13T13:38:14.09650965Z caller=main.go:222 msg="Starting Prometheus" version="(version=2.3.2, branch=v2.3.2, revision=71af5e29e815795e9dd14742ee7725682fa14b7b)"
level=info ts=2018-09-13T13:38:14.096599879Z caller=main.go:223 build_context="(go=go1.10.1, user=Jenkins, date=20180725-08:58:13OURCE)"
level=info ts=2018-09-13T13:38:14.096624109Z caller=main.go:224 host_details="(Linux 4.15.0-32-generic #35-Ubuntu SMP Fri Aug 10 17:58:07 UTC 2018 x86_64 1bee9e9b78cf (none))"
level=info ts=2018-09-13T13:38:14.096641396Z caller=main.go:225 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2018-09-13T13:38:14.097715256Z caller=web.go:415 component=web msg="Start listening for connections" address=:9090
level=info ts=2018-09-13T13:38:14.097400393Z caller=main.go:533 msg="Starting TSDB ..."
level=info ts=2018-09-13T13:38:14.098718401Z caller=repair.go:39 component=tsdb msg="found healthy block" mint=1536530400000 maxt=1536537600000 ulid=01CQ0FW3ME8Q5W2AN5F9CB7R0R
level=info ts=2018-09-13T13:38:14.100315658Z caller=web.go:467 component=web msg="router prefix" prefix=/prometheus
level=info ts=2018-09-13T13:38:14.101793727Z caller=repair.go:39 component=tsdb msg="found healthy block" mint=1536732000000 maxt=1536753600000 ulid=01CQ78486TNX5QZTBF049PQHSM
level=info ts=2018-09-13T13:38:14.102267346Z caller=repair.go:39 component=tsdb msg="found healthy block" mint=1536537600000 maxt=1536732000000 ulid=01CQ78DE7HSQK0C0F5AZ46YGF0
level=info ts=2018-09-13T13:38:14.102660295Z caller=repair.go:39 component=tsdb msg="found healthy block" mint=1536775200000 maxt=1536782400000 ulid=01CQ7SAT4RM21Y0PT5GNSS146Q
level=info ts=2018-09-13T13:38:14.103075885Z caller=repair.go:39 component=tsdb msg="found healthy block" mint=1536753600000 maxt=1536775200000 ulid=01CQ7SV8WJ3C2W5S3RTAHC2GHB
level=error ts=2018-09-13T14:05:18.208469169Z caller=wal.go:275 component=tsdb msg="WAL corruption detected; truncating" err="unexpected CRC32 checksum d0465484, want 0" file=/opt/prometheus/data/.prom2-data/wal/007357 pos=15504363
level=info ts=2018-09-13T14:05:19.471459777Z caller=main.go:543 msg="TSDB started"
level=info ts=2018-09-13T14:05:19.471604598Z caller=main.go:603 msg="Loading configuration file" filename=/etc/prometheus.yml
level=info ts=2018-09-13T14:05:19.499156711Z caller=main.go:629 msg="Completed loading of configuration file" filename=/etc/prometheus.yml
level=info ts=2018-09-13T14:05:19.499228186Z caller=main.go:502 msg="Server is ready to receive web requests."
GalvenÄ atkopÅ”anas procesa problÄma ir liels atmiÅas patÄriÅÅ”. Neskatoties uz to, ka normÄlÄ situÄcijÄ serveris var stabili strÄdÄt ar tÄdu paÅ”u atmiÅas apjomu, avÄrijas gadÄ«jumÄ tas var neatkopties OOM dÄļ. VienÄ«gais risinÄjums, ko atradu, bija atspÄjot datu vÄkÅ”anu, atvÄrt serveri, ļaut tam atgÅ«ties un atsÄknÄt ar iespÄjotu vÄkÅ”anu.
IesildÄ«Å”anÄs
VÄl viena uzvedÄ«ba, kas jÄpatur prÄtÄ iesildÄ«Å”anÄs laikÄ, ir saistÄ«ba starp zemu veiktspÄju un lielu resursu patÄriÅu uzreiz pÄc starta. Dažos, bet ne visos startos novÄroju nopietnu CPU un atmiÅas slodzi.
AtmiÅas lietojuma nepilnÄ«bas norÄda, ka Prometheus nevar konfigurÄt visas kolekcijas no paÅ”a sÄkuma, un daļa informÄcijas tiek zaudÄta.
Es neesmu noskaidrojis precÄ«zus augstÄs CPU un atmiÅas slodzes iemeslus. Man ir aizdomas, ka tas ir saistÄ«ts ar jaunu laika rindu izveidi galvas blokÄ ar augstu frekvenci.
CPU slodzes pieaugums
Papildus blÄ«vÄjumiem, kas rada diezgan lielu I/O slodzi, es pamanÄ«ju nopietnus CPU slodzes lÄcienus ik pÄc divÄm minÅ«tÄm. PÄrrÄvumi ir garÄki, ja ievades plÅ«sma ir liela, un Ŕķiet, ka tos izraisa Go atkritumu savÄcÄjs, un vismaz daži serdeÅi ir pilnÄ«bÄ noslogoti.
Å ie lÄcieni nemaz nav tik mazsvarÄ«gi. Å Ä·iet, ka tad, kad tie notiek, Prometheus iekÅ”Äjais ievades punkts un metrika kļūst nepieejami, radot datu nepilnÄ«bas tajos paÅ”os laika periodos.
Varat arÄ« pamanÄ«t, ka Prometheus eksportÄtÄjs uz vienu sekundi izslÄdzas.
Varam pamanÄ«t korelÄcijas ar atkritumu savÄkÅ”anu (GC).
SecinÄjums
Prometheus 2 TSDB ir Ätrs, spÄj apstrÄdÄt miljoniem laikrindu un tajÄ paÅ”Ä laikÄ tÅ«kstoÅ”iem ierakstu sekundÄ, izmantojot diezgan pieticÄ«gu aparatÅ«ru. CPU un diska I/O izmantoÅ”ana arÄ« ir iespaidÄ«ga. Mans piemÄrs parÄdÄ«ja lÄ«dz 200 000 metrikas sekundÄ uz vienu izmantoto kodolu.
Lai plÄnotu paplaÅ”inÄÅ”anu, jums jÄatceras par pietiekamu atmiÅas apjomu, un tai ir jÄbÅ«t reÄlai atmiÅai. Manis novÄrotais izmantotÄs atmiÅas apjoms bija aptuveni 5 GB uz 100 000 ierakstu sekundÄ ienÄkoÅ”Äs straumes, kas kopÄ ar operÄtÄjsistÄmas keÅ”atmiÅu deva aptuveni 8 GB aizÅemtÄs atmiÅas.
Protams, vÄl ir daudz jÄstrÄdÄ, lai pieradinÄtu CPU un disku I/O tapas, un tas nav pÄrsteidzoÅ”i, Åemot vÄrÄ to, cik jauns TSDB Prometheus 2 ir salÄ«dzinÄjumÄ ar InnoDB, TokuDB, RocksDB, WiredTiger, taÄu tiem visiem bija lÄ«dzÄ«gi problÄmas dzÄ«ves cikla sÄkumÄ.
Avots: www.habr.com