Проблема производительности java.lang.Thread и потоков в ThreadPool - PullRequest
2 голосов
/ 29 марта 2019

Потребительское приложение Kafka имеет серьезные задержки (недостаточно быстрое потребление событий kafka в час пик). Тема kafka имеет 120 разделов, а группа потребителей имеет в общей сложности 30 хостов, и у каждого хоста есть два потребителя, поэтому каждый потребитель потребляет от 2 разделов kafka. Мы используем хосты AWS C5.9xlarge с 32 ядрами. Каждый потребитель был помещен в один java.lang.Thread, и внутри каждого потока создается ThreadPool с 250 потоками.

Мы убедились, что ни один из CPU / Memory / IO не является узким местом. Затем мы увеличили 250 рабочих до 500 рабочих, но задержка осталась. Затем мы вернулись к 250 рабочим, но увеличили до 4 потребителей на хост с 2. В результате каждый потребитель потребляет один раздел kafka. И теперь проблема решена, латентность упала до очень низкой.

Мой вопрос: почему увеличение с 250 до 500 в Threadpool не помогло, но помогло увеличение с 2 до 4 потребителей на хост?

private class ConsumerThread extends Thread {
    public ConsumerThread(StremProcessor processor) {
      this.processor = processor;
      this.consumer = new KafkaConsumer()
    }
    @Override
    public void run() {
        ExecutorService executor = Executors.newFixedThreadPool(250);
        while (true) {
          Data data = consumer.poll()
          executor.invokeAll(getTasks(data, processor)); //processor is 
        }    
    }
}

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Прежде всего: Вы должны включить некоторую задержку в цикл while между каждым циклом, чтобы приложение не заполняло вашу память.

В основном метод ExecutorService.invokeAll() возвращает списокFuture с.Вы можете использовать их для «управления» вашими потоками.

Чем потоки в ThreadPool отличаются от java.lang.Thread?

Они не отличаются, кроме васверните оболочку (Future), которая позволит вам контролировать поток во время выполнения.Базовый Thread работает как обычный поток Java.

Это потому, что все потоки в ThreadPool используют одно ядро ​​процессора?

Нет

0 голосов
/ 29 марта 2019

Пул потоков - это не что иное, как reusable пул java.lang.Thread.Как правило, у пула потоков есть queue of tasks, и если какой-либо поток из пула потоков свободен, он может выполнить задачу, и когда задача будет выполнена, этот поток вернется в пул и попытаться найти, есть ли какая-либо другая задача, ожидающая в очереди.

Чем потоки в ThreadPool отличаются от java.lang.Thread?

Разницы нет.Только разница в использовании.

Это потому, что все потоки в ThreadPool используют одно ядро ​​процессора?

Нет, он может использовать любое количество доступных процессоров.

Я помню, что количество потоков по умолчанию в ExecutorPool равно 250 на процессор, означает ли это, что ExecutorPool недостаточно умен, чтобы распределить 250 потоков по 16 ядрам?

Откуда вы получаете информациювроде "ExecutorPool равен 250 на процессор"?Я не совсем понимаю ваш вопрос.Поток пула потоков может выполняться на любом ядре, поскольку обычный поток не имеет ограничений для потока пула потоков.

...