Pull to refresh

Comments 3

Интересная статья, и сама библиотека заинтересовала. Какая аппаратная платформа использовалась? Какой оверхед по коду?
Ну если говорить о «верхнем уровне»(интерфейс оператора, алгоритмы управления), то это два небольших безвентиляторных блока на базе Intel. А по сути «обычные компы», на которые мы установили Linux (ALT Linux).

Какой оверхед по коду?

Да вроде нет «оверхеда» какого-то особого. От использования акторов кода не становится больше, наоборот мне показалось, что логика выражается достаточно лаконично.
По крайней мере с использованием того API который предоставляет sobjectizer.

Думаю, что нужно прокомментировать вот этот момент:


При этом акторов (и кооперации) можно (легко) создавать динамически в большом количестве и как обещают разработчики — это не дорого.

Акторов, действительно, можно создавать много. Стоимость зависит от "тяжести" конкретного актора — в зависимости от количества состояний и других полей нем актор может занимать от пары сотен байт до нескольких килобайт.


Самую высокую цену приходится платить за регистрацию кооперации. Вот из-за этой процедуры в SObjectizer-е скорость добавления и удаления акторов оказывается сильно (в несколько раз) ниже, чем в других акторных фреймворках. Объясняется это двумя основными причинами:


  • во-первых, в SObjectizer-е кооперации являются именованными сущностями, поэтому приходится поддерживать словарь имен и проверять уникальность имени с его помощью (а так же обновлять этот словарь, который является разделяемым между рабочими нитями ресурсом);
  • во-вторых, в SObjectizer-е регистрация кооперации транзакционная операция, поэтому нужно заботиться о том, чтобы при невозможности выделить ресурсы под i-го актора из кооперации, был произведен возврат ресурсов, выделенных под предыдущих акторов.

Плюс к тому, каждому актору при регистрации/дерегистрации отсылаются специальные уведомления, посредством которых отрабатывают методы so_evt_start и so_evt_finish (и без которых некоторые типы акторов сложно реализовать).


Так что при регистрации акторов SObjectizer-у приходится делать несколько больше, чем другим фреймворкам, отсюда и более высокие накладные расходы.


В состав SObjectizer-а входят два бенчмарка, которые позволяют оценить "масштаб бедствия": первый и второй (второй сделан по мотивам вот этого флешмоба). У меня на стареньком i7 2.0GHz, Ubuntu 16.04 и GCC 8.1 первый бенчмарк с 100K коопераций по 20 акторов в каждой показывает результат:


Configuration: coops: 100000, agents_per_coop: 20, disp: one_thread
registrations: 100000, total_time: 4.09s
price: 4.09e-05s
throughtput: 24449.87775 registrations/s
pings: 2000000, total_time: 0.421s
price: 2.105e-07s
throughtput: 4750593.824 pings/s
ping-pongs: 2000000, total_time: 0.861s
price: 4.305e-07s
throughtput: 2322880.372 ping-pongs/s
deregistrations: 100001, total_time: 2.347s
price: 2.34697653e-05s
throughtput: 42608.01023 deregistrations/s

Т.е. регистрация чуть меньше 24.5K коопераций в секунду, дерегистрация порядка 42.5K коопераций в секунду.


А бенчмарк skynet1m там же дает результат в 4900ms.


Показатели не очень высокие. Но, во-первых, в SObjectizer-е транзакционность регистрации группы агентов доступна разработчику сразу. Если делать это же самое вручную, то это и увеличение трудозатрат на разработку, и вероятность ошибок, и скорость регистрации группы все равно просядет по сравнению со скоростью регистрации отдельного актора.


Во-вторых, мы не смогли найти способ "дешево" увеличить скорость регистрации/дерегистрации без изменения API SObjectizer-а. При этом стабильность API и совместимость между версиями в рамках ветки 5.5 была "идей фикс". Но сейчас уже началась работа над SObjectizer-5.6, в которой совместимость с 5.5 будет поломана. И мы надеемся, если для этого найдутся время и ресурсы, улучшить показатели скорости регистрации/дерегистрации коопераций. В частности, есть идея анонимных коопераций (т.е. коопераций без имен вообще), при работе с которыми не нужно будет задействовать общий словарь, который и является узким местом сейчас.

Sign up to leave a comment.

Articles