即使是不成熟的尝试,也胜于胎死腹中的策略。

bulk写数据,cpu利用率和负载一直上不来,如何提高写入效率

Elasticsearch | 作者 JimmyGao | 发布于2020年09月08日 | 阅读数:2329

     需要写入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多条,我觉得写入效率不应该这么低,请问大家该如何优化?
已邀请:

Egbertm

赞同来自: JoyPanda

heap.percent,ram.percent 不到70%,不能说明内存够用,保证集群的稳定性运行肯定不会打满的,可以提高堆内存试试
你这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.永远滴神

赞同来自:

1.你是使用的什么方式bulk?是bulkProcessor么?设置的线程是多少?
2.你单条数据大不大?如果单条数据很大的话,就可能会达到磁盘IO的瓶颈,看看磁盘IO的平均值是多少?
3.如果单条数据不大,那未到CPU瓶颈,就证明你写入数据的速度还没有达到es创建Lucene索引的速度上限,你需要提升你写入数据的速度,多开点线程往里面写
4.是否达到写上限,用API thread_pool查看下bulk线程,如果rejected一直在叠加,queue一直是处于上限状态,就证明是达到了写上限

要回复问题请先登录注册