erlang gen_server с большим состоянием

У меня есть три (реализовано с помощью кортежей и списков) с несколькими тысячами записей, и я хотел бы поддерживать одновременное чтение. Объем памяти данных находится в диапазоне 10-20 МБ. Три строится один раз и только после этого читается.

Каков рекомендуемый способ поддерживать состояние и предоставлять клиентам одновременный доступ?

Вот что я попробовал:

1) Создан сервер gen_server с три в качестве состояния. Это работало нормально, но, очевидно, все звонки были сериализованы.

2) Изменено (1), чтобы порождать новый процесс для каждого вызова, который принимает состояние, запрос и From, Каждый новый процесс проходил через дерево и вызывал gen_server:reply/2 с результатом. Это решение, похоже, не сработало, потому что использование памяти и процессора возросло. Я предполагаю, что это произошло, потому что состояние было скопировано в порожденный процесс для каждого вызова.

3 ответа

Решение

mochiglobal от mochiweb разработан именно для такого случая использования. По сути, он возьмет вашу структуру данных и скомпилирует ее в модуль, чтобы данные были общими (нулевая копия для констант модуля). Хорошо работает только со структурами данных, которые не часто меняются, но, похоже, это то, что у вас есть.

Если ваше состояние меняется, часто используйте вашу модель / структуру вместо ETS.

Вы можете создать таблицу ETS с одновременными параметрами чтения / записи, которые повысят производительность.

Другой подход - создать пул gen_servers (с контролем), а затем распределить входящие соединения на сервер в пуле. Это устраняет узкое место gen_server, связанное с вашим первым подходом. Этот подход также позволяет выполнить некоторую настройку путем корректировки количества процессов в пуле. LearnYouSomeErlang имеет главу по этому вопросу.

Другие вопросы по тегам