web-services - gen_tcp获得极高的CPU

标签 web-services erlang cpu recv gen-tcp

抱歉,我是Erlang新手,可能会提出愚蠢的问题。但请帮助我解决问题。

我已经编写了一个Erlang服务器,用Node.js替换了我正在使用的服务器,这耗尽了我的所有内存,我在祈祷Erlang可以成为一种出路。
该服务器在单元测试和内部测试下都可以正常工作,但是在压力测试中面临很高的CPU使用率。

精简后,我发现CPU突发是由于来自客户端的TCP接收所致。

receiveClientPacket(Sock) ->
  inet:setopts(Sock, [{active, once}, {buffer, ?CLIENTHEARTBEATSIZE}]),
  receive
    {tcp, Sock, Data} ->
      {ok, Data};
    {tcp_closed, Sock} ->
      {error, closed}
    after ?CLIENTRECCEIVETIMEOUT ->
      {error, timeout}
  end.

我在函数开始时尝试使进程休眠10个小时(以防止它调用接收),CPU根本没有爆裂。
因此,我得出的结论是CPU突发是由于TCP接收引起的。 (如果我有任何错误,请纠正我)

以下是有关我的压力测试的信息:
  • 使用以下命令启动Erlang服务器:erl + zdbbl 2097151 -K true + A 128 + P
  • 5000000将5000个客户端连接到Erlang服务器,每个已连接
  • 在所有之后,
  • 客户端每1分钟向服务器发送2字节数据
  • 连接完成(即每分钟仅执行2个字节的数据),CPU突发到〜30%sy(从“顶部”开始)

  • 我正在为Erlang服务器使用Amazon Linux AMI(大型实例,64位)。爆发是由于linux造成的吗?由于我不知道系统将如何用尽CPU。还是我的可怜代码的问题? (我相信是这样...)

    在实际情况下,我们的服务器不仅会收到乒乓球,还会收到消息,这会增加很多负载……这只是第一步……

    数以百万计的感谢任何可以拯救我的人。

    安妮塔〜*

    ~~~~~~~~~~~~~~~~~~~~~~~

    有关大型实例的信息(供引用):
  • 7.5 GB内存
  • 4个EC2计算单元(2个虚拟内核,每个虚拟内核具有2个EC2计算单元)
  • 850 GB实例存储
  • 64位平台
  • I/O性能:高
  • 最佳答案

    关于Building a non-blocking TCP server using OTP principles的这篇文章可能对您来说很有趣。您还可以看一下Erlang HTTP服务器Ranch使用的Cowboy,它可以支持大量连接,而占用的内存很少。

    关于web-services - gen_tcp获得极高的CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12831898/

    相关文章:

    c# - 在 c# 中使用 python webservice 时遇到问题

    c# - 网络服务中的其他方法未显示

    erlang - 从两个进程访问套接字

    linux - 有没有对应CLOCK_PROCESS_CPUTIME_ID的寄存器?

    java - 为什么 Apache commons-math 的 Fraction 基于 int 类型?

    python - azure ml 实验返回与 webservice 不同的结果

    web-services - Sharepoint Web 服务 : How to get permissions for a Document Library for the current user programmatically

    erlang - 使用 erlang.mk 指定应用程序启动顺序

    erlang - Erlang 中缺少可变参数的解决方法

    C语言转MIPS。斐波那契数