2013-03-27 58 views
2

Erlang VM中是否有计数器用于接收每个进程的消息? 我需要计算一个工人的消息速率。Erlang进程的消息接收率

如果不是,您将如何测量和计算代码中的消息速率?

回答

2

您可以使用:

erlang:process_info(Pid, message_queue_len) 

,你会得到这样的结果:

{message_queue_len, Number} 

,但也许这是不是你在找什么。

如果您正在使用OTP,您可以使用观察者@Pascal说,或者你可以保留一个计数器的状态,并在每次处理呼叫,信息或施法时间更新。

+0

如果吞吐量很高,则长消息队列是okey。我试图找出消息在队列中停留的时间。 – Flinkman 2013-03-28 07:02:28

+0

然后我相信这可能是有用的http://stackoverflow.com/questions/4281251/getting-the-time-of-the-received-message – user601836 2013-03-28 08:55:21

0

如果你已经建立了一个OTP应用程序,那么我想你可以使用控制器的应用。

只需运行观察员:开始()在虚拟机中运行的OTP应用去看看。

1

如果您的进程完全符合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模块。