RFC-5424 형식의 일부 syslog 메시지가 있습니다.Logstash grok 필터가 Java 정규식 패턴 일치보다 느립니다.
나는 logstash grok 필터와 java 정규식 패턴 일치를 사용하여 로그를 구문 분석합니다. 동일한 입력에 대한 두 가지 접근 방식을 비교하고 있습니다.
java regex 파싱은 표준 입력에서 입력을 읽고 단일 스레드에서 실행 중입니다.
Logstash도 stdin에서 입력을 읽으며 작업자 스레드를 하나로 구성했으며 파이프 라인 일괄 처리 크기는 모든 메시지가 하나의 일괄 처리로 처리되도록 메시지 수와 같습니다.
나는 자바 정규식 파싱이 grok 필터보다 훨씬 빠르다는 것을 알 수있다.
관찰 :
입력 - 300K 메시지
자바 정규식 - 1500 밀리
Logstash grok 수
- 1 분 이상마다.왜 Logstash Grok가 자바 정규식보다 훨씬 느립니다. Grok은 백엔드에서 자바 정규 표현식을 사용하기로되어 있습니다.
grok 필터에서 ** 형식을 사용하는 자바 패턴에 ** (? 패턴 사용)과 동일한 정규 표현식을 사용하고 있습니다 **. 자바에서는 버퍼링 된 리더를 사용하여 stdin에서 읽을 때 라인 단위로 입력을 파싱합니다. logstash에서는 입력을 위해 ** stdin {} **을 사용하고 있습니다. 두 시도 모두 출력을 무시합니다. ** 나는 JRuby와 Ruby를 사용하여 Grok를 구현할 수있는 한 가지 이유가 있다고 생각합니다. 이것이 느린 이유가 될 수 있습니까? ** –
@Rahulkhandelwal : 그 이유가 될 수는 있지만 그렇게 할 필요는 없습니다. Regex 엔진은 행동, 구문 지원 및 성능/안정성이 다르다. –
"* 또한 JRuby에서 반복적으로 발견 한 성능의 진실을 언급 할 것입니다. 고속 코어 클래스가없는 경우 은 빠른 Ruby 구현을 제공하지 않습니다. 성능 문제의 99 %를 우리는 JRuby에서 반복적으로 발견했습니다. 수년 동안 조사 된 핵심 클래스 구현으로 거슬러 올라갈 수 있습니다. 구현의 대부분은 이미 에 C 또는 Java와 같은 "빠른"언어로 작성되었습니다 (Rubinius에는 대부분의 핵심 클래스에 대해 C++과 Ruby가 혼합 된 이 포함되어 있습니다. 루비에 중점을 둔다.) 따라서 많은 수의 루비에서 부적절한 시스템은 오용에 직접적으로 기여할 수있다. 또는 핵심 메소드의 구현이 느리다. * " –