gen_tcp接收极高的CPU

时间:2012-10-11 03:48:12

标签: 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个小时(以防止它调用receive),CPU根本没有爆发。 因此我得出结论,CPU的突发是由于TCP接收造成的。 (如果我犯了任何错误,请纠正我)

以下是有关压力测试的信息:

  1. 启动Erlang服务器:erl + zdbbl 2097151 -K true + A 128 + P
  2. 5000000将5000个客户端连接到每个连接的Erlang服务器
  3. 客户端在所有
  4. 之后每1分钟向服务器发送一个2字节的数据
  5. 连接已完成,(即每分钟仅执行2字节数据),CPU突发至~30%sy(来自“top”)
  6. 我正在为Erlang服务器使用Amazon Linux AMI(大型实例,64位)。是由于Linux的爆发?因为我不知道系统将如何耗尽CPU。或者这是我糟糕的代码问题? (我相信......)

    在实际情况中,我们的服务器不仅接收乒乓球,还接收消息,这是更多的负载......这只是第一步......

    数百万的感谢任何能救我的人。

    阿妮塔〜*

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

    有关大型实例的信息(供参考):

    • 7.5 GB内存
    • 4个EC2计算单元(2个虚拟核心,每个2个EC2计算单元)
    • 850 GB实例存储
    • 64位平台
    • I / O性能:高

1 个答案:

答案 0 :(得分:1)

关于Building a non-blocking TCP server using OTP principles的这篇文章对您来说可能是一本有趣的读物。您还可以查看Ranch Cowboy使用的{{3}} Erlang HTTP服务器,它可以支持大量连接,从而保持较低的内存占用。