Кортежи, которым требуется больше времени для достижения от носика до последнего болта (так называемая полная задержка), высоки

Version Info: 
   "org.apache.storm" % "storm-core" % "1.2.1" 
   "org.apache.storm" % "storm-kafka-client" % "1.2.1" 

Я создавал и экспериментировал с созданной мной топологией Storm, которая имеет 4 болта и один носик кафки.

Я пытался настроить такие конфигурации, как параллельность этих болтов, max-spout-pending и т. д., Чтобы увидеть, какой масштаб я могу получить от этого. После некоторой конфигурации config / результаты выглядят примерно так:

max-spout-pending: 1200
Kafka Spout Executors: 10
Num Workers: 10
+----------+-------------+----------+----------------------+
| boltName | Parallelism | Capacity | Execute latency (ms) |
+----------+-------------+----------+----------------------+
| __acker  |          10 | 0.008    | 0.005                |
| bolt1    |          15 | 0.047    | 0.211                |
| bolt2    |         150 | 0.846    | 33.151               |
| bolt3    |        1500 | 0.765    | 289.679              |
| bolt4    |          48 | 0.768    | 10.451               |
+----------+-------------+----------+----------------------+

Задержка процесса и задержка выполнения почти одинаковы. В болте 3 задействован HTTP-вызов, который занимает примерно столько же времени, а болт 2 и болт 4 также выполняют некоторые операции ввода-вывода.

Хотя я вижу, что каждый болт может индивидуально обрабатывать более 3 тыс. (Bolt3: 1500 / 289,679 мс = 5,17 тыс. Qps, bolt4: 48 / 10,451 мс = 4,59 тыс. Qps и т. д.), Но в целом эта топология обрабатывает кортежи только ~ 3к кв / с. Я запускаю его на 10 коробках (то есть по одному рабочему на коробку), имея 12-ядерный процессор и 32 ГБ ОЗУ. Я дал каждому рабочему процессу -xms 8 ГБ и -xmx 10 ГБ, поэтому объем оперативной памяти также не должен быть ограничением. Я вижу, что сборщик мусора также работает правильно, 4 сборщика мусора в минуту занимают около 350 мс в минуту (из записи полета рабочего процесса за 1 минуту).

Я вижу, что Complete Latency для каждого кортежа составляет около 4 секунд, что я не могу понять, так как если я вычисляю все время, затраченное на все болты, оно составляет около 334 мс, но, как уже упоминалось, здесь, кортежи могут ждать в буферах , он предлагает увеличить dop (степень параллелизма), что я сделал и достиг вышеуказанного состояния.

Я добавляю еще несколько измерений и вижу, что кортежам требуется в среднем около 1,3 секунды, чтобы добраться от болта 2 до болта 3 и 5 секунд от болта 3 до болта 4. Хотя я понимаю, что Storm может держать их в исходящем или входящем буфере, My вопрос в том, как мне уменьшить его, поскольку эти болты должны иметь возможность обрабатывать больше кортежей за секунду, как и в моих предыдущих расчетах, что удерживает их от ввода и обработки с большей скоростью?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
176
1

Ответы 1

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

У вас много болтов и, предположительно, высокая пропускная способность, что приведет к появлению большого количества сообщений ack. Попробуйте увеличить количество подтверждений, используя значение конфигурации topology.acker.executors, которое, мы надеемся, уменьшит задержку в очереди для кортежей ack.

Если вы также используете потребителя пользовательских метрик, вы также можете захотеть увеличить параллелизм этого компонента, учитывая количество имеющихся у вас болтов.

Я уже увеличил количество подтверждений, которые были ранее 3, которые я увеличил до 10, и также я не вижу очень высокой задержки выполнения акеров, остается ли ваша гипотеза верной?

Saurabh 08.11.2018 18:11

Задержка выполнения Acker сама по себе мало что скажет вам, вам также нужно посмотреть на скорость прибытия Acker. Чем ближе использование (частота поступления, умноженная на задержку выполнения) к 1, тем дольше ваши кортежи ack будут ждать и тем больше времени будет искусственно добавлено к полному значению задержки.

Tom Cooper 08.11.2018 18:17

Как я могу увидеть скорость прибытия Acker, есть ли она в каких-то показателях, но не может быть найдена в пользовательском интерфейсе Nimbus?

Saurabh 09.11.2018 14:47

Я также увеличил количество акеров до 50 с 10, это не повлияло на производительность.

Saurabh 16.11.2018 14:04

Другие вопросы по теме