如何选择最佳的logstash pipleline批量大小和延迟?(Logstash 6.4.3)



简介

我们有一个logstash,它正在接收来自java微服务的日志,最近机器的利用率达到了100%。

我注意到,管道批量大小、工人、延迟以及ram都使用了非常低的值。

我的感觉是,我可以通过将批量大小增加到数千,将延迟增加到秒,并增加ram来提高性能。

它似乎起到了作用,我们已经从一个连续(或接近)以100%崩溃的logstash变成了(或低于)70%。这是一个在vmware中运行的虚拟服务器,只分配了一个核心,因此资源有点有限。

问题

  1. 如何进一步优化?(在不干扰微服务或限制传入消息数量的情况下)
  2. 如何找到延迟和批量大小的最佳值
  3. 此外,尽管我们有一个核心,但我觉得有一个以上的员工会有所帮助,但我不确定(由于IO延迟)

当前配置

ELK(弹性,Logstash,Kibana)6.4

logstash.yml包含

pipeline:
batch:
size: 2048
delay: 5000
pipeline.workers: 4

弹性jvm选项

-Xms4g
-Xmx10g

Logstash jvm选项

-Xms4g
-Xmx10g

Logstash配置:

input {
tcp {
port => 8999
codec => json
}
}
filter {
geoip { 
source => "req.xForwardedFor" 
}
}
filter {
kv {
include_keys => [ "freeTextSearch", "entityId","businessId"]
recursive => "true"
field_split => ","
}
}
filter {
mutate {
split => { "req.user" => "," }
split => { "req.application" => "," }
split => { "req.organization" => "," } 
split => { "app.profiles" => "," }

copy => { "app.name" => "appLicationName" }
}
}
filter {
fingerprint {
target => "[@metadata][uuid]"
method => "UUID"
}
}
filter {
if [app]
{
ruby
{ init => '
BODY_PATH = "[app]"
BODY_STRING = "[name]"
'
code => '
body_val = event.get(BODY_PATH)
if body_val.is_a?(String)
event.set(BODY_PATH, {BODY_STRING => body_val,"[olderApp]" => "true"})
end
'
}
}
}

output {
stdout { 
codec  => rubydebug {
metadata => true
}
}

if [stackTrace] {
email {
address => 'smtp.internal.email'
to => 'Warnings<warning@server.internal.org>'
from => 'Warnings<warning@server.internal.org>'
subject => '%{message}'
template_file => "C:logstashemailtemplate.mustache"
port => 25
}
}

elasticsearch {
hosts => ["localhost:8231"]
sniffing => true
manage_template => false
index => "sg-logs"
document_id => "%{[@metadata][uuid]}"
}

}

更新

我切换到了持久队列,它在性能方面有了很大的改进。我运行了用于冻结logtash的脚本,它似乎没有被破坏,尽管它需要相当多的工作。

切换到pipeline.yml

我切换到pipeline.yml,因为我注意到队列设置不起作用。我还必须通过验证器传递YML。

--- 
- 
path.config: "../configsg/"
pipeline.batch.size: 1000
pipeline.id: persisted-queue-pipeline
pipeline.workers: 2
queue.type: persisted
queue.max_bytes: 2000mb
queue.drain: true

修改bat文件以清理数据/队列文件夹

当数据/队列文件夹中有剩余数据时,我注意到logstash没有正确处理。我添加了一个bat文件来在logstash重新启动等过程中清理/移动这些数据。我需要考虑将来如何处理这些数据。

文件夹:logstash-6.4.3\data\queue

这是我的bat文件,它在启动/重新启动期间由windows服务调用。

echo Date format = %date%
echo dd = %date:~0,2%
echo mm = %date:~3,2%
echo yyyy = %date:~6,8%
echo.
echo Time format = %time%
echo hh = %time:~0,2%
echo mm = %time:~3,2%
echo ss = %time:~6,2%
cd ..
cd data/queue
move  ./persisted-queue-pipeline ../persist-queue-backup-%date:~0,2%_%date:~3,2%_%date:~6,8%-%time:~0,2%_%time:~3,2%_%time:~6,2%.txt
cd ../../bin
logstash.bat

以下是Logstash团队关于优化的一些提示:链接我还建议查看多管道案例。从你的配置来看,我觉得过滤情况可能会导致背压。似乎如果您可以(按端口)划分输入,就可以设置多个管道来处理背压情况。

最新更新