2019년 6월 29일 토요일

Logstash 필터 성능 테스트 - 2nd

방화벽처럼 key-value 구조가 반복되는 로그의 필드 분류에는 kv 필터가 딱이다.
sip = 1.1.1.1 dip = 2.2.2.2 sport = 100 dport = 200 action = permit
sip = 1.1.1.1 dip = 2.2.2.2 sport = 100 dport = 200 action = permit
sip = 1.1.1.1 dip = 2.2.2.2 sport = 100 dport = 200 attack = 10.10.10.10
sip = 1.1.1.1 dip = 2.2.2.2 attack = 10.10.10.10
sip = 1.1.1.1 dip = 2.2.2.2 sport = 100 dport = 200 action = permit
sip = 1.1.1.1 dip = 2.2.2.2 sport = 100 dport = 200 attack = 10.10.10.10
sip = 1.1.1.1 dip = 2.2.2.2 attack = 10.10.10.10
sip = 1.1.1.1 dip = 2.2.2.2 sport = 100 dport = 200 action = permit
sip = 1.1.1.1 dip = 2.2.2.2 sport = 100 dport = 200 attack = 10.10.10.10
sip = 1.1.1.1 dip = 2.2.2.2 attack = 10.10.10.10

문제는 kv 필터가 내부적으로 정규표현식을 사용한다는 것. 성능 저하가 발생할 수 있다는 얘기. 이때 dissect 필터가 대안이 될 수 있다.
input {
 file {
  path => "D:/test.log"
  start_position => "beginning"
  sincedb_path => "nul"
 }
}

filter {
 #kv {}

 ruby {
  code => "event.set('field_count', event.get('message').split('=').count() - 1)"
 }

 if [field_count] == 5 {
  dissect {
   mapping => {
    "message" => "%{?1} = %{&1} %{?2} = %{&2} %{?3} = %{&3} %{?4} = %{&4} %{?5} = %{&5}"
   }
  }
 } else {
  dissect {
   mapping => {
    "message" => "%{?1} = %{&1} %{?2} = %{&2} %{?3} = %{&3}"
   }
  }
 }
}

output {
 file {
  path => "d:/test-dissect.log"
 }
}

kv 필터처럼 유연한 처리는 어렵기 때문에 ruby 필터를 이용해서 필드 개수를 파악, 들쭉날쭉 변하는 필드 개수에 대응했다. 참고로 버전 7부터 로그스태시가 드디어 숫자를 인식한다. [field_count] == "5" 구문 안 먹더라(..)

I7(4코어), SSD 환경에서 kv 필터를 사용했을 때 로그 백만 개 연동에 22초 소요. 약 45,000 eps.



dissect 필터는 18초 소요. 약 55,000 eps.



몇 번 반복해본 결과 대략 2~30% 정도, 많게는 40% 까지도 성능이 향상된다.

20.11.13
로그스태시는 숫자를 인식하지 못한다. [field_count] == "5" 구문이 안 먹은 이유는 ruby가 계산 결과를 숫자형으로 저장했기 때문(..)

관련 글

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스