私はErlangの初心者で、ばかげた質問をするかもしれません。しかし、問題を解決するのを手伝ってください。
私は、使用しているノードを Node.js に置き換えるために Erlang サーバーを作成しました。これにより、すべてのメモリが消費されました。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 connect 5000 クライアントを Erlang サーバーにそれぞれ接続
- クライアントはサーバーに 1 分ごとに 2 バイトのデータを送信します。
- 接続が完了します (つまり、1 分あたり 2 バイトのデータのみが実行されます)、CPU は ~30%sy にバーストします (「トップ」から)
Erlang サーバーに Amazon Linux AMI (ラージ インスタンス、64 ビット) を使用しています。バーストはLinuxが原因ですか?システムがどのようにCPUを使い果たすかわかりません。それとも私の貧弱なコードの問題ですか?(そう信じる...)
実際の状況では、私たちのサーバーはピンポンだけでなく、より多くの負荷がかかるメッセージも受信します...これは最初のステップにすぎません...
私を救ってくれる人に何百万という感謝を。
アニタ~*
~~~~~~~~~~~~~~~~~~~~~~~
大規模インスタンスに関する情報 (参考):
- 7.5GBのメモリ
- 4 つの EC2 コンピューティング ユニット (それぞれ 2 つの EC2 コンピューティング ユニットを備えた 2 つの仮想コア)
- 850 GB のインスタンス ストレージ
- 64 ビット プラットフォーム
- I/O パフォーマンス: 高