2017-04-05 6 views
1

Ich habe einige Syslog-Nachrichten im RFC-5424-Format.Logstash Grok Filter ist langsamer als Java Regex Mustererkennung

Ich benutze sowohl Logstash Grok Filter und Java Regex Pattern Matching, um die Protokolle zu analysieren. Ich vergleiche beide Ansätze für die gleiche Eingabe.

java regex parsing liest eingabe von stdin und läuft in single thread.

Logstash liest auch Eingaben von stdin und ich habe Worker-Threads auf eins konfiguriert, und Pipeline-Batch-Größe entspricht der Anzahl der Nachrichten, sodass alle Nachrichten in einem Batch verarbeitet werden.

Ich kann sehen, dass Java Regular Expression Parsing ist viel schneller als Grok-Filter.

Beobachtungen:

Eingang - 300K Nachrichten

Java Regex - 1500 millis

Logstash Grok - mehr als 1 Minute jedes Mal.

Warum ist Logstash Grok so viel langsamer als Java Regex. Grok soll auch Java Regexes im Backend verwenden.

Antwort

0

Ohne weitere Details, ist es schwer zu sagen, warum ein bestimmtes Muster langsamer oder schneller in Grok oder Java ist, aber eines ist sicher: die regex Motoren unterschiedlich sind.

Java verwendet ein spezielles Modul java.util.regex und Grok uses Oniguruma Regex-Engine. Sie können die gleichen Muster und Saiten auf ihre eigene Weise behandeln.

+0

In grok filter verwende ich den gleichen regulären Ausdruck, den ich in meinem Java-Muster benutze ** (? das Muster hier) **. In Java analysiere ich die Eingaben zeilenweise, wenn ich mit gepufferten Lesern von stdin lese. Im Logstash verwende ich ** stdin {} ** für die Eingabe. In beiden Versuchen verwerfe ich die Ausgabe. ** Ich denke, ein Grund könnte sein, dass grok mit JRuby und Ruby implementiert wird. Könnte das der Grund für Langsamkeit sein? ** –

+0

@Rahulkhandelwal: Das * kann * der Grund sein, muss es aber nicht. Regex-Engines * unterscheiden sich * nur in ihrem Verhalten, der Syntax, die sie unterstützen, und der Leistung/Stabilität. –

+0

"* Und ich werde auch die Wahrheit der Leistung, die wir wiederholt in JRuby entdeckt haben: Wenn Sie keine schnellen Kern-Klassen haben, haben Sie keine schnelle Ruby-Implementierung . 99% der Leistungsprobleme wir über die Jahre untersucht wurden, konnten auf die Kernklasse Implementierungen zurückgeführt werden, die in den meisten Implementierungen bereits in eine "schnelle" Sprache wie C oder Java (Rubinius hat eine Mischung aus C++ und Ruby für die meisten Kernklassen, mit Schwerpunkt auf Ruby). So eine große Anzahl von Systeme in Ruby schlecht kann direkt auf Missbrauch oder langsame Implementierung von Kernmethoden zugeschrieben werden. * " –