【发布时间】:2012-11-21 12:10:09
【问题描述】:
我有一个需要优化的遗留 Erlang 程序。这段代码在运行时最多使用 20G 内存。我想知道是否有办法在运行时获取进程本身的 Erlang Beam 大小?如果这是可能的,那么我可以做一些事情,比如如果光束大小>10GB,然后拒绝所有对 gen_server 进程的调用。感谢您的帮助!
【问题讨论】:
标签: erlang gen-server beam
我有一个需要优化的遗留 Erlang 程序。这段代码在运行时最多使用 20G 内存。我想知道是否有办法在运行时获取进程本身的 Erlang Beam 大小?如果这是可能的,那么我可以做一些事情,比如如果光束大小>10GB,然后拒绝所有对 gen_server 进程的调用。感谢您的帮助!
【问题讨论】:
标签: erlang gen-server beam
只需从 shell 调用 memory() 开始,以了解它是否在二进制文件、ets、进程等内存中被保留。接下来,如果某个进程是罪魁祸首,您可以要求etop 之类的工具为您提供使用最多内存的进程。这通常可以找出问题所在。
如果问题是 ETS 或二进制文件,那么由于其中包含子二进制指针,您可能会长时间保留某些大型二进制文件。这需要 GC 调整来解决。
【讨论】:
也许你可以使用一些 proces_info 数据:
{内存,大小}: Size 是进程的字节大小。这包括调用 堆栈、堆和内部结构。
process_info(self(), memory).
{memory,17128}
【讨论】: