【发布时间】:2015-08-01 03:03:45
【问题描述】:
我正在设置一个单节点 ES 来处理来自网络的 udp 消息,并且我正在使用 logstash 来管道消息。
输入-> udp 没有过滤器 输出 -> Elasticsearch(单工作者,刷新大小为 5000)
对于我运行的所有测试,25k 是在严重丢包之前每秒的最大事件数。我知道瓶颈不是 udp 输入或网络,因为当我使用 stdout 或文件输出而不是 ES 时,吞吐量可以高达 80k/s。
节点是 16G/12T (RAID 0) 但磁盘是 HDD。 我尝试了不同的设置,但无法超过 25k evts/s。我想知道我是否只是遇到了硬件限制,唯一的方法是使用 SSD。 有人遇到过同样的情况吗?有什么技巧可以让 ES 以接近标准输出的速度进行索引?这是我迄今为止尝试过的(在 40 秒内发送 1M udp pkts,大约是 25K/s):
- 将 udp worker 增加到 8 个 --> 意识到输入不是问题
- 将 ES 输出 worker 增加到 2、4、8 --> 更糟 吞吐量,8 个 worker 损失 90%。认为 HDD 在并发 I/O 方面表现不佳。
- refresh_interval 从 1 秒增加到 30 秒 --> 轻微 改进
- 分片数 1、2、5、10 --> 无明显改善
这是我在 elasticsearch.yml 中添加的内容
script.disable_dynamic: true
http.cors.allow-origin: "/.*/"
http.cors.enabled: true
action.auto_create_index: false
bootstrap.mlockall: true
action.disable_delete_all_indices: true
cluster.routing.allocation.disk.threshold_enabled: true
cluster.routing.allocation.node_initial_primaries_recoveries:15
indices.recovery.concurrent_streams: 4
index.routing.allocation.disable_allocation: false
index.merge.scheduler.max_thread_count: 1
index.store.type: mmapfs
index.refresh_interval: 60000
threadpool.bulk.queue_size: 30000
indices.memory.index_buffer_size: 30%
index.translog.flush_threshold_ops: 50000
【问题讨论】:
-
您使用的是什么版本的logstash?你在使用批量 api 吗?
-
@JoshC。 logstash 1.5.3,我的弹性搜索输出中有
flush_size => 5000,我假设它告诉它使用批量? -
您为 Elasticsearch 分配了多少内存?你增加了ulimit设置吗?
-
@AlainCollins 我给了 ES 12G:
ES_HEAP_SIZE=12g MAX_LOCKED_MEMORY=unlimited MAX_MAP_COUNT=262144我应该尝试增加地图数量吗? -
这些设置看起来不错,但更多的内存总是好的。您是否为打开的文件提高了 ulimit?