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 вопрос в том, как мне уменьшить его, поскольку эти болты должны иметь возможность обрабатывать больше кортежей за секунду, как и в моих предыдущих расчетах, что удерживает их от ввода и обработки с большей скоростью?
Я думаю, что ваша проблема может быть связана с кортежами ack
, которые используются для запуска и остановки полных часов задержки, застревая в ожидании на квитанциях.
У вас много болтов и, предположительно, высокая пропускная способность, что приведет к появлению большого количества сообщений ack
. Попробуйте увеличить количество подтверждений, используя значение конфигурации topology.acker.executors
, которое, мы надеемся, уменьшит задержку в очереди для кортежей ack
.
Если вы также используете потребителя пользовательских метрик, вы также можете захотеть увеличить параллелизм этого компонента, учитывая количество имеющихся у вас болтов.
Задержка выполнения Acker сама по себе мало что скажет вам, вам также нужно посмотреть на скорость прибытия Acker. Чем ближе использование (частота поступления, умноженная на задержку выполнения) к 1, тем дольше ваши кортежи ack будут ждать и тем больше времени будет искусственно добавлено к полному значению задержки.
Как я могу увидеть скорость прибытия Acker, есть ли она в каких-то показателях, но не может быть найдена в пользовательском интерфейсе Nimbus?
Я также увеличил количество акеров до 50 с 10, это не повлияло на производительность.
Я уже увеличил количество подтверждений, которые были ранее 3, которые я увеличил до 10, и также я не вижу очень высокой задержки выполнения акеров, остается ли ваша гипотеза верной?