对不起,我是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接收。(如果我犯了任何错误,请纠正我)
以下是关于我的压力测试的信息:
- 使用以下命令启动Erlang服务器:erl+zdbl 2097151-K true+A 128+P
- 5000000将5000个客户端连接到Erlang服务器,每个客户端连接
- 客户端在所有
- 连接完成(即,每分钟仅执行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服务器,它可以支持大量连接,并保持低内存占用率。