Есть большое количество входящих запросов (на данный момент 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 |
Выводы:
- Скорость записи данных почти не зависит от количества собирающих процессов/ets-таблиц
- Собирать данные в ets-таблицах быстрее, чем в состоянии процессов.
- Похоже что в данном тесте скорость упиралась в скорость генерирования данных – скорость работы катастрофически падала, когда количество активных процессов превышало количество физических ядер процессора.