9

抱歉,我是 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接收。(如果我犯了任何错误,请纠正我)

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

  1. 启动 Erlang 服务器: erl +zdbbl 2097151 -K true +A 128 +P
  2. 5000000 将 5000 个客户端连接到每个连接的 Erlang 服务器
  3. 客户端每 1 分钟向服务器发送一个 2 字节的数据。
  4. 连接完成,(即每分钟只执行 2 个字节的数据),CPU 突发到 ~30%sy(从“顶部”)

我正在为 Erlang 服务器使用 Amazon Linux AMI(大型实例,64 位)。爆裂是因为linux吗?因为我不知道系统将如何用完 CPU。或者是我糟糕的代码的问题?(我相信是这样...)

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

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

安妮塔~*

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

大实例信息(供参考):

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

1 回答 1

2

这篇关于使用 OTP 原则构建非阻塞 TCP 服务器的文章可能会让您感兴趣。您还可以看看Cowboy使用的Ranch,它是Erlang HTTP 服务器,它可以支持大量连接,保持低内存占用。

于 2012-10-11T05:34:16.743 回答