Улучшить производительность ковбоя Erlang - PullRequest
0 голосов
/ 07 декабря 2018

Мы использовали Cowboy в производстве на наших компьютерах Compute Engine на GCP, и мы начали сравнивать и улучшать производительность нашего сервиса для обработки большего количества запросов / сек (в нашем случае, поскольку мы в Adtech, это ставки в секунду).

После выделения и решения многих проблем по отдельности мы подошли к оптимизации Cowboy, вот наши текущие выводы и ограничения:

Настройка 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}.

Erlang VM

OTP 21

VM args: -smp auto + P 134217727 + K true + A 64 -rate1200 + stbt db + scl false + sfwi 500 + spp true + zdbbl 8092

Load

Json запрашивает размер ~ 4 КБ.И тестирование проводится с использованием отдельной машины в той же внутренней сети (без SSL) с использованием jmeter.Все запросы выполняются по протоколу POST с поддержкой активности

Серверы

GCP Compute Engine 10 ядер vcpu и 14 ГБ ОЗУ (сейчас и ранее тестировались с 4 vcpu)

Выводы

Мы можем достичь ~ 1900 запросов / сек, но все ядра процессора в htop показывают почти 80% -ую загрузку

При 1000 рек / сек мы устанавливаем загрузку процессора на 45-50% на ядро ​​(все ещевысокая, учитывая, что никакая другая часть нашего приложения не работает)

* Примечание: используя машину 4 vcpu, мы смогли получить почти 700 запросов / сек, а память во всех наших тестах почти не используется илименяется с нагрузкой


ВОПРОС: Как улучшить производительность ковбоя с точки зрения использования процессора?

1 Ответ

0 голосов
/ 09 декабря 2018

Прежде всего, спасибо @Pouriya за предложения - на самом деле, обсуждение этого вопроса заставило меня вернуться и еще раз проверить один из моих комментариев о правильном инструменте для работы.PS: мы находимся на GCP, так что 72 ядра не обсуждались бы на данном этапе.

Ковбой великолепен!но это добавляет немного накладных расходов в критическом пути каждого запроса - функция (или проблема в моем случае), которая не нужна.

Мы снова протестировали с Элли (https://github.com/elli-lib/elli), но на этот раз создали правильную настройку тестирования, и это дало улучшение до 20% - именно то, что нам было нужно!

Если кто-то в Cowboy/ У команды Ranch есть способ радикально снизить нагрузку на процессор, и мы с удовольствием протестируем ее, поскольку мы все еще используем ее в наших API, но не на критическом пути.

...