gen_tcp接收到极高的CPU



对不起,我是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+zdbl 2097151-K true+A 128+P
  2. 5000000将5000个客户端连接到Erlang服务器,每个客户端连接
  3. 客户端在所有
  4. 连接完成(即,每分钟仅执行2字节的数据),CPU突发至约30%sy(从"顶部"开始)

我正在为Erlang服务器使用AmazonLinuxAMI(大型实例,64位)。爆裂是由于linux造成的吗?因为我不知道系统将如何耗尽CPU。或者是我糟糕的代码问题?(我相信是的…)

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

感谢所有能救我的人。

Anita ~*

~~~~~~

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

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

这篇关于使用OTP原理构建非阻塞TCP服务器的文章对您来说可能是一篇有趣的读物。您还可以看看Cowboy使用的Ranch——Erlang HTTP服务器,它可以支持大量连接,并保持低内存占用率。

最新更新