【Spring Boot】Небольшой параллельный бизнес будет включать пул потоков JDK 🔥

Java

Метод строительства

Нечего сказать, самым основным является метод строительства.

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

семь параметров

Проще говоря, это фактически параметр конфигурации.

  • corePoolSize: размер количества основных потоков: простаивают они или нет после создания. Пул потоков должен поддерживатьcorePoolSizeколичество потоков, если не установленоallowCoreThreadTimeOut.
  • maximumPoolSize: максимальное количество потоков: максимальное количество потоков, которое можно создать в пуле потоков.maximumPoolSizeнить.
  • keepAliveTime:время выживания:если прошлоkeepAliveTimeПо истечении времени, если потоки, превышающие количество основных потоков, не получили новых задач, они будут перезапущены.
  • unit:keepAliveTimeединица времени.
  • workQueue: Очередь для хранения задач для выполнения: когда количество отправленных задач превышает количество основных потоков, отправленные задачи сохраняются здесь. Используется только для храненияexecuteметод представленRunnableЗадача. Так что не переводите тут в очередь работ, не копайте себе яму.
  • threadFactory:Thread Engineering: используется для создания фабрики потоков. Например, здесь вы можете настроить имя потока.При анализе стека виртуальной машины вы можете узнать, откуда берется поток, посмотрев на имя, и вы не будете сбиты с толку.
  • handler: Политика отклонения: Когда очередь заполнена задачами и работают потоки с максимальным количеством потоков, пул потоков задач, которые продолжают отправляться, не может быть обработан.Какая политика отказа должна быть реализована.

Процесс выполнения JDK

Пул потоков используется для обработки задач.Когда приходит задача, основной процесс выполнения пула потоков выглядит следующим образом

  • Если количество основных потоков в пуле потоков JDK заполнено, последующие запросы будут помещены в очередь блокировки, а максимальное количество потоков будет включено только при заполнении очереди блокировки.

Процесс выполнения Tomcat

Если вы используете Tomcat, то...

  • Текущий процесс пула потоков в Tomcat: если количество основных потоков израсходовано, то используется максимальное количество потоков, и, наконец, задача отправляется в очередь. Это делается для того, чтобы время отклика было приоритетным.

300 — это только максимальное значение.Если запросы будут продолжать поступать, это определенно будет слишком много.

проблема

10 машин, 1000 одновременных запросов, каждый сервис берет на себя в среднем 100 запросов. Сервер имеет 4-х ядерную конфигурацию.

  • еслиCPUДля интенсивных задач мы должны свести к минимуму переключение контекста, поэтому количество основных потоков может быть установлено на5, длину очереди можно задать как100, максимальное количество потоков остается таким же, как и количество основных потоков.
  • еслиIOДля интенсивных задач мы можем соответствующим образом выделить немного больше основных потоков, чтобы лучше использовать ресурсы.CPU, поэтому количество основных потоков может быть установлено равным8, длина очереди по-прежнему100, максимальный пул потоков устанавливается равным10.

Конечно, все вышеперечисленное является теоретическими значениями. Наиболее подходящие настройки следует определять путем сравнения результатов испытаний под давлением.

Рассмотрим с 4 точек зрения:

  • CPU密集型Случай.
  • IO密集型Случай.
  • Разумно благодаря измерению давления参数配置.
  • Пул потоков动态调整. (Благодаря мониторингу пула потоков можно получить раннее предупреждение)

Стратегия настройки

Как правило, во-первых, база данных не выдерживает нагрузки.

  • Оптимизация параметров системы.
  • Распределите давление. Подтаблица подбиблиотеки, разделение чтения и записи
  • Внедрить кэширование для перехвата запросов в точке входа.
  • Срезайте пики и заполняйте впадины и рационально используйте MQ.
  • асинхронный.
  • Сервисный предохранитель, понижение сервисного уровня.
  • Расширение сервера