Puncte:0

syslog-ng: Cum să reduceți latența ridicată atunci când redirecționați jurnalele către un consumator syslog tcp?

drapel al

UPDATE 2: Am răspuns la aceasta prin noua mea întrebare la linkul de mai jos. Cauza principală este comportamentul telegraf, unde implicit deconectează conexiunea TCP la 5 secunde după ultimul mesaj primit. Acest lucru poate fi prin proiectare, cu toate acestea, am o problemă cu documentația lor, care a făcut ca acest lucru să fie dificil de identificat ca o potențială remediere.

Poate că această întrebare poate fi acum ștearsă?


UPDATE 1: în loc să editez această întrebare pe larg, făcând ca răspunsurile actuale să nu aibă sens, am pus o nouă întrebare pe baza informațiilor noi pe care le-am primit ca urmare a postării acestei întrebări.

syslog-ng / telegraf: EOF a apărut când inactiv - incompatibil?


Folosesc syslog-ng Open-Source Edition (OSE) v3.31.2 într-o stivă docker-compose.

Am mesaje syslog care sosesc prin rețea de la diverse gazde prin UDP (la care sunt constrâns deoarece clienții mei folosesc Boost::Log și acest lucru nu acceptă syslog peste TCP, doar UDP) și am syslog-ng setat să redirecționeze acestea către un alt serviciu din aval. Se întâmplă să fie telegraf care utilizează un intrări.syslog modul, dar nu sunt sigur că asta contează încă.

Configurația mea arată așa:

@versiunea: 3.29
@include „scl.conf”

Opțiuni {
    linii de culoare (1);
};
    
sursă s_network {
    udp(ip(0.0.0.0) port(514));
};

destinație d_file {
    fisier("/var/log/messages");
};
    
destinație d_telegraf {
    syslog(portul „telegraf”(6514) transport(tcp));
};
    
Buturuga {
    sursa(s_network);
    destinație(d_telegraf);
    destinație(d_file);
};

Am setat în mod explicit globalul linii de culoare valoare la 1. Cred că aceasta este valoarea implicită, dar vreau să fiu sigur. Doresc ca mesajele de jurnal să fie redirecționate imediat ce sunt primite.

De cele mai multe ori acest lucru funcționează - „linii” individuale de jurnale ajung în syslog-ng prin UDP 514 și sunt imediat scrise în fișier /var/log/messages, și în aproape toate cazurile sunt, de asemenea, trimise imediat către telegraf pe portul TCP 6514.

Problema pe care o văd este că, destul de des, syslog-ng reține multe rânduri de jurnalele de intrare până la aproximativ 30-60 de secunde, apoi le livrează către telegraf într-o bucată mare. Nu pare să existe prea multe modele în asta, dar se întâmplă des. Lucrul ciudat este că /var/log/messages fișierul are intrările de jurnal lipsă scrise imediat, doar livrarea în rețea este întârziată. M-am gândit că linii de culoare (1) ar evita această tamponare, dar nu pare să o facă.

Am folosit Wireshark pentru a determina unde este întârzierea și este în ieșirea pachetelor de la syslog-ng, între syslog-ng și portul TCP 6514 telegraf.

M-am întrebat dacă acesta ar putea fi un algoritm al lui TCP Nagle - dacă da, există o modalitate de a activa opțiunea de socket TCP_NO_DELAY pentru driverul de destinație syslog al lui syslog-ng?

În cele din urmă, ceea ce caut este un serviciu syslog rapid, cu latență scăzută, care poate agrega și retransmite jurnalele cât mai repede posibil pentru revizuire în timp real în aval.

EDIT: Am încercat să trec la transportul UDP între syslog-ng și telemetrie și acest lucru pare să fie mult mai receptiv, iar întârzierile lungi și ocazionale au dispărut. Cu toate acestea, acest lucru va face dificilă asigurarea conexiunii în viitor.

Puncte:2
drapel vn

Ceea ce experimentezi nu este normal. Configurația de mai sus ar trebui să trimită jurnalele către d_telegraf și d_file în același timp, cât mai curând posibil.

Cred că aveți probleme de conectare, acesta trebuie să fie motivul întârzierii de 60 de secunde, care este valoarea implicită a temporizatorului de reconectare.

Puteți reduce această valoare folosind time-redeschide () opțiune globală, de exemplu:

Opțiuni {
  timp-redeschidere(1);
};

De asemenea, puteți porni syslog-ng în prim-plan (în modul de depanare) pentru a investiga problemele de conexiune:

$ syslog-ng -Fdev
drapel al
Vă mulțumesc pentru indicația despre `-Fdev` - din aceasta am stabilit că syslog-ng raportează `EOF pe canalul de control, închiderea conexiunii;` aproape exact 30 de secunde după ultimul mesaj de jurnal (după ce un client se termină) și apoi 30 de secunde mai târziu: „Conexiune Syslog stabilită”. Ieșirea Syslog-ng de monitorizare Wireshark arată un FIN,ACK urmat de nimic timp de exact 60 de secunde, urmat de un SYN despre care bănuiesc că este reconectarea. Voi încerca în continuare `time-reopen(1)`.
drapel al
Am setat `time-reopen(1)` și conexiunea pare să se reconecteze foarte repede, așa cum era de așteptat. În esență, problema „dispare” cu această scurtă reîncercare. Cu toate acestea, aș dori să aflu ce cauzează EOF pe canalul de control - este cauzat de un client care se comportă greșit care se închide fără a închide conexiunea syslog? Clientul trimite syslog prin UDP - Syslog implementează o stare de conexiune a protocolului prin UDP?
drapel al
Clienții sunt aplicații interne scrise cu Boost::Log - deoarece aceasta se poate transforma într-o întrebare de programare, poate că trebuie să întreb pe StackOverflow dacă există o modalitate prin care să se „deconecteze” ordonat la terminarea programului?
drapel al
Cred că clientul UDP este un hering roșu. Pot reproduce același comportament cu un singur mesaj syslog UDP trimis de `logger -d`. Din jurnal, pot vedea că syslog-ng primește intrarea, o trimite atât în ​​rețea, cât și în destinația fișierului, apoi raportează „EOF a avut loc în timpul inactiv” 5 secunde mai târziu, apoi închide conexiunea, „EOF pe canalul de control”, apoi 30 - 6o secunde mai târziu se reconecta. Dar văd, de asemenea, că acest lucru se întâmplă, rar, când este complet inactiv, așa că poate că există o problemă de rețea subiacentă. Folosesc o rețea docker-compose, btw, totul este pe aceeași gazdă.
drapel al
Acest lucru devine puțin greu de manevrat, așa că aș putea scrie asta ca o întrebare separată. Vă mulțumim din nou pentru sfaturi despre unde să începeți să căutați.
MrAnno avatar
drapel vn
Mesajul despre „canale de control” poate induce în eroare, nu este vorba despre conexiunile tale la rețea, ci despre propriul canal de control al syslog-ng. Mesajul EOF înseamnă că probabil ați executat `syslog-ng-ctl` pentru a interoga statistici, a reîncărca sau pentru a reporni syslog-ng.
drapel al
Ah, cred că trebuie să existe un proces automat `syslog-ng-ctl` în containerul oficial Docker, care rulează periodic, deoarece eu nu am rulat niciodată acel program manual. Asta ar explica acel mesaj.
Puncte:1
drapel cn

Încercați flush-lines(0) doar ștergând acea linie împreună.

Cum gestionează syslog-ng flush_lines(0)?

https://github.com/syslog-ng/syslog-ng/issues/1411

drapel al
Într-adevăr, am încercat `flush-lines(0)` și cu el am omis, de asemenea. Nu pare să aibă niciun efect asupra acestei probleme și a găsit dovezi (pe care le-am greșit de atunci, documentele syslog-ng sunt atât de ușoare cu privire la detalii, din păcate), că o valoare de 0 nu este de fapt validă.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.