Создаётся очень много java потоков при использовании CreateIndex API

В своём приложении мне необходимо создать новый индекс, для этого я использую High Level REST Client и CreateIndexRequest. Вот код, который я использую

public boolean createNewIndex(String indexName, Map<String, Object> initialIndexSettings) {
        boolean indexCreated = false;
        CreateIndexRequest request = new CreateIndexRequest(indexName);
        request.settings(initialIndexSettings);
        try {
            CreateIndexResponse createIndexResponse = this.elasticsearchConfiguration.client().indices().create(request, RequestOptions.DEFAULT);
            this.elasticsearchConfiguration.client().close();
            indexCreated = (createIndexResponse.isAcknowledged() && createIndexResponse.isShardsAcknowledged());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return indexCreated;
    }

В Map<String, Object> initialSetting задаётся только количество шард = 3 и период обновления индекса = -1. И после выполнения данного метода количество java потоков увеличивается на 300+. Подскажите пожалуйста в чём может быть проблема. Версия elasticsearch клиента 7.5.2, версия кластера 7.9.1. Может ли это быть из-за разности версий?
Вот количество потоков до выполнения метода:


вот после:

Мониторинг количества потоков осуществлялся через jconsole
Сам клиент создаётся вот так:

return new RestHighLevelClient(RestClient.builder(
                new HttpHost(host, port, "http")
        ));

То есть каждый вызов этого метода создает новый набор HttpPost, RestClient и RestHighLevelClient? В createNewIndex два таких вызова и только один из них ведет к закрытию клиента?

Получается, что так. Я исправил эту ошибку, теперь клиент создаётся только 1 рази закрывается, но тенденция с увеличением количества потоков не изменилась, увеличивается примерно на столько же

А зачем вы его каждый раз создаете и закрываете? Как потоки называются?

Мы больше не создаём его каждый раз, это была ошибка, сейчас клиент создаётся только 1 раз и мы его используем. А потоки называются I/O dispatcher №, вот более подробно про них:

Name: I/O dispatcher 81
State: RUNNABLE
Total blocked: 0  Total waited: 0

Stack trace: 
sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method)
sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(WindowsSelectorImpl.java:296)
sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(WindowsSelectorImpl.java:278)
sun.nio.ch.WindowsSelectorImpl.doSelect(WindowsSelectorImpl.java:159)
sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
   - locked sun.nio.ch.Util$3@2d73fee5
   - locked java.util.Collections$UnmodifiableSet@5f662c1a
   - locked sun.nio.ch.WindowsSelectorImpl@2a83ac60
sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:255)
org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591)
java.lang.Thread.run(Thread.java:748)

Может ли количество шрад и реплик на индекс послужить причиной тому, что получается такое количество потоков? В нашем коде мы много раз отправляем запросы на индекс, забираем данные, а потом, когда все данные собрали и обновили их в другом индексе отправляем агрегирующий запрос. Т.е. количество запросов за один проход может быть очень большим. И каждый индекс у нас состоит из 3 шардов и 2 реплик на каждую шарду. Может ли это влиять на количество потоков? Т.к. если индекс распараллелен на несколько шард, то когда мы отправляем search запрос он работает с каждой шардой этого индекса и получается, когда мы пытаемся обновить данные в индексе по какому-то критерию эластик ищет эти данные для обновления в каждой шарде и не плодит ли он всеми этими действиями большое количество потоков?

Нет. Разбиение запроса на шардовые подзапросы происходит на сервере, а не на клиенте.

Это потоки из apache httpcore, которые RestClient использует. Они держаться в пуле.

Не должно быть. Был баг, который создавал проблемы до 4.5.0, но в 4.5.2 он уже был исправлен. А как поиск выполняется? Вы там, случайно, нового клиента не создаете?

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.