【问题标题】:Getting the total message queue size in Erlang/Elixir获取 Erlang/Elixir 中的总消息队列大小
【发布时间】:2018-02-02 14:13:09
【问题描述】:

我正在为 Elixir 应用构建一些监控,并希望跟踪进程的消息队列的总长度 - 如果它们超过任何合理的值,则意味着系统没有跟上。

如何在现实系统中进行查询? :erlang.system_info/1 似乎没有提供它,您只能从 :erlang.process_info/1 获取每个进程的信息。我不喜欢使用后者并手动聚合消息队列长度的想法,因为可能有数千个相关的 GenServer 进程,并且检测它们感觉像是不必要的开销。

我似乎记得Wombat OAM 有这个功能,这让我觉得这是可能的,但我可能弄错了。

【问题讨论】:

    标签: erlang elixir


    【解决方案1】:

    在 Erlang 中:

    所有信息::erlang.process_info(self())

    只是消息队列长度::erlang.process_info(self(), :message_queue_len)# => {:message_queue_len, 2}

    只是消息::erlang.process_info(self(), :messages) #=> {:messages, [:hello, :world]}


    在灵药中:

    所有信息:Process.info(self())

    只是消息队列长度:Process.info(self(), :message_queue_len)

    只是消息:Process.info(self(), :messages)

    两者都给出相同的输出,其中包括

    【讨论】:

    • 这不是我要找的——我什至提到了你建议我使用的功能。我正在寻找一种方法来获取系统中所有进程的消息队列长度总和,而不是每个进程。
    【解决方案2】:

    对于 Erlang,我建议您使用 recon

    在 Elixir 中,有一个包装器:tap

    我还建议阅读 Stuff Goes Bad Erlang in Anger

    【讨论】:

    • 我可能遗漏了一些东西,但我认为 recon 也不提供该功能,并且 tap 只是侦察跟踪的包装器,我认为这与该问题无关。我还没有机会阅读“Stuff Goes Bad - Erlang in Anger”一书,我很快就会看到它添加了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2011-08-06
    • 2013-07-15
    • 2017-04-22
    • 1970-01-01
    • 2013-05-17
    相关资源
    最近更新 更多