使用RestHighLevelClient时单个索引速度很慢


(Pearce) #1

Elastic版本: 6.6.1
本地(4核,16G)运行单个节点的ES(启动时参数基本都是默认的),同时使用RestHighLevelClient循环写入1000条(每条<1K)数据,无论是SyncIndex,还是AsyncIndex,发现耗时50s左右,相当于每秒才写入20条
问题: 不考虑bulk操作,这种速度是否正常(感觉太慢)?有没有优化办法?


(Pearce) #2

自己回复,希望能帮到别人。

修改translog的持久化参数,参考这里

比如:

PUT /test/_settings
{
  "translog.durability": "async"
}

这之后测试,每秒写入速度达到了500+,比之前20提高了25倍。


(Kyle Yu) #3

有试过调整RestHighLevelClient的连接池参数吗?默认的是比较小的,可能是在本地排队了。
主要是调整maxTotal和maxPerRoute

RestClientBuilder builder = RestClient.builder(Stream.of(properties.getAddresses()
                .split(",")).map(HttpHost::create).toArray(HttpHost[]::new));
        builder.setHttpClientConfigCallback(b -> {
            if (properties.getMaxConnTotal() != null) {
                b.setMaxConnTotal(properties.getMaxConnTotal());
            }
            if (properties.getMaxConnPerRoute() != null) {
                b.setMaxConnPerRoute(properties.getMaxConnPerRoute());
            }
            return b;
        });
        return new RestHighLevelClient(builder);