Erlang VM には、プロセスごとに受信したメッセージのカウンターがありますか? ワーカーのメッセージ レートを計算する必要があります。
そうでない場合、コード内のメッセージ レートをどのように測定して計算しますか?
Erlang VM には、プロセスごとに受信したメッセージのカウンターがありますか? ワーカーのメッセージ レートを計算する必要があります。
そうでない場合、コード内のメッセージ レートをどのように測定して計算しますか?
以下を使用できます。
erlang:process_info(Pid, message_queue_len)
次のような結果が得られます。
{message_queue_len, Number}
しかし、これはあなたが探しているものではないかもしれません。
OTPを使用している場合は、@Pascalが言ったようにオブザーバーを使用できます。または、カウンターを状態に保ち、呼び出し、情報、またはキャストを処理するたびに更新できます。
プロセスが完全に 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 モジュールを使用してください。
OTP アプリケーションを作成した場合は、observer アプリケーションを使用できると思います。
OTP アプリケーションを実行している VM でobserver:start() を実行するだけで確認できます。