Улучшить производительность ковбоя 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, но не на критическом пути.

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