Как долго средневзвешенное значение должно занимать Apache Ignite?
В настоящее время я тестирую Appache Ignite для приложения, работающего практически в реальном времени, и простые операции кажутся чрезмерно медленными при относительно небольшом размере выборки. Ниже приводятся подробности настройки и сроки - смотрите 2 вопроса внизу.
Настроить:
- Режим кэширования: раздел
- Количество серверных узлов: 3
- Процессоры: 4 на узел (12)
- Размер кучи: 2 ГБ на узел (6 ГБ)
Первый вариант использования - это вычисление взвешенного среднего по двум полям объекта с разными скоростями.
Первый способ - выполнить запрос в стиле SQL:
...
query = new SqlFieldsQuery("select SUM(field1*field2)/SUM(field2) from MyObject");
cache.query(query).getAll();
....
Наблюдаемые сроки:
Кэш: 500 000 запросов / секунду: 10
Медиана: 428 мс, 90-й процентиль: 13 929 мс
Кэш: 500 000 запросов / секунду: 50
Медиана: 191 465 мс, 90-й процентиль: 402 285 мс
Очевидно, это ставится в очередь с огромной задержкой (>400 мс), простое средневзвешенное вычисление для одного jvm (4 ядра) занимает 6 мс.
Второй подход заключается в использовании IgniteCompute для широковещательной передачи Callables между узлами и вычисления средневзвешенного значения для каждого узла, снижая у вызывающего абонента, задержку лишь незначительно лучше, пропускная способность улучшается, но все еще находится на непригодных уровнях.
Кэш: 500 000 запросов / секунду: 10
Медиана: 408 мс, 90-й процентиль: 507 мс
Кэш: 500 000 запросов / секунду: 50
Медиана: 114,155мс, 90-й процентиль: 237,521мс
Несколько вещей, которые я заметил во время эксперимента:
- Замена диска не происходит
- Процессоры работают до 400%
- Запрос разделен на два различных взвешенных средних (карта уменьшена)
- Записи равномерно распределены по узлам
- При каждом размере кучи около 500 МБ сборка мусора не запускается
На мои вопросы:
- Ожидаются ли эти сроки или есть какие-то очевидные условия, которые я пропускаю? Я не смог найти ориентиры для подобных операций.
- Каков рекомендуемый метод для выполнения вычислений в стиле fork-join при включенном зажигании без перемещения данных?
1 ответ
Эта тема подробно обсуждалась на форуме пользователей Apache Ignite: http://apache-ignite-users.70518.x6.nabble.com/Ignite-performance-td6703.html