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 合规性,它相对容易做到。设置一个计时器(我建议erlang:start_timer在计时器模块上)在 N 毫秒后向您的进程发送一条消息,并计算您收到的消息数量。当您收到来自计时器的消息时,将计数除以 N 得到每毫秒的速率(乘以 1000 得到每秒的速率)。冲洗并重复。

如果您从回调模块执行此操作,或者使用处理各种消息的基于接收块的进程(在这种情况下无论如何都应该将其转换为回调形式),这会变得有点乏味,所以我不完全推荐它。因此,如果您正在使用 OTP 流程,请使用 sys 模块以确保您的理智。

于 2013-03-28T15:09:36.363 回答
0

如果您已经构建了 OTP 应用程序,那么我想您可以使用观察者应用程序。

只需在执行 OTP 应用程序的 VM 中运行 observer:start() 即可查看。

于 2013-03-27T09:44:33.547 回答