需要写入20万条数据, 数据是结构化字段,有两个字段类型是text,长度是125个字节,按照ik_smart解析;其余13个字段全是keyword,一次bulk写入20万大概需要60秒的时间,拆分成每次bulk2000条,发现效率没有太大改观。
我用的是elasticsearch 7.8的版本,设置5个shard,java堆大小设置为8g。
服务器配置是: 单个物理机,32核,256g内存
执行bulk的时候,查看集群状态,发现heap.percent,ram.percent都不到70%,说明堆大小设置8g是够用的
机器cpu利用率是300%左右,机器负载不到3, 改为5个线程bulk数据,cpu和负载还是没有大的变化,说明多线程根本没发挥作用啊,
按照网上的建议修改了一下参数,但是没有效果:
indices.memory.index_buffer_size: 20%
thread_pool.write.size: 30
thread_pool.write.queue_size: 10000
我是用python tornado框架起的服务来写es,这个框架会在log里显示所有网络调用,我发现一次bulk写20万数据的时候,tornado后台显示调用了400次bulk,也就是每次才bulk500条,我怀疑是数据太大了es客户端自己会拆分数据包,于是试着修改每条数据大小,去掉了一个text类型字段,但是发现还是会调用bulk400次。
按照20万/60秒来计算,每秒才写入3000多条,我觉得写入效率不应该这么低,请问大家该如何优化?
我用的是elasticsearch 7.8的版本,设置5个shard,java堆大小设置为8g。
服务器配置是: 单个物理机,32核,256g内存
执行bulk的时候,查看集群状态,发现heap.percent,ram.percent都不到70%,说明堆大小设置8g是够用的
机器cpu利用率是300%左右,机器负载不到3, 改为5个线程bulk数据,cpu和负载还是没有大的变化,说明多线程根本没发挥作用啊,
按照网上的建议修改了一下参数,但是没有效果:
indices.memory.index_buffer_size: 20%
thread_pool.write.size: 30
thread_pool.write.queue_size: 10000
我是用python tornado框架起的服务来写es,这个框架会在log里显示所有网络调用,我发现一次bulk写20万数据的时候,tornado后台显示调用了400次bulk,也就是每次才bulk500条,我怀疑是数据太大了es客户端自己会拆分数据包,于是试着修改每条数据大小,去掉了一个text类型字段,但是发现还是会调用bulk400次。
按照20万/60秒来计算,每秒才写入3000多条,我觉得写入效率不应该这么低,请问大家该如何优化?
2 个回复
Egbertm
赞同来自: JoyPanda
你这256G,给个32G试试,其它的参数可以不用改。我用7.3版本
ES7.3 实例 2台 每台机器配置8核,32G内存,500GB,ES JVM 16G
UpSet异步操作:300/s max:1200/s min:0
Index异步操作:2800/s max:4000/s min:2000/s
Index同步操作:220/s max:280/s min: 160/s
BulkIndex异步操作:35000/s max: max:50000/s,min:24000/s Indexing Thread Max:10
BulkIndex同步操作:12000/s max:12000/s min:6000/s
这个是我之前做的压测,最大的内容字段控制在100个字符
AiToMaKoTo - Elasticsearch.永远滴神
赞同来自:
2.你单条数据大不大?如果单条数据很大的话,就可能会达到磁盘IO的瓶颈,看看磁盘IO的平均值是多少?
3.如果单条数据不大,那未到CPU瓶颈,就证明你写入数据的速度还没有达到es创建Lucene索引的速度上限,你需要提升你写入数据的速度,多开点线程往里面写
4.是否达到写上限,用API thread_pool查看下bulk线程,如果rejected一直在叠加,queue一直是处于上限状态,就证明是达到了写上限