{"id":52113,"date":"2019-11-01T00:00:00","date_gmt":"2019-10-31T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik"},"modified":"2020-02-18T13:59:47","modified_gmt":"2020-02-18T10:59:47","slug":"bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","title":{"rendered":"Bioyino \u2014 rozproszony, skalowalny agregator metryk","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Wi\u0119c zbierasz metryki. Tak jak my. My te\u017c zbieramy metryki. Oczywi\u015bcie, te wa\u017cne dla biznesu. Dzi\u015b opowiemy o pierwszym ogniwie systemu naszego monitoringu \u2014 serwerze agregacji zgodnym z statsd. <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2Noxg1M\">bioyino<\/a><\/noindex>, dlaczego go napisali\u015bmy i dlaczego zrezygnowali\u015bmy z brubeck. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 rozproszony, skalowalny agregator metryk\" src=\"\/wp-content\/uploads\/2019\/11\/312c9a706828acc65f638a6a8abfc5b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Z naszych wcze\u015bniejszych artyku\u0142\u00f3w (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/avito\/blog\/335410\/\">1<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/avito\/blog\/343928\/\">2<\/a><\/noindex>) mo\u017cna dowiedzie\u0107 si\u0119, \u017ce przez pewien czas zbierali\u015bmy metryki za pomoc\u0105 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\">brubeck<\/a><\/noindex>. Jest napisany w C. Z punktu widzenia kodu \u2014 prosty jak korek (co jest wa\u017cne, gdy chcesz wnosi\u0107 wk\u0142ad) i, co najwa\u017cniejsze, bez problemu radzi sobie z naszymi wolumenami wynosz\u0105cymi 2 miliony metryk na sekund\u0119 (MPS) w szczycie. Dokumentacja deklaruje wsparcie dla 4 milion\u00f3w MPS z gwiazdk\u0105. Oznacza to, \u017ce uzyskasz podan\u0105 liczb\u0119, je\u015bli poprawnie skonfigurujesz sie\u0107 na Linuxie. (Nie wiemy, ile MPS mo\u017cna uzyska\u0107, je\u015bli sie\u0107 zostanie pozostawiona bez zmian). Mimo tych zalet, mieli\u015bmy kilka powa\u017cnych zastrze\u017ce\u0144 do brubeck.<\/p>\n<p><\/p>\n<p><em>Zastrze\u017cenie 1.<\/em> Github \u2014 tw\u00f3rca projektu \u2014 przesta\u0142 go wspiera\u0107: publikowa\u0107 poprawki i poprawki, akceptowa\u0107 nasze i (nie tylko nasze) PR. W ci\u0105gu ostatnich kilku miesi\u0119cy (gdzie\u015b od lutego-marca 2018) aktywno\u015b\u0107 wzros\u0142a, ale przed tym by\u0142a prawie 2-letnia ca\u0142kowita cisza. Ponadto projekt jest rozwijany <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\/pull\/31#issuecomment-325907734\">dla wewn\u0119trznych potrzeb Gihub<\/a><\/noindex>, co mo\u017ce stanowi\u0107 powa\u017cn\u0105 przeszkod\u0119 dla wprowadzania nowych funkcji.<\/p>\n<p><\/p>\n<p><em>Zastrze\u017cenie 2.<\/em> Dok\u0142adno\u015b\u0107 oblicze\u0144. Brubeck zbiera do agregacji tylko 65536 warto\u015bci. W naszym przypadku dla niekt\u00f3rych metryk w okresie agregacji (30 s) mo\u017ce przychodzi\u0107 znacznie wi\u0119cej warto\u015bci (1 527 392 w szczycie). W rezultacie takiego pr\u00f3bkowania warto\u015bci maksimum i minimum wydaj\u0105 si\u0119 bezu\u017cyteczne. Na przyk\u0142ad, wygl\u0105da to tak: <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 rozproszony, skalowalny agregator metryk\" src=\"\/wp-content\/uploads\/2019\/11\/4222a1a7d1e127137220595241f5276c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Jak by\u0142o<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 rozproszony, skalowalny agregator metryk\" src=\"\/wp-content\/uploads\/2019\/11\/c8f0025c61f708584328ea30aacf7bc0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Jak powinno by\u0107<\/em><\/p>\n<p><\/p>\n<p>Z tej samej przyczyny sumy s\u0105 og\u00f3lnie obliczane niepoprawnie. Dodaj do tego b\u0142\u0105d z przepe\u0142nieniem 32-bitowego float, kt\u00f3ry w og\u00f3le wysy\u0142a serwer w segfault przy otrzymaniu na poz\u00f3r nieszkodliwej metryki, i jest w og\u00f3le \u015bwietnie. B\u0142\u0105d, nota bene, nie zosta\u0142 poprawiony.<\/p>\n<p><\/p>\n<p>I, w ko\u0144cu, <em>Zastrze\u017cenie X<\/em>. W momencie pisania tego artyku\u0142u, jeste\u015bmy gotowi zaprezentowa\u0107 j\u0105 wszystkim 14 w miar\u0119 dzia\u0142aj\u0105cym implementacjom statsd, kt\u00f3re uda\u0142o nam si\u0119 znale\u017a\u0107. Wyobra\u017amy sobie, \u017ce pewna infrastruktura rozros\u0142a si\u0119 na tyle, \u017ce przyjmowanie 4 mln MPS ju\u017c nie wystarcza. Lub mo\u017ce jeszcze si\u0119 nie rozros\u0142a, ale metryki s\u0105 dla was ju\u017c na tyle wa\u017cne, \u017ce nawet kr\u00f3tkie, 2-3 minutowe przerwy na wykresach mog\u0105 sta\u0107 si\u0119 krytyczne i wywo\u0142a\u0107 ataki nieodpartych epizod\u00f3w depresji u mened\u017cer\u00f3w. Poniewa\u017c leczenie depresji jest wdzi\u0119cznym zadaniem, potrzebne s\u0105 rozwi\u0105zania techniczne.<\/p>\n<p><\/p>\n<p>Po pierwsze, odporno\u015b\u0107 na awarie, aby nag\u0142y problem na serwerze nie wywo\u0142a\u0142 w biurze psychiatrycznego apokalipsy zombie. Po drugie, skalowalno\u015b\u0107, aby m\u00f3c przyjmowa\u0107 wi\u0119cej ni\u017c 4 mln MPS, jednocze\u015bnie nie zag\u0142\u0119biaj\u0105c si\u0119 w stos sieciowy Linuxa i spokojnie rosn\u0105\u0107 \u201ew bok\u201d do wymaganych rozmiar\u00f3w.<\/p>\n<p><\/p>\n<p>Poniewa\u017c mieli\u015bmy zapas w zakresie skalowalno\u015bci, postanowili\u015bmy zacz\u0105\u0107 od odporno\u015bci na awarie. \u201eO! Odporno\u015b\u0107 na awarie! To proste, to potrafimy\u201d, pomy\u015bleli\u015bmy i uruchomili\u015bmy 2 serwery, uruchamiaj\u0105c na ka\u017cdym kopi\u0119 brubeck. W tym celu musieli\u015bmy skopiowa\u0107 ruch z metrykami na oba serwery i nawet napisa\u0107 do tego <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/udpdup\">ma\u0142e narz\u0119dzie<\/a><\/noindex>. Problemu odporno\u015bci na awarie w ten spos\u00f3b rozwi\u0105zali\u015bmy, ale\u2026 nie zbyt dobrze. Na pocz\u0105tku wszystko wydawa\u0142o si\u0119 w porz\u0105dku: ka\u017cdy brubeck zbiera swoj\u0105 wersj\u0119 agregacji, zapisuje dane w Graphite co 30 sekund, nadpisuj\u0105c stary interwa\u0142 (to dzieje si\u0119 po stronie Graphite). Je\u015bli nagle jeden serwer zawiedzie, zawsze mamy drugi z w\u0142asn\u0105 kopi\u0105 zaggregowanych danych. Jednak pojawia si\u0119 problem: gdy serwer zawodzi, na wykresach pojawia si\u0119 \u201ez\u0105b\u201d. Jest to zwi\u0105zane z tym, \u017ce 30-sekundowe interwa\u0142y w brubeck nie s\u0105 zsynchronizowane, i w momencie awarii jeden z nich nie jest nadpisywany. W momencie uruchamiania drugiego serwera dzieje si\u0119 to samo. Ca\u0142kiem zno\u015bne, ale chcemy lepiej! Problem skalowalno\u015bci r\u00f3wnie\u017c si\u0119 nie znikn\u0105\u0142. Wszystkie metryki wci\u0105\u017c \u201elec\u0105\u201d na pojedynczy serwer, wi\u0119c jeste\u015bmy ograniczeni tymi samymi 2-4 mln MPS, w zale\u017cno\u015bci od wydajno\u015bci sieci.<\/p>\n<p><\/p>\n<p>Je\u015bli troch\u0119 pomy\u015blisz o problemie i jednocze\u015bnie wykopiesz troch\u0119 \u015bniegu, mo\u017ce przyj\u015b\u0107 ci do g\u0142owy oczywisty pomys\u0142: potrzebny jest statsd, kt\u00f3ry potrafi dzia\u0142a\u0107 w trybie rozproszonym. To znaczy taki, w kt\u00f3rym zrealizowana jest synchronizacja mi\u0119dzy w\u0119z\u0142ami pod wzgl\u0119dem czasu i metryk. \u201eOczywi\u015bcie takie rozwi\u0105zanie pewnie ju\u017c istnieje\u201d \u2013 powiedzieli\u015bmy i zacz\u0119li\u015bmy googlowa\u0107... I nic nie znale\u017ali\u015bmy. Przeszukuj\u0105c dokumentacj\u0119 r\u00f3\u017cnych statsd (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations\">https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations<\/a><\/noindex> na dzie\u0144 11.12.2017), nie znale\u017ali\u015bmy nic. Wida\u0107, ani programi\u015bci, ani u\u017cytkownicy tych rozwi\u0105za\u0144 nie mieli do czynienia z TAK\u0104 liczb\u0105 metryk, inaczej na pewno co\u015b by wymy\u015blili.<\/p>\n<p><\/p>\n<p>I wtedy przypomnieli\u015bmy sobie o \u201ezabawkowym\u201d statsd \u2013 bioyino, kt\u00f3re napisali\u015bmy na hackathonie dla zabawy (nazwa projektu zosta\u0142a wygenerowana przez skrypt przed rozpocz\u0119ciem hackathonu) i zrozumieli\u015bmy, \u017ce pilnie potrzebujemy w\u0142asnego statsd. Po co?<\/p>\n<p><\/p>\n<ul>\n<li>poniewa\u017c na \u015bwiecie jest zbyt ma\u0142o klon\u00f3w statsd,<\/li>\n<li>poniewa\u017c mo\u017cna zapewni\u0107 po\u017c\u0105dan\u0105 lub zbli\u017con\u0105 do po\u017c\u0105danej odporno\u015b\u0107 na awarie i skalowalno\u015b\u0107 (w tym zsynchronizowa\u0107 agregowane metryki mi\u0119dzy serwerami i rozwi\u0105za\u0107 problem konflikt\u00f3w przy przesy\u0142aniu),<\/li>\n<li>poniewa\u017c mo\u017cna liczy\u0107 metryki dok\u0142adniej, ni\u017c robi to brubeck,<\/li>\n<li>poniewa\u017c mo\u017cemy sami zbiera\u0107 bardziej szczeg\u00f3\u0142ow\u0105 statystyk\u0119, kt\u00f3rej brubeck niemal w og\u00f3le nam nie dostarcza\u0142,<\/li>\n<li>poniewa\u017c pojawi\u0142a si\u0119 szansa na zaprogramowanie w\u0142asnej aplikacji wysokowydajnej rozproszonej, kt\u00f3ra nie b\u0119dzie dok\u0142adnie powtarza\u0107 architektury innej takiej samej wysokowydajnej... <\/li>\n<\/ul>\n<p><\/p>\n<p>Na czym pisa\u0107? Oczywi\u015bcie na Rust. Dlaczego?<\/p>\n<p><\/p>\n<ul>\n<li>poniewa\u017c ju\u017c istnia\u0142 prototyp rozwi\u0105zania,<\/li>\n<li>poniewa\u017c autor artyku\u0142u w tym czasie ju\u017c zna\u0142 Rust i chcia\u0142 napisa\u0107 co\u015b na nim do produkcji z mo\u017cliwo\u015bci\u0105 publikacji jako open-source,<\/li>\n<li>poniewa\u017c j\u0119zyki z GC nam nie odpowiadaj\u0105 ze wzgl\u0119du na natur\u0119 otrzymywanego ruchu (praktycznie w czasie rzeczywistym) i przerwy GC s\u0105 praktycznie niedopuszczalne, <\/li>\n<li>poniewa\u017c potrzebna jest maksymalna wydajno\u015b\u0107, por\u00f3wnywalna z C,<\/li>\n<li>poniewa\u017c Rust zapewnia nam bezpieczn\u0105 wsp\u00f3\u0142bie\u017cno\u015b\u0107, a zaczynaj\u0105c pisa\u0107 to w C\/C++, mieliby\u015bmy jeszcze wi\u0119cej problem\u00f3w z bezpiecze\u0144stwem, przepe\u0142nieniami bufora, wy\u015bcigami i innymi strasznymi s\u0142owami.<\/li>\n<\/ul>\n<p><\/p>\n<p>By\u0142 tak\u017ce argument przeciwko Rust. Firma nie mia\u0142a do\u015bwiadczenia w tworzeniu projekt\u00f3w w Rust, a teraz r\u00f3wnie\u017c nie planujemy go u\u017cywa\u0107 w g\u0142\u00f3wnym projekcie. Dlatego istnia\u0142y powa\u017cne obawy, \u017ce nic z tego nie wyjdzie, ale zdecydowali\u015bmy si\u0119 zaryzykowa\u0107 i spr\u00f3bowali\u015bmy.<\/p>\n<p><\/p>\n<p>Czas mija\u0142...<\/p>\n<p><\/p>\n<p>W ko\u0144cu, po kilku nieudanych pr\u00f3bach, pierwsza dzia\u0142aj\u0105ca wersja by\u0142a gotowa. Co z tego powsta\u0142o? Powsta\u0142o co\u015b takiego.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 rozproszony, skalowalny agregator metryk\" src=\"\/wp-content\/uploads\/2019\/11\/322c4136ed033b80b31a89d7b5f63af8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ka\u017cdy w\u0119ze\u0142 otrzymuje sw\u00f3j w\u0142asny zestaw metryk i gromadzi je u siebie, przy czym nie agreguje metryk dla tych typ\u00f3w, dla kt\u00f3rych do ostatecznej agregacji potrzebny jest ich pe\u0142ny zestaw. W\u0119z\u0142y s\u0105 ze sob\u0105 po\u0142\u0105czone niejakim protoko\u0142em rozproszonego blokowania (distributed lock), kt\u00f3ry pozwala wybra\u0107 w\u015br\u00f3d nich ten jeden jedyny (tutaj p\u0142akali\u015bmy), kt\u00f3ry zas\u0142uguje na wys\u0142anie metryk Wielkiemu. W tej chwili problem ten rozwi\u0105zuj\u0105 \u015brodki <noindex><a rel=\"nofollow\" href=\"https:\/\/www.consul.io\/docs\/guides\/leader-election.html\">Consul<\/a><\/noindex>, ale w przysz\u0142o\u015bci ambicje autora si\u0119gaj\u0105 do <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-consensus\">w\u0142asnego<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-tokio\">implementacji<\/a><\/noindex> Raft, gdzie tym zas\u0142u\u017conym oczywi\u015bcie b\u0119dzie w\u0119ze\u0142 lidera konsensusu. Opr\u00f3cz konsensusu, w\u0119z\u0142y do\u015b\u0107 cz\u0119sto (domy\u015blnie raz na sekund\u0119) wysy\u0142aj\u0105 swoim s\u0105siadom te cz\u0119\u015bci wst\u0119pnie agregowanych metryk, kt\u00f3re uda\u0142o si\u0119 zebra\u0107 w tej sekundzie. Oznacza to, \u017ce skalowalno\u015b\u0107 i odporno\u015b\u0107 na awarie pozostaj\u0105 \u2014 ka\u017cdy z w\u0119z\u0142\u00f3w wci\u0105\u017c przechowuje pe\u0142ny zestaw metryk, ale metryki te s\u0105 ju\u017c wysy\u0142ane w postaci agregowanej, przez TCP i z kodowaniem w protokole binarnym, wi\u0119c koszty duplikacji w por\u00f3wnaniu z UDP s\u0105 znacznie ni\u017csze. Pomimo do\u015b\u0107 du\u017cej ilo\u015bci przychodz\u0105cych metryk, kumulacja wymaga bardzo ma\u0142o pami\u0119ci i jeszcze mniej CPU. Dla naszych dobrze kompresowalnych metryk to zaledwie kilka dziesi\u0105tk\u00f3w megabajt\u00f3w danych. Dodatkowym atutem jest brak zb\u0119dnych nadpis\u00f3w danych w Graphite, jak mia\u0142o to miejsce w przypadku burbecka.<\/p>\n<p><\/p>\n<p>Pakiety UDP z metrykami s\u0105 rozdzielane mi\u0119dzy w\u0119z\u0142ami na urz\u0105dzeniu sieciowym za pomoc\u0105 prostego Round Robin. Oczywi\u015bcie, sprz\u0119t sieciowy nie analizuje zawarto\u015bci pakiet\u00f3w, a zatem mo\u017ce obs\u0142ugiwa\u0107 znacznie wi\u0119cej ni\u017c 4M pakiet\u00f3w na sekund\u0119, nie wspominaj\u0105c ju\u017c o metrykach, o kt\u00f3rych nie ma poj\u0119cia. Bior\u0105c pod uwag\u0119, \u017ce metryki docieraj\u0105 nie pojedynczo w ka\u017cdym pakiecie, nie przewidujemy problem\u00f3w z wydajno\u015bci\u0105 w tym miejscu. W przypadku awarii serwera urz\u0105dzenie sieciowe szybko (w ci\u0105gu 1-2 sekund) wykrywa ten fakt i wyklucza uszkodzony serwer z rotacji. W rezultacie tego, pasywne (tzn. nienale\u017c\u0105ce do lider\u00f3w) w\u0119z\u0142y mo\u017cna w\u0142\u0105cza\u0107 i wy\u0142\u0105cza\u0107 praktycznie bez zauwa\u017calnych spadk\u00f3w na wykresach. Maksimum, co tracimy, to cz\u0119\u015b\u0107 metryk, kt\u00f3re wp\u0142yn\u0119\u0142y w ci\u0105gu ostatniej sekundy. Nagle utracony\/wy\u0142\u0105czony\/zamieniony lider wci\u0105\u017c poka\u017ce nieznaczn\u0105 anomali\u0119 (30-sekundowy interwa\u0142 pozostaje nadal zdezynchronizowany), ale przy istnieniu po\u0142\u0105cze\u0144 mi\u0119dzy w\u0119z\u0142ami mo\u017cna zminimalizowa\u0107 te problemy, na przyk\u0142ad, wysy\u0142aj\u0105c pakiety synchronizuj\u0105ce.<\/p>\n<p><\/p>\n<p>Troch\u0119 o wewn\u0119trznej budowie. Aplikacja oczywi\u015bcie jest wielow\u0105tkowa, ale architektura w\u0105tk\u00f3w r\u00f3\u017cni si\u0119 od tej u\u017cywanej w brubeck. W\u0105tki w brubeck s\u0105 jednorodne \u2014 ka\u017cdy z nich odpowiada jednocze\u015bnie za zbieranie informacji i agregacj\u0119. W bioyino w\u0105tki robocze (workers) s\u0105 podzielone na dwie grupy: odpowiedzialne za sie\u0107 i odpowiedzialne za agregacj\u0119. Takie podzia\u0142 umo\u017cliwia elastyczniejsze zarz\u0105dzanie aplikacj\u0105 w zale\u017cno\u015bci od rodzaju metryk: tam, gdzie potrzebna jest intensywna agregacja, mo\u017cna doda\u0107 agregator\u00f3w, a tam, gdzie jest du\u017co ruchu sieciowego \u2014 zwi\u0119kszy\u0107 liczb\u0119 w\u0105tk\u00f3w sieciowych. Obecnie na naszych serwerach pracujemy z 8 sieciowymi i 4 agreguj\u0105cymi w\u0105tkami.<\/p>\n<p><\/p>\n<p>Cz\u0119\u015b\u0107 obliczeniowa (odpowiedzialna za agregacj\u0119) jest do\u015b\u0107 nudna. Bufory wype\u0142nione przez w\u0105tki sieciowe s\u0105 rozdzielane mi\u0119dzy w\u0105tki obliczeniowe, gdzie s\u0105 nast\u0119pnie przetwarzane i agregowane. Na \u017c\u0105danie metryki s\u0105 przekazywane do wysy\u0142ki do innych w\u0119z\u0142\u00f3w. Wszystko to, w tym przesy\u0142anie danych mi\u0119dzy w\u0119z\u0142ami i wsp\u00f3\u0142praca z Consul, odbywa si\u0119 asynchronicznie, dzia\u0142a na frameworku <noindex><a rel=\"nofollow\" href=\"https:\/\/tokio.rs\">tokio<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>O wiele wi\u0119cej problem\u00f3w podczas rozwoju sprawi\u0142a cz\u0119\u015b\u0107 sieciowa odpowiedzialna za odbieranie metryk. G\u0142\u00f3wnym celem wydzielenia strumieni sieciowych w oddzielne encje by\u0142o d\u0105\u017cenie do zmniejszenia czasu, kt\u00f3ry strumie\u0144 po\u015bwi\u0119ca <em>nie<\/em> na odczyt danych z gniazda. Opcje z wykorzystaniem asynchronicznego UDP i zwyk\u0142ego recvmsg szybko odpad\u0142y: pierwsza zu\u017cywa zbyt du\u017co CPU w przestrzeni u\u017cytkownika na przetwarzanie zdarze\u0144, druga \u2014 zbyt wiele prze\u0142\u0105cze\u0144 kontekstu. Dlatego obecnie u\u017cywane jest <noindex><a rel=\"nofollow\" href=\"https:\/\/linux.die.net\/man\/2\/recvmmsg\">recvmmsg<\/a><\/noindex> z du\u017cymi buforami (a bufory, panowie oficerowie, to nie jest co\u015b, co mo\u017cna lekcewa\u017cy\u0107!). Wsparcie dla zwyk\u0142ego UDP pozostawiono dla przypadk\u00f3w o niskim obci\u0105\u017ceniu, kiedy recvmmsg nie jest konieczne. W trybie multimessage udaje si\u0119 osi\u0105gn\u0105\u0107 najwa\u017cniejsze: zdecydowana wi\u0119kszo\u015b\u0107 czasu strumie\u0144 sieciowy porz\u0105dkuje kolejk\u0119 OS \u2014 odczytuje dane z gniazda i przenosi je do bufora w przestrzeni u\u017cytkownika, tylko sporadycznie prze\u0142\u0105czaj\u0105c si\u0119, aby odda\u0107 wype\u0142niony bufer agregatorom. Kolejka w gnie\u017adzie praktycznie si\u0119 nie kumuluje, a liczba odrzuconych pakiet\u00f3w prawie si\u0119 nie zwi\u0119ksza. <\/p>\n<p>\n<b class=\"spoiler_title\">Uwaga<\/b><\/p>\n<p>W ustawieniach domy\u015blnych rozmiar bufora jest ustawiony na do\u015b\u0107 du\u017c\u0105 warto\u015b\u0107. Je\u017celi zdecydujesz si\u0119 wypr\u00f3bowa\u0107 serwer samodzielnie, mo\u017cesz si\u0119 spotka\u0107 z tym, \u017ce po wys\u0142aniu ma\u0142ej ilo\u015bci metryk, nie dotr\u0105 one do Graphite, pozostaj\u0105c w buforze strumienia sieciowego. Aby pracowa\u0107 z ma\u0142\u0105 ilo\u015bci\u0105 metryk, nale\u017cy ustawi\u0107 w konfiguracji warto\u015bci bufsize i task-queue-size na mniejsze.<\/p>\n<p><\/p>\n<p>Na koniec \u2014 troch\u0119 wykres\u00f3w dla mi\u0142o\u015bnik\u00f3w wykres\u00f3w.<\/p>\n<p><\/p>\n<p>Statystyka liczby przychodz\u0105cych metryk na ka\u017cdym serwerze: ponad 2 mln MPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 rozproszony, skalowalny agregator metryk\" src=\"\/wp-content\/uploads\/2019\/11\/c6cb1a36c267657d55ec22df518f8d03.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wy\u0142\u0105czenie jednego z w\u0119z\u0142\u00f3w i przekierowanie przychodz\u0105cych metryk.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 rozproszony, skalowalny agregator metryk\" src=\"\/wp-content\/uploads\/2019\/11\/106af265a6bc2a8b31fe34df69e9c200.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statystyka dotycz\u0105ca wychodz\u0105cych metryk: zawsze wysy\u0142a tylko jeden w\u0119ze\u0142 \u2014 raidboss.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 rozproszony, skalowalny agregator metryk\" src=\"\/wp-content\/uploads\/2019\/11\/582730b501a42bb3a371a84bf2e2394b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statystyka pracy ka\u017cdego w\u0119z\u0142a z uwzgl\u0119dnieniem b\u0142\u0119d\u00f3w w r\u00f3\u017cnych modu\u0142ach systemu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 rozproszony, skalowalny agregator metryk\" src=\"\/wp-content\/uploads\/2019\/11\/101377281c3add8c598c6439ca25d271.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Szczeg\u00f3\u0142owe informacje o przychodz\u0105cych metrykach (nazwy metryk ukryte).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 rozproszony, skalowalny agregator metryk\" src=\"\/wp-content\/uploads\/2019\/11\/6cf0b61b454b0414799460c482e03242.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0427\u0442\u043e \u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0441 \u044d\u0442\u0438\u043c \u0432\u0441\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435? \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u0431\u043b&#8230;! \u041f\u0440\u043e\u0435\u043a\u0442 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043a\u0430\u043a open-source \u0438 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u043c \u0432\u0441\u044e \u0435\u0433\u043e \u0436\u0438\u0437\u043d\u044c. \u0412 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u043f\u043b\u0430\u043d\u0430\u0445 \u2014 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Raft, \u0441\u043c\u0435\u043d\u0430 peer-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u044b\u0439, \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438, \u043d\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043c\u0435\u0442\u0440\u0438\u043a, \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f. <\/p>\n<p><\/p>\n<p>Oczywi\u015bcie, zach\u0119camy wszystkich ch\u0119tnych do pomocy w rozwoju projektu: tw\u00f3rzcie PR, Issues, postaramy si\u0119 odpowiada\u0107, poprawia\u0107 itd.<\/p>\n<p><\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, that&#8217;s all folks, \u043f\u043e\u043a\u0443\u043f\u0430\u0439\u0442\u0435 \u043d\u0430\u0448\u0438\u0445 \u0441\u043b\u043e\u043d\u043e\u0432!<\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"siCiIyg4ZZY\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/siCiIyg4ZZY\/hqdefault.jpg\" alt=\"Odtwarzaj wideo\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/avito\/blog\/354714\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u0430\u043a \u0438 \u043c\u044b. \u041c\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e \u0441\u0430\u043c\u043e\u043c \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0432\u0435\u043d\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u2014 statsd-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 bioyino, \u0437\u0430\u0447\u0435\u043c \u043c\u044b \u0435\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043e\u0442 brubeck. \u0418\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043d\u0430\u0448\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 (1, 2) \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u0435\u0442\u043a\u0438 \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52113","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u0430\u043a \u0438 \u043c\u044b. \u041c\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Bioyino \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u0440\u0438\u043a | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u0430\u043a \u0438 \u043c\u044b. \u041c\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T10:59:47+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Bioyino \u2014 rozproszony, skalowalny agregator metryk | ProHoster","description":"Zbieracie metryki. Tak jak my. My te\u017c zbieramy metryki. Oczywi\u015bcie te istotne dla biznesu.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Bioyino \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u0440\u0438\u043a | ProHoster","og:description":"\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u0430\u043a \u0438 \u043c\u044b. \u041c\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T21:00:00+00:00","article:modified_time":"2020-02-18T10:59:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52113","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 02:30:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:49:49","updated":"2026-01-24 02:30:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/52113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=52113"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/52113\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=52113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=52113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=52113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}