Я реализовал свое первое приложение GridGain и не получаю ожидаемых улучшений производительности.К сожалению, это медленнее.Мне нужна помощь в улучшении моей реализации, чтобы она могла быть быстрее.
Суть моего приложения в том, что я выполняю оптимизацию методом грубой силы с миллионами возможных параметров, которые занимают доли секунды для каждой оценки функции.,Я реализовал это, разделив миллионы итераций на несколько групп, и каждая группа выполняется как одно задание.
Соответствующий фрагмент кода приведен ниже.функция maxAppliedRange вызывает функцию foo для каждого значения в диапазоне x и возвращает максимум, и результат становится максимальным из всех максимумов, найденных в каждом задании.
scalar {
result = grid !*~
(for (x <- (1 to threads).map(i => ((i - 1) * iterations / threads, i * iterations / threads)))
yield () => maxAppliedRange(x, foo), (s: Seq[(Double, Long)]) => s.max)
}
Мой код может быть выбран из несколькихмногопоточное выполнение на одной машине или использование нескольких узлов GridGain с использованием приведенного выше кода.Когда я запускаю версию gridgain, она начинается так, как будто она будет быстрее, но затем всегда происходит несколько вещей:
- Один из узлов (на другой машине) пропускает сердцебиение, вызываяузел на моем главном компьютере, чтобы отказаться от этого узла и начать выполнение задания во второй раз.
- Узел, пропустивший сердцебиение, продолжает выполнять ту же работу.Теперь у меня есть два узла, которые делают одно и то же.
- В конце концов, все задания выполняются на моей основной машине, но, поскольку некоторые из заданий начались позже, для завершения всего требуется больше времени.
- Иногда GridGain генерирует исключение, потому что истекло время ожидания узла и вся задача завершается неудачей.
- Я раздражаюсь.
Я пытался настроить его так, чтобы было много заданий, поэтомуесли он потерпел неудачу, то это было бы не так уж сложно, но когда я это сделал, я получил много заданий на каждом узле.Это накладывает гораздо большую нагрузку на каждую машину, повышая вероятность того, что узел пропустит сердцебиение, и все пойдет быстрее.Если у меня есть одно задание на процессор, то при сбое одного задания другой узел должен начинаться сначала.В любом случае я не могу победить.
Я думаю, что лучше всего работать, если бы я мог сделать две вещи:
- Увеличить время ожидания для сердцебиений
- Дросселировать каждыйузел, так что он выполняет только одну работу за один раз.
Если бы я мог сделать это, я мог бы разделить свою задачу на множество заданий.Каждый узел будет выполнять одну работу за раз, и ни одна машина не будет перегружена, чтобы заставить его пропустить сердцебиение.Если работа потерпела неудачу, то небольшая работа будет потеряна, и восстановление будет быстрым.
Может кто-нибудь сказать мне, как это сделать?Что мне здесь делать?