Улучшить производительность ковбоя Erlang
Мы использовали Cowboy в производстве на наших компьютерах Compute Engine на GCP, и мы начали сравнивать и улучшать производительность нашего сервиса, чтобы обрабатывать больше запросов / сек (в нашем случае, поскольку мы находимся в Adtech, это bids/sec).
После выделения и решения многих проблем по отдельности мы перешли к оптимизации Cowboy, вот наши текущие выводы и ограничения:
Настройка ковбоя
Мы используем Cowboy 2.5 с 200 акцепторами и максимальным отставанием 1024
init(Req, _State) ->
T1 = erlang:monotonic_time(),
{ok, BRjson, _} = cowboy_req:read_body(Req),
%% ---- rest of work goes here but is switched off for our test---
erlang:send_after(60, self(), {'RSP', x, no_workers}),
{cowboy_loop, Req, #state{t1 = T1}, hibernate}.
Эрланг В.М.
ОТП 21
VM args: -smp auto + P 134217727 + K true + A 64 -рейт 1200 +stbt db +scl false +sfwi 500 +spp true +zdbbl 8092
нагрузка
Json запрашивает размер ~4 КБ. А тестирование проводится с использованием отдельной машины в той же внутренней сети (без SSL) с использованием jmeter. Все запросы POST с keep-alive
Серверы
GCP Compute Engine 10 ядер vcpu и 14 ГБ оперативной памяти (сейчас и ранее тестировались с 4 vcpu)
Выводы
Мы можем достичь ~1900 запросов / сек, но все ядра CPU в htop показывают почти 80% использования
При 1000 рек / сек мы используем процессор на уровне 45-50% на ядро (все еще высокий уровень, учитывая, что ни одна другая часть нашего приложения не работает)
* Примечание: используя машину 4 vcpu, мы смогли получить около 700 запросов / сек, и память во всех наших тестах практически не используется или изменяется с нагрузкой
ВОПРОС: Как улучшить производительность ковбоя с точки зрения использования процессора?
1 ответ
Прежде всего, спасибо @Pouriya за предложения - на самом деле, обсуждение этого вопроса заставило меня вернуться и еще раз проверить один из моих комментариев о правильном инструменте для работы. PS: мы находимся в GCP, так что 72 ядра не обсуждались бы на данном этапе.
Ковбой это здорово! но это добавляет немного накладных расходов в критическом пути каждого запроса - функция (или проблема в моем случае), которая не нужна.
Мы снова провели тестирование с помощью Elli ( https://github.com/elli-lib/elli), но на этот раз создали правильную настройку тестирования, которая дала улучшение до 20% - именно то, что нам было нужно!
Если у кого-то из команды Cowboy/Ranch есть способ радикально улучшить нагрузку на процессор, мы с удовольствием протестируем, поскольку мы все еще используем его в наших API, но не на критическом пути.