抱歉,我是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服务器使用Amazon Linux AMI(大型实例,64位)。爆发是由于linux造成的吗?由于我不知道系统将如何用尽CPU。还是我的可怜代码的问题? (我相信是这样...)
在实际情况下,我们的服务器不仅会收到乒乓球,还会收到消息,这会增加很多负载……这只是第一步……
数以百万计的感谢任何可以拯救我的人。
安妮塔〜*
~~~~~~~~~~~~~~~~~~~~~~~
有关大型实例的信息(供引用):
最佳答案
关于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/