Зачем запускать миллион агентов в JADE?
То что хорошо работает при «небольших» размерностях, может повести себя непредсказуемо при росте количества элементов. Например, мы хорошо знаем поведение системы, состоящей из ста или тысячи взаимодействующих элементов. И часто для исследователей встает большой вопрос: «как будет вести себя подобная система, состоящая уже из миллиона элементов?». Для ответа на него на помощь приходит имитационное моделирование, ну и мультиагентный подход как инструмент подобного моделирования. Системы представляющие из себя группу взаимодействующих элементов, по логике вещей должны хорошо подходить для программирования в виде мультиагентной системы (МАС), например JADE приложения.
Вот из этой задачи и вырастает потребность в запуске миллиона агентов, чтобы промоделировать поведение системы состоящей из миллиона взаимодействующих друг с другом элементов. Подойдя к решению этой задачи в качестве платформы у меня используется JADE, а ресурсы — это кластер одного НИИ (смотри ранние статьи). К сожалению честного решения получить не удалось, но в целом успех в решение задачи есть.
Построение мультиагентной модели для JADE.
Изучив поведения элемента и его взаимодействий в небольшой системе, можно запрограммировать его в виде агента JADE. В моем случае получился агент, который имеет сложную систему инициализации, настройки и самоорганизации МАС, но который в процессе моделирование имеет несколько циклических поведений (фактически доработанных TickerBehaviour). Калибровка модели на реальных данных собранных с небольшой системы, позволила достичь приемлемой для нас точности моделирования. Были проведены первые испытания с запуском моделей, состоящих из нескольких тысяч агентов. После чего стала вырисовываться проблема масштабируемости JADE приложений.
Тернистый путь к миллиону.
Разобравшись с тем как на кластере запустить единое JADE приложение, быстро был получен печальный результат, что платформа начинает сыпаться на размерностях в 10k агентов, что ставила под вопрос успешность исследования с миллионом агентов. Как я писал выше, агенты долго и затратно самоорганизовывались в единую систему, при этом шел активный обмен сообщениями как между собой, так и к управляющим агентам JADE. В частности захлебывался сервис «желтых страниц». Первый вариант кода агента конечно же не отличался чистотой и оптимальностью, поэтому началась кропотливая работа по поиску «узких мест». Были сделаны некоторые оптимизации:
- Введены для некоторых случаев строгое соответствие между именем агента и предоставляемым им сервисом, что позволило исключить часть запросов к «желтым страницам».
- Для сбора информации об агентах и управления ими, было создано дерево контролирующих агентов, которые взаимодействовали с группой агентов модели. Это позволило избежать затопления управляющего агента данными ото всех агентов сразу, а так же ускорило распространение управляющих команд к агентам модели.
- На контейнерах были созданы кеши, дублирующие информацию «Желтых страниц», что позволило существенно разгрузить агента JADE.
- Ну и ряд специфических для модели оптимизаций.
Все эти меры позволили лишь на порядок увеличить размерность работающих JADE приложений, что было далеко миллиона агентов. И дальше была замечена и сделана тривиальная оптимизация, лежащая на поверхности, но упущенная из виду видимо из-за глубокого погружения в задачу. Идея в том, чтобы объединить N агентов в один. Т.к. в процессе моделирования (когда вся инициализация закончена) агент представляет из себя несколько циклических поведений, при чем по сути лишь одно занималось непосредственно имитацией поведения элемента исследуемой системы, то стала очевидной возможность запуска N таких поведений внутри одного агента.
Подход оказался рабочим, удалось получить систему в которой работало миллион сущностей, эквивалентных агентам первого поколения.