9

私は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 受信が原因であると結論付けます。(間違っていたら訂正してください)

私のストレステストに関する情報は次のとおりです。

  1. 次のように Erlang サーバーを起動します: erl +zdbbl 2097151 -K true +A 128 +P
  2. 5000000 connect 5000 クライアントを Erlang サーバーにそれぞれ接続
  3. クライアントはサーバーに 1 分ごとに 2 バイトのデータを送信します。
  4. 接続が完了します (つまり、1 分あたり 2 バイトのデータのみが実行されます)、CPU は ~30%sy にバーストします (「トップ」から)

Erlang サーバーに Amazon Linux AMI (ラージ インスタンス、64 ビット) を使用しています。バーストはLinuxが原因ですか?システムがどのようにCPUを使い果たすかわかりません。それとも私の貧弱なコードの問題ですか?(そう信じる...)

実際の状況では、私たちのサーバーはピンポンだけでなく、より多くの負荷がかかるメッセージも受信します...これは最初のステップにすぎません...

私を救ってくれる人に何百万という感謝を。

アニタ~*

~~~~~~~~~~~~~~~~~~~~~~~

大規模インスタンスに関する情報 (参考):

  • 7.5GBのメモリ
  • 4 つの EC2 コンピューティング ユニット (それぞれ 2 つの EC2 コンピューティング ユニットを備えた 2 つの仮想コア)
  • 850 GB のインスタンス ストレージ
  • 64 ビット プラットフォーム
  • I/O パフォーマンス: 高
4

1 に答える 1

2

OTP の原則を使用した非ブロッキング TCP サーバーの構築に関するこの記事は、興味深い読み物になるかもしれません。また、 Cowboyが使用するErlang HTTP サーバーであるRanchを見ることもできます。これは、メモリ フットプリントを抑えながら非常に多数の接続をサポートできます。

于 2012-10-11T05:34:16.743 に答える