Pangitaa sa 1 TB/s

TL; DR: Upat ka tuig ang milabay gibiyaan nako ang Google nga adunay usa ka ideya alang sa usa ka bag-ong himan sa pag-monitor sa server. Ang ideya mao ang paghiusa sa kasagarang nahilain nga mga gimbuhaton sa usa ka serbisyo pagkolekta ug pagtuki sa log, pagkolekta sa metrics, mga alerto ug mga dashboard. Usa sa mga prinsipyo mao nga ang serbisyo kinahanglang tinuod paspas, naghatag sa mga devops og sayon, interactive, makalingaw nga kasinatian. Nagkinahanglan kini og pagproseso sa mga multi-gigabyte data set sa mga tipik sa usa ka segundo samtang nagpabilin sa sulod sa badyet. Ang kasamtangan nga mga himan sa pagdumala sa log kasagaran hinay ug clunky, mao nga nag-atubang kami sa usa ka maayo nga hagit: maalamon nga pagdesinyo sa usa ka himan aron mahatagan ang mga tiggamit og bag-ong kasinatian.

Gihubit niini nga artikulo kung giunsa namo sa Scalyr pagsulbad kini nga problema pinaagi sa pagpadapat sa mga pamaagi sa daan nga eskwelahan, usa ka brute force nga pamaagi, pagwagtang sa dili kinahanglan nga mga lut-od ug paglikay sa komplikadong mga istruktura sa datos. Mahimo nimong magamit kini nga mga leksyon sa imong kaugalingon nga mga problema sa engineering.

Gahum sa Daang Tulunghaan

Ang pagtuki sa log kasagaran magsugod sa pagpangita: pangitaa ang tanang mensahe nga mohaum sa usa ka piho nga sumbanan. Sa Scalyr, kini mga napulo o gatusan ka gigabytes nga mga troso gikan sa daghang mga server. Ang mga modernong pamaagi, ingon nga usa ka lagda, naglakip sa pagtukod sa pipila ka komplikado nga istruktura sa datos nga na-optimize alang sa pagpangita. Nakita gyud nako kini sa Google, diin maayo sila sa kini nga klase nga butang. Apan naghusay kami sa usa ka labi ka cruder nga pamaagi: linear scan sa mga troso. Ug kini nagtrabaho - naghatag kami usa ka makit-an nga interface nga mga order sa kadako nga mas paspas kaysa sa among mga kakompetensya (tan-awa ang animation sa katapusan).

Ang yawe nga panabut mao nga ang mga modernong processor sa tinuud paspas kaayo sa yano, prangka nga mga operasyon. Kini daling masipyat sa komplikado, multi-layer nga mga sistema nga nagsalig sa I/O speed ug network operations, ug ang maong mga sistema kay komon na kaayo karon. Busa nakahimo kami og usa ka disenyo nga nagpamenos sa mga lut-od ug sobra nga mga tinumpag. Uban sa daghang mga processor ug server nga managsama, ang katulin sa pagpangita moabot sa 1 TB matag segundo.

Panguna nga pagkuha gikan sa kini nga artikulo:

  • Ang brute-force search usa ka praktikal nga pamaagi sa pagsulbad sa tinuod nga kalibutan, dagkong mga problema.
  • Ang brute force usa ka teknik sa disenyo, dili solusyon nga walay trabaho. Sama sa bisan unsang teknik, kini mas haum sa pipila ka mga problema kay sa uban, ug mahimong ipatuman nga dili maayo o maayo.
  • Ang brute force labi ka maayo alang sa pagkab-ot lig-on pagka-produktibo.
  • Ang epektibo nga paggamit sa brute force nanginahanglan pag-optimize sa code ug paggamit sa igo nga mga kapanguhaan sa husto nga oras. Angayan kini kung ang imong mga server ubos sa bug-at nga non-user load ug ang mga operasyon sa user nagpabilin nga prayoridad.
  • Ang pasundayag nagdepende sa disenyo sa tibuok sistema, dili lang sa algorithm sa sulod nga loop.

(Kini nga artikulo naghulagway sa pagpangita sa datos sa memorya. Sa kadaghanang mga kaso, sa dihang ang usa ka user mohimo ug log search, ang Scalyr servers naka-cache na niini. Ang sunod nga artikulo maghisgot sa pagpangita sa wala ma-cached nga mga log. Ang sama nga mga prinsipyo magamit: efficient code, brute force nga adunay daghang mga kapanguhaan sa pagkalkula).

Brute force nga pamaagi

Sa naandan, ang usa ka dako nga set sa datos gipangita gamit ang indeks sa keyword. Kung gipadapat sa mga log sa server, nagpasabut kini nga pagpangita sa matag talagsaon nga pulong sa log. Alang sa matag pulong, kinahanglan nimo nga maghimo usa ka lista sa tanan nga mga inklusyon. Gipasayon ​​niini ang pagpangita sa tanang mensahe nga adunay niini nga pulong, pananglitan 'error', 'firefox' o "transaction_16851951" - tan-awa lang sa index.

Gigamit nako kini nga pamaagi sa Google ug kini nagtrabaho og maayo. Apan sa Scalyr among pangitaon ang mga log byte byte.

Ngano man? Gikan sa abstract algorithmic nga punto sa panglantaw, ang mga keyword index mas episyente kaysa brute force nga pagpangita. Bisan pa, wala kami nagbaligya sa mga algorithm, gibaligya namon ang pasundayag. Ug ang pasundayag dili lamang bahin sa mga algorithm, apan bahin usab sa engineering sa sistema. Kinahanglan natong tagdon ang tanan: gidaghanon sa datos, matang sa pagpangita, anaa nga konteksto sa hardware ug software. Nakahukom kami nga alang sa among partikular nga problema, usa ka butang sama sa 'grep' nga mas haum kaysa usa ka indeks.

Ang mga indeks maayo, apan kini adunay mga limitasyon. Ang usa ka pulong sayon ​​​​nga pangitaon. Apan ang pagpangita sa mga mensahe nga adunay daghang mga pulong, sama sa 'googlebot' ug '404', labi ka lisud. Ang pagpangita alang sa usa ka hugpong sa mga pulong sama sa 'wala makuha nga eksepsiyon' nanginahanglan usa ka labi ka lisud nga indeks nga nagrekord dili lamang sa tanan nga mga mensahe nga adunay kana nga pulong, apan usab ang piho nga lokasyon sa pulong.

Ang tinuod nga kalisud moabut kung wala ka mangita sa mga pulong. Ingnon ta nga gusto nimo makita kung pila ang trapiko gikan sa mga bot. Ang una nga hunahuna mao ang pagpangita sa mga troso alang sa pulong nga 'bot'. Ingon niini kung giunsa nimo makit-an ang pipila ka mga bot: Googlebot, Bingbot ug daghan pa. Apan dinhi ang 'bot' dili usa ka pulong, apan usa ka bahin niini. Kung pangitaon namo ang 'bot' sa index, wala mi makit-an nga mga post nga adunay pulong nga 'Googlebot'. Kung imong susihon ang matag pulong sa indeks ug dayon i-scan ang indeks alang sa mga keyword nga nakit-an, ang pagpangita mohinay pag-ayo. Ingon nga resulta, ang ubang mga log program wala magtugot sa part-word search o (labing maayo) motugot sa espesyal nga syntax nga adunay ubos nga performance. Gusto namong likayan kini.

Laing problema mao ang punctuation. Gusto ba nimo pangitaon ang tanan nga mga hangyo gikan sa 50.168.29.7? Unsa ang mahitungod sa pag-debug sa mga log nga adunay sulod [error]? Ang mga subscript kasagarang molaktaw sa punctuation.

Sa katapusan, ang mga inhenyero nahigugma sa gamhanan nga mga himan, ug usahay ang usa ka problema masulbad lamang sa usa ka regular nga ekspresyon. Ang keyword index dili kaayo angay alang niini.

Dugang pa, ang mga indeks komplikado. Ang matag mensahe kinahanglan idugang sa daghang mga lista sa keyword. Kini nga mga lista kinahanglan nga tipigan sa usa ka dali nga pangitaon nga pormat sa tanang panahon. Ang mga pangutana nga adunay mga hugpong sa mga pulong, mga tipik sa pulong, o regular nga mga ekspresyon kinahanglang hubaron ngadto sa multi-list nga mga operasyon, ug ang mga resulta gi-scan ug gihiusa aron makahimo og resulta nga set. Sa konteksto sa usa ka dako, multi-tenant nga serbisyo, kini nga pagkakomplikado nagmugna sa mga isyu sa pasundayag nga dili makita sa pag-analisar sa mga algorithm.

Ang mga index sa keyword nagkinahanglan usab og daghang luna, ug ang pagtipig usa ka dakong gasto sa sistema sa pagdumala sa log.

Sa laing bahin, ang matag pagpangita makahurot ug daghang gahum sa pag-compute. Gipabilhan sa among mga tiggamit ang taas nga tulin nga pagpangita alang sa talagsaon nga mga pangutana, apan ang ingon nga mga pangutana panagsa ra gihimo. Alang sa kasagaran nga mga pangutana sa pagpangita, pananglitan, alang sa usa ka dashboard, naggamit kami og espesyal nga mga teknik (atong ihulagway kini sa sunod nga artikulo). Ang ubang mga hangyo panagsa ra kaayo nga panagsa ra nimo kinahanglan nga magproseso labaw sa usa sa usa ka higayon. Apan wala kini magpasabut nga ang among mga server dili busy: sila busy sa trabaho sa pagdawat, pag-analisar ug pag-compress sa mga bag-ong mensahe, pagtimbang-timbang sa mga alerto, pag-compress sa daan nga datos, ug uban pa. Sa ingon, kami adunay usa ka hinungdanon nga suplay sa mga processor nga magamit sa pagpatuman sa mga pangutana.

Ang brute force molihok kung ikaw adunay usa ka brute nga problema (ug daghang kusog)

Ang brute force labing maayo sa yano nga mga problema nga adunay gagmay nga internal loops. Kasagaran mahimo nimo nga ma-optimize ang internal loop nga modagan sa taas kaayo nga katulin. Kung komplikado ang code, mas lisud ang pag-optimize niini.

Ang among search code sa orihinal adunay medyo dako nga sulud sa sulud. Gitipigan namon ang mga mensahe sa mga panid sa 4K; ang matag panid adunay pipila ka mga mensahe (sa UTF-8) ug metadata alang sa matag mensahe. Ang metadata usa ka istruktura nga nag-encode sa gitas-on sa kantidad, internal nga ID sa mensahe, ug uban pang mga natad. Ang siklo sa pagpangita ingon niini:

Pangitaa sa 1 TB/s

Kini usa ka gipasimple nga bersyon sa aktuwal nga code. Apan bisan dinhi, daghang mga pagbutang sa butang, mga kopya sa datos, ug mga tawag sa function makita. Ang JVM maayo kaayo sa pag-optimize sa mga tawag sa function ug pag-alokar sa mga ephemeral nga mga butang, mao nga kini nga kodigo nagtrabaho nga mas maayo kaysa sa angay kanamo. Atol sa pagsulay, gigamit kini sa mga kustomer nga malampuson. Apan sa kadugayan among gidala kini sa sunod nga lebel.

(Mahimong mangutana ka kung ngano nga nagtipig kami mga mensahe sa kini nga format nga adunay 4K nga mga panid, teksto ug metadata, imbes nga magtrabaho sa mga log nga direkta. Adunay daghang mga hinungdan, nga nagpabukal sa kamatuoran nga sa sulod ang makina sa Scalyr mas sama sa usa ka giapod-apod nga database kaysa usa ka sistema sa file. Ang pagpangita sa teksto kanunay nga gikombinar sa estilo sa DBMS nga mga pagsala sa mga margin pagkahuman sa pag-parse sa log. Makapangita kami nga dungan sa daghang liboan nga mga log sa usa ka higayon, ug ang yano nga mga file sa teksto dili angay alang sa among transactional, gikopya, giapod-apod nga pagdumala sa datos).

Sa sinugdan, ingon og ang maong code dili kaayo angay alang sa brute force optimization. "Tinuod nga trabaho" sa String.indexOf() wala gani nagdominar sa profile sa CPU. Sa ato pa, ang pag-optimize sa kini nga pamaagi lamang dili magdala usa ka hinungdanon nga epekto.

Nahitabo nga kami nagtipig metadata sa sinugdanan sa matag panid, ug ang teksto sa tanan nga mga mensahe sa UTF-8 giputos sa pikas tumoy. Sa pagpahimulos niini, among gisulat pag-usab ang loop aron pangitaon ang tibuok panid sa makausa:

Pangitaa sa 1 TB/s

Kini nga bersyon nagtrabaho direkta sa pagtan-aw raw byte[] ug pangitaon ang tanang mensahe sa usa ka higayon sa tibuok 4K nga panid.

Kini labi ka dali nga ma-optimize alang sa pamaagi sa brute force. Ang internal nga search loop gitawag nga dungan alang sa tibuok 4K nga panid, kay sa gilain sa matag post. Walay pagkopya sa datos, walay alokasyon sa mga butang. Ug ang mas komplikado nga mga operasyon sa metadata gitawag lamang kung ang resulta positibo, ug dili sa matag mensahe. Niining paagiha natangtang namo ang usa ka toneladang overhead, ug ang nahabilin nga load nakonsentrar sa gamay nga internal search loop, nga haom kaayo alang sa dugang nga pag-optimize.

Ang among aktwal nga algorithm sa pagpangita gibase sa maayong ideya ni Leonid Volnitsky. Susama kini sa algorithm sa Boyer-Moore, nga gilaktawan ang gibana-bana nga gitas-on sa string sa pagpangita sa matag lakang. Ang nag-unang kalainan mao nga kini nagsusi sa duha ka byte sa usa ka higayon aron mamenosan ang bakak nga mga posporo.

Ang among pagpatuman nanginahanglan paghimo ug 64K nga talaan sa pagpangita alang sa matag pagpangita, apan wala kana kung itandi sa gigabytes sa datos nga among gipangita. Ang inner loop nagproseso og daghang gigabytes kada segundo sa usa ka core. Sa praktis, ang lig-on nga pasundayag hapit sa 1,25 GB matag segundo sa matag kinauyokan, ug adunay lugar alang sa pag-uswag. Posible nga wagtangon ang pipila sa overhead sa gawas sa sulod nga loop, ug nagplano kami nga mag-eksperimento sa sulod nga loop sa C imbes sa Java.

Gigamit namo ang puwersa

Among gihisgutan nga ang pagpangita sa log mahimong ipatuman "halos", apan unsa ka dako ang "gahum" nga anaa kanato? Daghan kaayo.

1 kinauyokan: Kung gigamit sa husto, ang usa ka kinauyokan sa usa ka modernong processor gamhanan kaayo sa iyang kaugalingong katungod.

8 core: Sa pagkakaron kami nagdagan sa Amazon hi1.4xlarge ug i2.4xlarge SSD servers, matag usa adunay 8 cores (16 threads). Sama sa gihisgutan sa ibabaw, kini nga mga cores kasagarang busy sa mga operasyon sa background. Sa diha nga ang tiggamit naghimo sa usa ka pagpangita, ang mga operasyon sa background gisuspinde, nga nagpagawas sa tanang 8 ka mga cores alang sa pagpangita. Ang pagpangita kasagarang mahuman sa usa ka tipik sa segundo, human niini ang background work magpadayon (ang throttling program nagsiguro nga ang barrage sa search query dili makabalda sa importante nga background work).

16 core: alang sa pagkakasaligan, among giorganisar ang mga server ngadto sa mga grupo sa agalon/ulipon. Ang matag agalon adunay usa ka SSD ug usa ka EBS server ubos sa iyang mando. Kon ang nag-unang server nahagsa, ang SSD server diha-diha dayon mopuli sa iyang dapit. Halos sa tanang panahon, maayo ang trabaho sa agalon ug ulipon, aron ang matag bloke sa datos mapangita sa duha ka lain-laing mga server (ang EBS nga ulipon nga server adunay huyang nga processor, mao nga wala namo kini isipa). Gibahin namo ang buluhaton tali kanila, aron kami adunay total nga 16 ka mga cores nga magamit.

Daghang mga cores: Sa umaabot nga umaabot, kami mag-apod-apod sa mga datos sa mga server sa paagi nga silang tanan moapil sa pagproseso sa matag dili-trivial nga hangyo. Ang matag core molihok. [Pahinumdom: gipatuman namo ang plano ug gipadako ang katulin sa pagpangita sa 1 TB/s, tan-awa ang nota sa katapusan sa artikulo].

Ang kayano nagsiguro sa kasaligan

Ang laing bentaha sa pamaagi sa brute force mao ang medyo makanunayon nga pasundayag. Kasagaran, ang pagpangita dili kaayo sensitibo sa mga detalye sa problema ug data set (sa akong hunahuna mao kana ang hinungdan nga gitawag kini nga "coarse").

Ang index sa keyword usahay makamugna og hilabihan ka paspas nga mga resulta, ug sa ubang mga higayon dili. Ingnon ta nga ikaw adunay 50 GB nga mga log diin ang termino nga 'customer_5987235982' makita sa tulo ka beses. Ang pagpangita niini nga termino nag-ihap sa tulo ka mga lokasyon direkta gikan sa indeks ug makompleto dayon. Apan ang komplikado nga mga pagpangita sa wildcard mahimong mag-scan sa libu-libo nga mga keyword ug magdugay.

Sa laing bahin, ang brute force nga mga pagpangita naglihok sa mas daghan o dili kaayo parehas nga katulin alang sa bisan unsang pangutana. Ang pagpangita sa taas nga mga pulong mas maayo, apan bisan ang pagpangita sa usa ka karakter dali ra.

Ang kayano sa brute force nga pamaagi nagpasabot nga ang performance niini duol sa theoretical maximum. Adunay gamay nga mga kapilian alang sa wala damha nga pag-overload sa disk, panagbingkil sa kandado, paggukod sa pointer, ug liboan pa nga mga hinungdan sa kapakyasan. Gitan-aw ra nako ang mga hangyo nga gihimo sa mga tiggamit sa Scalyr kaniadtong miaging semana sa among labing kabus nga server. Adunay 14 ka hangyo. Eksaktong walo kanila mikuha ug kapin sa usa ka segundo; 000% nahuman sulod sa 99 milliseconds (kung wala ka pa makagamit sa log analysis tools, salig nako: kini paspas).

Ang lig-on, kasaligan nga pasundayag hinungdanon alang sa kadali sa paggamit sa serbisyo. Kung kini malangan matag karon ug unya, ang mga tiggamit makaila niini nga dili kasaligan ug magpanuko sa paggamit niini.

Log search sa aksyon

Ania ang usa ka mubo nga animation nga nagpakita sa Scalyr search sa aksyon. Kami adunay usa ka demo account diin kami nag-import sa matag panghitabo sa matag publiko nga Github repository. Niini nga demo, akong gisusi ang usa ka semana nga kantidad sa datos: gibana-bana nga 600 MB sa hilaw nga mga troso.

Ang video girekord nga buhi, nga walay espesyal nga pagpangandam, sa akong desktop (mga 5000 kilometros gikan sa server). Ang pasundayag nga imong makita tungod sa kadaghanan pag-optimize sa web client, ingon man usa ka paspas ug kasaligan nga backend. Sa matag higayon nga adunay usa ka paghunong nga walay timailhan sa 'loading', ako ang mohunong aron mabasa nimo kung unsa ang akong ipadayon.

Pangitaa sa 1 TB/s

Sa konklusyon

Kung nagproseso sa daghang mga datos, hinungdanon ang pagpili sa usa ka maayo nga algorithm, apan ang "maayo" wala magpasabut nga "kaayo." Hunahunaa kung giunsa ang imong code molihok sa praktis. Ang teoretikal nga pag-analisa sa mga algorithm nagbilin sa pipila ka mga hinungdan nga mahimong hinungdanon sa tinuud nga kalibutan. Ang mas simple nga mga algorithm mas sayon ​​nga ma-optimize ug mas lig-on sa mga sitwasyon sa edge.

Hunahunaa usab ang konteksto diin ang code ipatuman. Sa among kaso, nanginahanglan kami og igo nga kusog nga mga server aron pagdumala sa mga buluhaton sa background. Ang mga tiggamit magsugod sa pagpangita sa medyo panagsa ra, aron makahulam kami usa ka tibuuk nga grupo sa mga server sa mubo nga panahon nga gikinahanglan aron makompleto ang matag pagpangita.

Gamit ang pamaagi sa brute force, gipatuman namo ang paspas, kasaligan, flexible nga pagpangita sa usa ka set sa mga troso. Kami nanghinaut nga kini nga mga ideya mapuslanon alang sa imong mga proyekto.

Usba: Ang titulo ug teksto nausab gikan sa "Pagpangita sa 20 GB matag segundo" ngadto sa "Pangitaa sa 1 TB kada segundo" aron ipakita ang pag-uswag sa performance sa milabay nga pipila ka tuig. Kini nga pagtaas sa katulin nag-una tungod sa mga pagbag-o sa tipo ug gidaghanon sa mga EC2 server nga among gibutang karon aron maserbisyohan ang among dugang nga base sa kostumer. Adunay mga pagbag-o nga moabut sa dili madugay nga maghatag usa ka madasigon nga pagpauswag sa kahusayan sa operasyon, ug dili kami makahulat nga ipaambit kini.

Source: www.habr.com

Idugang sa usa ka comment