我注意到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"
}
}
}
从20k / sec到大约1,500 / sec
然后当我像这样添加输出时:
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 :(得分:0)
夫妻俩。
您的正则表达式需要调整
让grok走得更快的最简单的胜利之一是锚定你的正则表达式。这会将^
放在前面,$
放在最后。这为正则表达式引擎提供了一些重要的线索,可以找出匹配并减少子字符串搜索。
使用%{DATA}
代替%{GREEDYDATA}
,除非它是匹配中的最后一个字段
Greadyness会因为未命中而损害表现。您的grok词典中的第三场比赛中有两个GREEDYDATA
。将第一个改为DATA
,您可能会发现性能因此而提高。这是因为GREEDYDATA告诉正则表达式引擎匹配,直到字符串结束;如果没有匹配,请将一个字符剁掉并重试,重复直到匹配或拒绝。 DATA
走另一条路,从一个角色开始扩展。
至于为什么Influx输出减慢了速度,我没有明确的线索。我知道有些输出不像其他输出那样,其他输出会为每个事件打开TCP连接。
答案 1 :(得分:0)
Logstash 5.6.3上的grok过滤器导致性能问题:https://github.com/elastic/logstash/issues/8560#issue-270112018
根据您使用的版本,您可能也受到了影响。
我建议您升级到最新版本的logstash或至少升级grok插件。