es 插入索引的正常性能应该是多少?

2022-06-15 21:59:56 +08:00
 winRain

背景:由于公司业务需要,引入了 es 。于是,我在公司内网虚拟机( 8c8g ,固态硬盘)上用 docker compose 启动了一个 es 和 kibana ,并给 es 的 jvm 分配了 6g ,并配置了一些 jvm 参数。

当我用 spring data elasticsearch 的 repository saveAll 操作去批量插入 100 条数据时,发现耗时在 200 ms 左右。其实我感觉这个速度跟正常用公有云的 rds 批量插入数据是差不多了。

那么问题来了,es 这个插入速度是正常的吗,是不是还有其他优化参数可以配置,用来提升这个插入性能?如果这样是正常的,那么 es 在插入和查询上相比于 rds ,在实际应用中,优势体现在哪些地方呢?

3377 次点击
所在节点    Elasticsearch
11 条回复
DonaldY
2022-06-15 22:25:29 +08:00
100 条插入要 200ms ,那 qps 是 500 。

优化的话,内存明显不够。ES 堆内存 6G ,总内存 8G ,那么就剩 2G ,要给 kibana 、docker 、机器本身,剩下给 os cache 就没多少。

详细优化可以看官网,很全了: https://www.elastic.co/guide/en/elasticsearch/reference/7.9/tune-for-indexing-speed.html#tune-for-indexing-speed


优势写入快,近实时查询,且能分词。
strawberryBug
2022-06-15 23:16:50 +08:00
不正常。
生产单实例平均每秒写入 8k 条,每条约 0.7kb 。
totoro52
2022-06-16 08:52:57 +08:00
es 和 kibana 两个内存猛兽你全跑了,剩给系统的时间不多了
billlee
2022-06-16 15:09:09 +08:00
1. es 需要使用系统 page cache, 一般配置 jvm 堆只能使用一半的系统内存,也就是说 8g 机器配置 4g 的堆,剩下的内存也不能用来跑 kibana 了
2. 延迟 != 吞吐量,提高并发可以增大吞吐量
3. 有两个关键参数影响 es 的写入速度:translog 的 flush 间隔和 reindex 间隔
4. 数据库系统对磁盘 I/O 性能敏感,没有人会在生产环境拿虚拟机来跑 es 或 rdbms 的,即使公有云的服务也是直接在物理机上跑
mosliu
2022-06-16 15:52:58 +08:00
刚才看了眼
用的 bulkProcessor 240 多条用大约 200ms 吧。
平均插入的数据单条在 40+ kB
折合每秒能力在 1k 以上

分析:这个的内存分配极为不合理啊
es6G
kibana 和系统 还有 es 的 cache 一起去分 2G ???
winRain
2022-06-17 10:27:59 +08:00
@mosliu 其实我 200 多条的数据插入速度也跟你这个差不多。但是 kibana 和 es cache 分 2G 这个我之前确实不太懂,没考虑到,那如果按这个 8g 的虚拟机来的话,内存应该怎么分配呢
winRain
2022-06-17 10:28:56 +08:00
@DonaldY 感谢大佬回复,我看过这篇帖子,也试了里面说的一些方法,但是提升仍然也是不明显
winRain
2022-06-17 10:55:03 +08:00
@billlee 我后面也试过公有云的 es ,用的免费版那种,对比下来跟我虚拟机搭的这个环境也差不了多少。在我最刚开始的想法中,es 的 bulkindex 应该是可以类比为 MySQL 的批量插入的,而我用公有云的 rds 批量插入几十条数据,实际可能几十 ms 肯定不到 100 ms ,那么我刚开始觉得,es 既然是专门用来做搜索的,批量插入这种应该不慢,起码我在公有云上随便搭个 redis ,性能也就几十 ms 。所以我一直想说,有没有什么办法可以让 es 的批量插入 几十 条数据的速度也能在几十 ms
mosliu
2022-06-17 11:01:25 +08:00
@winRain 嗯 我这边同时有 10+ 个程序同时在操作 es 吧...

记得新插入的数据是放在内存里面的。等定时再去持久化。这个时间可配置,我忘了是啥了。

你这内存分配确实不合理。一般至少留和 heap 一样的内存给 es 。

我没用过很大的集群。只是十几个节点( 12C ,64G )的小集群的情况 仅供参考
winRain
2022-06-18 15:46:31 +08:00
@mosliu 我在另一台 32 g 内存的云服务器也按同样的方式搭了 es 和 kibana ,这样来看的话,应该不存在上面说的没有 os cache 的问题,但速度还是 100 多 ms 。这样的话,抛去硬件因素,es 有没有可能通过一种搭建方式,能够达到 20 多条用 bulk index 也能达到 50 ms 以下的插入速度?
mosliu
2022-06-18 19:58:04 +08:00
开 20 线程 不用 bulk 直接 indexrequest

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/859879

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX