首页 > 解决方案 > 提高 erlang 牛仔性能

问题描述

我们一直在 GCP 上的 Compute Engine 机器上使用 Cowboy 进行生产,我们开始进行基准测试并改进我们的服务性能以处理更多的请求/秒(在我们的例子中,因为我们在 Adtech,它是出价/秒)。

在单独隔离和处理了很多问题之后,我们归结为 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

虚拟机参数:-smp auto +P 134217727 +K true +A 64 -rate 1200 +stbt db +scl false +sfwi 500 +spp true +zdbbl 8092

加载

Json 请求大小约为 4KB。并且使用 jmeter 在同一内部网络(无 SSL)上使用单独的机器进行测试。所有请求都是 POST 并保持活动状态

服务器

GCP Compute Engine 10 个 vcpu 内核和 14GB RAM(现在和之前使用 4 个 vcpu 测试过)

发现

我们能够达到 ~1900 reqs/sec,但 htop 中的所有 CPU 内核都显示出近 80% 的利用率

在 1000 个请求/秒时,我们将 cpu 利用率设置为每核 45-50%(仍然很高,请记住我们的应用程序没有其他部分正在运行)

*注意:使用 4 vcpu 机器,我们能够获得接近 700 个请求/秒,并且在我们所有的测试中内存几乎没有被利用或随着负载而变化


问题:如何提高牛仔在cpu使用方面的表现?

标签: performanceerlangwebservercowboy

解决方案


首先,感谢@Pouriya 的建议——实际上,来回讨论这个问题让我回过头来重新检查我对适合这项工作的工具的评论。PS:我们在 GCP 上,所以在这个阶段 72 个核心是不可能的。

牛仔很棒!但它确实在每个请求的关键路径中增加了一些开销——一个不需要的特性(或在我的情况下的问题)。

我们再次使用 Elli ( https://github.com/elli-lib/elli ) 进行了测试,但这次建立了正确的测试设置,它提供了高达 20% 的改进——这正是我们所需要的!

如果 Cowboy/Ranch 团队中的任何人有办法大幅提高 CPU 开销,他们会很乐意进行测试,因为我们仍然在我们的 API 中使用它,但不是关键路径。


推荐阅读