抱歉,我是 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 服务器: erl +zdbbl 2097151 -K true +A 128 +P
- 5000000 将 5000 个客户端连接到每个连接的 Erlang 服务器
- 客户端每 1 分钟向服务器发送一个 2 字节的数据。
- 连接完成,(即每分钟只执行 2 个字节的数据),CPU 突发到 ~30%sy(从“顶部”)
我正在为 Erlang 服务器使用 Amazon Linux AMI(大型实例,64 位)。爆裂是因为linux吗?因为我不知道系统将如何用完 CPU。或者是我糟糕的代码的问题?(我相信是这样...)
在实际情况下,我们的服务器不仅可以接收乒乓球,还可以接收消息,这需要更多的负载……这只是第一步……
数以百万计的感谢任何可以拯救我的人。
安妮塔~*
~~~~~~~~~~~~~~~~~~~~~~~
大实例信息(供参考):
- 7.5 GB 内存
- 4 个 EC2 计算单元(2 个虚拟内核,每个内核有 2 个 EC2 计算单元)
- 850 GB 实例存储
- 64位平台
- I/O 性能:高