2013-03-27 64 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模塊。