2017-04-18 1 views
0

logstash에서 성능이 매우 이상한 것으로 나타났습니다. 설정 파일을 다음과 같이 설정하면 :logstash 성능 저하

input { 
     kafka { 
       topics => ["kafka-jmx"] 
       bootstrap_servers => "kafka1.com:9092" 
       consumer_threads => 1 
     } 

} 
output { 
       stdout {} 
} 

내 소비는 kafka에서 약 20k 메시지/초입니다. RMI 리스너와 함께 logstash를 시작했기 때문에 jconsole을 통해 JVM에서 무슨 일이 벌어지는 지 알 수 있습니다.

마자이 같은 필터에 추가로 :

filter { 
     json { 
       source => "message" 
     } 
     grok { 
       patterns_dir => "/home/ec2-user/logstash-5.2.0/bin/patterns/" 
       match => {"metric_path" => [ 
           "%{DATA:kafka_host}\.%{DATA:kafka_metric_group}:type=%{DATA:kafka_metric_type},name=%{WORD:kafka_metric_name},topic=%{KTOPIC:kafka_topic},partition=%{KPARTITION:topic_partition}\.%{GREEDYDATA:attr_type}", 
           "%{DATA:kafka_host}\.%{DATA:kafka_metric_group}:type=%{DATA:kafka_metric_type},name=%{WORD:kafka_metric_name},topic=%{KTOPIC:kafka_topic}\.%{GREEDYDATA:attr_type}", 
           "%{DATA:kafka_host}\.%{DATA:kafka_metric_group}:type=%{DATA:kafka_metric_type},name=%{GREEDYDATA:kafka_metric_name}\.%{GREEDYDATA:attr_type}" 
           ] 
         } 
     } 
       ruby { 
         code => "event.set('time', event.get('@timestamp').to_f * 1000)" 
       } 
       mutate { 
         remove_field => ["message"] 
         convert => {"time" => "integer" 
            "metric_value_number" => "integer" 
         } 
       } 
} 

그것은 약 1,500 /에 20K/초에서

그리고 나는이 같은에서 출력을 추가 할 초

간다 :

output { 
     influxdb { 
       host => "10.204.95.88" 
       db => "monitoring" 
       measurement => "BrokerMetrics" 
       retention_policy => "one_week" 
       allow_time_override => "true" 
       exclude_fields => ["@timestamp", "@version", "path"] 
       data_points => { 
           "time" => "%{time}" 
           "cluster_field" => "%{cluster}" 
           "kafka_host_field" => "%{kafka_host}" 
           "kafka_metric_group_field" => "%{kafka_metric_group}" 
           "kafka_metric_type_field" => "%{kafka_metric_type}" 
           "kafka_metric_name_field" => "%{kafka_metric_name}" 
           "kafka_topic_field" => "%{kafka_topic}" 
           "attr_type_field" => "%{attr_type}" 
           "cluster" => "%{[cluster]}" 
           "kafka_host" => "%{[kafka_host]}" 
           "kafka_metric_group" => "%{[kafka_metric_group]}" 
           "kafka_metric_type" => "%{[kafka_metric_type]}" 
           "kafka_metric_name" => "%{[kafka_metric_name]}" 
           "kafka_topic" => "%{[kafka_topic]}" 
           "attr_type" => "%{[attr_type]}" 
           "metric_value_number" => "%{metric_value_number}" 
           "metric_value_string" => "%{metric_value_string}" 
           "topic_partition_field" => "%{topic_partition}" 
           "topic_partition" => "%{[topic_partition]}" 
         } 
       coerce_values => {"metric_value_number" => "integer"} 
       send_as_tags => [ "kafka_host", "kafka_metric_group","cluster", "kafka_metric_type", "kafka_metric_name", "attr_type", "kafka_topic", "topic_partition" ] 
       } 
     } 

소비가 1,500/초에서 약 300/초로 떨어진다. 그래서 결국 내 요금은 20,000/초에서 300/초로 떨어집니다.

logstash.yml 파일에 설정이 없으므로 heap_size를 2g로 설정했습니다. jvm은 많은 힙 공간을 가지고 있습니다. 나는 또한 약 60 %의 CPU 사용량만을 사용하고 있습니다 ...

왜 이런 일이 발생합니까? 나는 또한 -w 2와 함께 시도하고 logstash를 시작했을 때 최대 4까지는 아무런 영향을 미치지 않는 것 같았습니다 ....

답변

0

몇 가지.

귀하의 정규 표현식에는 grok 수 빨리 당신의 정규 표현식에를 고정하는 이동 만들기위한 가장 쉬운 승리의

하나를 조정해야합니다. 그것은 앞쪽에 ^을 넣고 끝에 $을 넣고 있습니다. 이것은 정규식 엔진에 성냥을 알아내는 데 상당한 단서를 제공하고 하위 문자열 검색을 줄입니다. 경기의

사용 %{DATA} 대신 그 마지막 필드를 제외하고 %{GREEDYDATA}

Greadyness은 미스에 대한 성능이 저하됩니다. 그로크 사전에 세 번째로 일치하는 것은 GREEDYDATA입니다. 첫 번째 파일을 DATA으로 바꾸면 성능이 향상 될 수 있습니다. 이것은 GREEDYDATA가 정규 표현식 엔진에 문자열의 끝까지 일치하도록 알려주기 때문입니다. 일치하는 것이 없으면 끝에서 문자를 잘라 내고 다시 시도하거나 일치 또는 거부 될 때까지 반복합니다. DATA은 한 문자로 시작하여 확장하는 다른 방법입니다.


왜 Influx 출력이 느려지는지에 대한 확실한 단서가 없습니다. 일부 출력물은 다른 출력물처럼 느려지지 않으며, 다른 출력물은 각 이벤트마다 TCP 연결을 열어줍니다.

0

Logstash 5.6.3에 grok 수 필터에 의해 발생하는 성능 문제가있다 : https://github.com/elastic/logstash/issues/8560#issue-270112018

사용중인 버전에 따라, 당신도 영향을받을 수 있습니다.

최신 버전의 logstash로 업그레이드하거나 적어도 grok 플러그인을 업그레이드하는 것이 좋습니다.