请解释一下logstash是如何处理内存和事件的。我理解,当事件发生时,它被写入elasticsearch(在我的情况下),之后应该由垃圾收集器从内存中清除它。但是在调试模式下,我在日志中看到所有转到elasticsearch的条目,并且我没有看到它们被清除。我担心随着时间的推移,它们会累积起来,这将导致超过记忆峰值。
在我的传输数据量上,我仍然没有看到内存消耗有很大的变化,但是我想知道如何正确地做。
因此,问题是是否有必要强制清理事件以使它们不阻塞内存?如果有,该怎么做?logstash.conf
input {
jdbc {
jdbc_connection_string => "jdbc:postgresql://<server>:5432/<DB>"
jdbc_user => "user"
jdbc_password => "pass"
jdbc_driver_class => "org.postgresql.Driver"
tracking_column => "unix_ts_in_secs"
schedule => "*/3 * * * * *"
statement => "SELECT uuid, header, location, price, parse_date AS unix_ts_in_secs FROM pdf_store WHERE (parse_date > :sql_last_value AND parse_date < NOW()) ORDER BY parse_date;"
}
}
output {
stdout { codec => json_lines }
elasticsearch {
hosts => ["http://localhost:9200"]
document_id => "%{uuid}"
index => "test_index7"
}
}
pipelines.yml
- pipeline.id: pipeline_test
pipeline.workers: 1
pipeline.batch.size: 1
pipeline.batch.delay: 1
path.config: "/config/logstash.conf"
根据Elastic的建议,您必须检查JVM堆:
请注意,Logstash运行在Java VM上。这意味着Logstash将始终使用您分配给它的最大内存量。查找其他使用大量内存并可能导致Logstash交换到磁盘的应用程序。如果应用程序使用的总内存超过物理内存,就会发生这种情况。
- 对于典型的摄取场景,推荐的堆大小应该不小于4GB,不大于8GB。 如果堆大小过低,
- CPU利用率可能会不必要地增加,从而导致JVM不断地进行垃圾收集。您可以通过将堆大小加倍来检查此问题,以查看性能是否有所提高。
- 不要增加堆大小超过物理内存量。必须留出一些内存来运行操作系统和其他进程。作为大多数安装的一般指导原则,不要超过物理内存的50-75%。您拥有的内存越多,您可以使用的百分比就越高。
- 设置最小(Xms)和最大(Xmx)堆分配大小为相同的值,以防止堆在运行时调整大小,这是一个非常昂贵的过程。
链接可以帮助您:https://www.elastic.co/guide/en/logstash/master/performance-troubleshooting.html