30 апр. 2012 г.

Как копить данные в erlang

Задача:
Есть большое количество входящих запросов (на данный момент 1000/секунду, потом больше). Нужно накапливать данные несколько секунд, затем данные обрабатываются и лишние данные удаляются.

Я вижу два подхода:
1. Накапливать данные в ets-таблицах
2. Накапливать данные в состоянии процессов

Я сделал реализацию обоих методов и сравниваю производительность и масштабируемость в рамках одного экземпляра виртуальной машины erlang.

Исходник

Формат именования колонок: type/generator-count/collector-count
type - тип сбора данных: ets - таблица ets, proc - сбор данных в состоянии процесса
generator-count - количество процессов, генерирующих данные
collector-count - количество таблиц/процессов, собирающих данные

Каждый тест проводился 3 раза, выбирался лучший результат Результаты тестирования:

Система ets/1/1 ets/2/2 ets/1/10 ets/1/100 ets/10/1 ets/10/10 ets/100/10 proc/1/1 proc/2/2 proc/1/10 proc/1/100 proc/10/1 proc/10/10 proc/100/10
MacBookPro IntelCore i5 2.4GHz 524783 564207 474355 481256 89928 89145 98592 304000 158200 278200 201200 57000 79800 80600

Выводы:

  1. Скорость записи данных почти не зависит от количества собирающих процессов/ets-таблиц
  2. Собирать данные в ets-таблицах быстрее, чем в состоянии процессов.
  3. Похоже что в данном тесте скорость упиралась в скорость генерирования данных - скорость работы катастрофически падала, когда количество активных процессов превышало количество физических ядер процессора.


Комментариев нет:

Отправить комментарий