![需要帮助提高 logstash 的性能](https://linux22.com/image/724035/%E9%9C%80%E8%A6%81%E5%B8%AE%E5%8A%A9%E6%8F%90%E9%AB%98%20logstash%20%E7%9A%84%E6%80%A7%E8%83%BD.png)
我们正在部署 ELK 堆栈,需要有关集群性能(更具体地说是 logstash)的建议和一般建议。
因此,我们目前的设置是,我们有 1 个 kibana 节点、2 个 logstash 节点和 4 个 elastic 节点。每个 logstash 节点使用 8 个 vCPU 和 32 GB RAM,并使用 nginx 作为负载均衡器接收 syslog 数据。每个 elastic 节点有 8 个 vCPU 和 64 GB RAM。所有节点的堆大小都设置为 RAM 的 ½。
我们目前每秒处理大约 4-5000 个事件,但计划增加到每秒更多事件。根据目前的事件数量,我们看到两个 logstash 节点都使用了大约 90% 的 CPU。现在我们在使用一些过滤器将日志移动到 elastic 之前对其进行处理。它们如下:
3000-过滤器-syslog.conf:
filter {
if "syslog" in [tags] and "pre-processed" not in [tags] {
if "%ASA-" in [message] {
mutate {
add_tag => [ "pre-processed", "Firewall", "ASA" ]
}
grok {
match => ["message", "%{CISCO_TAGGED_SYSLOG} %{GREEDYDATA:cisco_message}"]
}
syslog_pri { }
if "_grokparsefailure" not in [tags] {
mutate {
rename => ["cisco_message", "message"]
remove_field => ["timestamp"]
}
}
grok {
match => [
"message", "%{CISCOFW106001}",
"message", "%{CISCOFW106006_106007_106010}",
"message", "%{CISCOFW106014}",
"message", "%{CISCOFW106015}",
"message", "%{CISCOFW106021}",
"message", "%{CISCOFW106023}",
"message", "%{CISCOFW106100}",
"message", "%{CISCOFW110002}",
"message", "%{CISCOFW302010}",
"message", "%{CISCOFW302013_302014_302015_302016}",
"message", "%{CISCOFW302020_302021}",
"message", "%{CISCOFW305011}",
"message", "%{CISCOFW313001_313004_313008}",
"message", "%{CISCOFW313005}",
"message", "%{CISCOFW402117}",
"message", "%{CISCOFW402119}",
"message", "%{CISCOFW419001}",
"message", "%{CISCOFW419002}",
"message", "%{CISCOFW500004}",
"message", "%{CISCOFW602303_602304}",
"message", "%{CISCOFW710001_710002_710003_710005_710006}",
"message", "%{CISCOFW713172}",
"message", "%{CISCOFW733100}"
]
}
}
}
}
3010-过滤器-jdbc.conf:
filter {
if "syslog" in [tags] {
jdbc_static {
loaders => [
{
id => "elkDevIndexAssoc"
query => "select * from elkDevIndexAssoc"
local_table => "elkDevIndexAssoc"
}
]
local_db_objects => [
{
name => "elkDevIndexAssoc"
index_columns => ["cenDevIP"]
columns => [
["cenDevSID", "varchar(255)"],
["cenDevFQDN", "varchar(255)"],
["cenDevIP", "varchar(255)"],
["cenDevServiceName", "varchar(255)"]
]
}
]
local_lookups => [
{
id => "localObjects"
query => "select * from elkDevIndexAssoc WHERE cenDevIP = :host"
parameters => {host => "[host]"}
target => "cendotEnhanced"
}
]
# using add_field here to add & rename values to the event root
add_field => { cendotFQDN => "%{[cendotEnhanced[0][cendevfqdn]}" }
add_field => { cendotSID => "%{[cendotEnhanced[0][cendevsid]}" }
add_field => { cendotServiceName => "%{[cendotEnhanced[0][cendevservicename]}" }
remove_field => ["cendotEnhanced"]
jdbc_user => "user"
jdbc_password => "password"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_driver_library => "/usr/share/java/mysql-connector-java-8.0.11.jar"
jdbc_connection_string => "jdbc:mysql://84.19.155.71:3306/logstash?serverTimezone=Europe/Stockholm"
#jdbc_default_timezone => "Europe/Stockholm"
}
}
}
有什么方法可以调试占用如此多 CPU 能力的原因吗?由于我们需要能够处理更多日志,有人能给出建议吗?
以下是 jstat 的输出:
jstat -gc 56576
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
68096.0 68096.0 0.0 68096.0 545344.0 66712.9 30775744.0 10740782.3 113316.0 93805.9 16452.0 13229.3 1341 146.848 6 0.449 147.297
谢谢
答案1
这里有一些技巧可以帮助您完成性能调整任务。
尽可能使用多个管道
Logstash 6.0 引入了轻松运行多个管道的可能性。如果有意义,您可以使用它来分离事件处理逻辑。例如,您可以区分两种或多种类型的输入/输出及其之间的过滤过程。
条件逻辑
接下来尝试看看您是否可以完全减少过滤器中的条件逻辑。 if..else 逻辑越多,Logstash 的 CPU 占用就越大。
获取一些有价值的统计数据,看看是什么导致了 CPU 使用率过高
您绝对应该使用 Logstash 的 Node Stats API 来查看当前事件处理管道内部发生的情况。
curl -XGET 'localhost:9600/_node/stats/process'
您还可以查找其他统计类型。(例如,尝试管道以及流程)。查看此页面有关使用 API 查询 Logstash 统计数据的更多信息。这很可能会告诉您真正密集的事情发生在哪里。
祝你好运!