3

Erlang VM には、プロセスごとに受信したメッセージのカウンターがありますか? ワーカーのメッセージ レートを計算する必要があります。

そうでない場合、コード内のメッセージ レートをどのように測定して計算しますか?

4

3 に答える 3

3

以下を使用できます。

erlang:process_info(Pid, message_queue_len)

次のような結果が得られます。

{message_queue_len, Number}

しかし、これはあなたが探しているものではないかもしれません。

OTPを使用している場合は、@Pascalが言ったようにオブザーバーを使用できます。または、カウンターを状態に保ち、呼び出し、情報、またはキャストを処理するたびに更新できます。

于 2013-03-27T08:55:47.527 に答える
2

プロセスが完全に OTP に準拠している場合 (たとえば、gen_server、gen_event、gen_fsm) sys:statistics/2,3、messages_in/messages_out レートを追跡するために使用できます。ドキュメントから収集したものから、Flag = true で呼び出し、しばらく待ってから、Flag = get で再度呼び出します (Flag = false で再度呼び出す必要があるかどうかはわかりません)。

そうは言っても、OTP 準拠なしで行うのは比較的簡単です。Nミリ秒後にプロセスにメッセージを送信するようにタイマーを設定し(erlang:start_timerタイマーモジュールをお勧めします)、受信したメッセージの数をカウントします。タイマーからメッセージを受信したら、カウントを N で割ってミリ秒あたりのレートを求めます (1 秒あたりのレートを表すには 1000 を掛けます)。すすいで繰り返します。

たとえば、コールバック モジュールから、またはさまざまなメッセージを処理する受信ブロック ベースのプロセスでこれを行う場合 (この場合はとにかくコールバック形式に変換する必要があります)、これは少し面倒です。あまりお勧めしません。したがって、OTP プロセスを使用している場合は、正気を保つために sys モジュールを使用してください。

于 2013-03-28T15:09:36.363 に答える
0

OTP アプリケーションを作成した場合は、observer アプリケーションを使用できると思います。

OTP アプリケーションを実行している VM でobserver:start() を実行するだけで確認できます。

于 2013-03-27T09:44:33.547 に答える