Мы использовали 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 запросов / сек, а память во всех наших тестах почти не используется илименяется с нагрузкой
ВОПРОС: Как улучшить производительность ковбоя с точки зрения использования процессора?