查看源代码 memsup (os_mon v2.10.1)

一个内存监控进程

memsup 是一个监控系统和单个进程内存使用情况的进程。它是 OS_Mon 应用程序的一部分,请参阅 os_mon。适用于 Unix 和 Windows。

定期执行内存检查

  • 如果分配的可用系统内存量超过一定值(由底层操作系统报告),则会设置警报 {system_memory_high_watermark, []}。可用内存量的确定方式取决于底层操作系统,并且可能会随着更好的值可用而改变。
  • 如果系统中的任何 Erlang 进程 Pid 分配的总系统内存量超过一定值,则会设置警报 {process_memory_high_watermark, Pid}

警报会报告给 SASL 警报处理程序,请参阅 alarm_handler。要设置警报,会调用 alarm_handler:set_alarm(Alarm),其中 Alarm 是上面指定的任何警报。

当警报原因不再有效时,警报会自动清除。

函数 get_memory_data() 可用于检索最新一次定期内存检查的结果。

还有一个与系统相关的内存数据接口,get_system_memory_data()。结果高度依赖于底层操作系统,该接口主要针对没有虚拟内存的系统。但是,其他系统上的输出仍然有效,尽管很稀疏。

调用 get_system_memory_data/0 比调用 get_memory_data/0 的成本更高,因为数据是在调用此函数时同步收集的。

在 UNIX 系统下报告的总系统内存是物理内存页数乘以页面大小,可用内存是可用物理页数乘以页面大小。这是一种合理的衡量标准,因为无论如何都应该避免交换,但由于虚拟内存和交换,定义总内存和可用内存的任务很困难。

配置

以下配置参数可用于更改时间间隔和阈值的默认值

  • memory_check_interval = int()>0 - 定期内存检查的时间间隔,以分钟为单位。默认值是一分钟。

  • system_memory_high_watermark = float() - 在设置相应警报之前,可以分配的系统内存阈值,以系统内存的百分比表示。默认值为 0.80(80%)。

  • process_memory_high_watermark = float() - 在设置相应警报之前,一个 Erlang 进程可以分配的系统内存阈值,以系统内存的百分比表示。默认值为 0.05(5%)。

  • memsup_helper_timeout = int()>0 - memsup 进程等待内存检查结果的超时时间,以秒为单位。如果超时时间到期,则会通过 error_logger 发出警告消息 "OS_MON (memsup) timeout",并且任何挂起的同步客户端调用都会返回虚拟值。通常情况下,不应该发生这种情况。但是,在 Linux 上,当系统负载很高时,从中读取系统数据的伪文件有时会暂时不可用。

    默认值为 30 秒。

  • memsup_system_only = bool() - 指定 memsup 进程是否应仅检查系统内存使用情况 (true)。默认值为 false,这意味着收集有关系统内存使用情况和 Erlang 进程内存使用情况的信息。

    建议在具有大量并发进程的系统上将此参数设置为 false,因为每次进程内存检查都会遍历整个进程列表。

有关如何更改配置参数值的信息,请参阅 config

另请参阅

alarm_handler, os_mon

摘要

函数

返回定期内存检查的时间间隔,以毫秒为单位。

返回内存检查的超时值,以秒为单位。

返回最新内存检查的结果,其中 Total 是总内存大小,Allocated 是已分配的内存大小,以字节为单位。

返回当前运行的操作系统字长。

返回进程内存分配的阈值,以百分比表示。

返回系统内存分配的阈值,以百分比表示。

调用内存检查并返回结果,系统相关的数据作为标记的元组列表,其中 Tag 目前可以是以下之一

更改定期内存检查的时间间隔,以分钟为单位。

更改内存检查的超时值,以秒为单位。

更改进程内存分配的阈值,以浮点数形式给出。

更改系统内存分配的阈值,以浮点数形式给出。

函数

-spec get_check_interval() -> Milliseconds :: integer().

返回定期内存检查的时间间隔,以毫秒为单位。

-spec get_helper_timeout() -> Seconds :: integer().

返回内存检查的超时值,以秒为单位。

-spec get_memory_data() -> {Total, Allocated, Worst}
                         when
                             Total :: integer(),
                             Allocated :: integer(),
                             Worst :: {Pid, PidAllocated} | undefined,
                             Pid :: pid(),
                             PidAllocated :: integer().

返回最新内存检查的结果,其中 Total 是总内存大小,Allocated 是已分配的内存大小,以字节为单位。

Worst 是节点上最大 Erlang 进程的 pid 和分配的字节数。如果 memsup 不应收集进程数据,也就是说,如果配置参数 memsup_system_only 设置为 true,则 Worstundefined

该函数通常是异步的,因为它不会调用内存检查,而是返回最新的可用值。如果该函数在第一次内存检查完成之前被调用,则会有一个例外,在这种情况下,它不会返回值,直到内存检查完成为止。

如果 memsup 不可用,或者到目前为止所有内存检查都已超时,则返回 {0,0,{pid(),0}}{0,0,undefined}

-spec get_os_wordsize() -> Wordsize when Wordsize :: 32 | 64 | unsupported_os.

返回当前运行的操作系统字长。

链接到此函数

get_procmem_high_watermark()

查看源代码
-spec get_procmem_high_watermark() -> integer().

返回进程内存分配的阈值,以百分比表示。

链接到此函数

get_sysmem_high_watermark()

查看源代码
-spec get_sysmem_high_watermark() -> integer().

返回系统内存分配的阈值,以百分比表示。

链接到此函数

get_system_memory_data()

查看源代码
-spec get_system_memory_data() -> MemDataList
                                when MemDataList :: [{Tag, Size}], Tag :: atom(), Size :: integer().

调用内存检查并返回结果,系统相关的数据作为标记的元组列表,其中 Tag 目前可以是以下之一

  • total_memory - Erlang 虚拟机可用的总内存量,已分配和空闲的内存。可能等于或不等于系统中配置的内存量。

  • available_memory - 通知如果内存需求增加,可用于增加使用的内存量。此值不是基于其他提供的值的计算,并且应该比基于报告的其他值计算的值提供更好的可用内存量的值。此值当前仅在较新的 Linux 内核上提供。如果此值在 Linux 上不可用,则可以使用 cached_memorybuffered_memoryfree_memory 的总和作为近似值。

  • free_memory - Erlang 虚拟机可用于分配的空闲内存量。

  • system_total_memory - 整个操作系统可用的内存量。这很可能等于 total_memory,但不一定。

  • buffered_memory - 系统用于临时存储原始磁盘块的内存量。

  • cached_memory - 系统用于缓存从磁盘读取的文件的内存量。在 Linux 上,内核 slab 分配器中标记为可回收的内存也将添加到此值。

  • total_swap - 系统可用于磁盘交换的总内存量。

  • free_swap - 系统可用于磁盘交换的内存量。

注意

请注意,新的标记元组可能随时在结果中引入,恕不另行通知

请注意,结果列表中的元组顺序是未定义的,并且可能随时更改。

所有内存大小都以字节数表示。

如果 memsup 不可用,或内存检查超时,则返回空列表 []。

链接到此函数

set_check_interval(Minutes)

查看源代码
-spec set_check_interval(Minutes :: non_neg_integer()) -> ok.

更改定期内存检查的时间间隔,以分钟为单位。

更改将在下次内存检查后生效,并且是非持久的。也就是说,如果进程重新启动,则会忘记此值,并将使用默认值。请参阅 配置

链接到此函数

set_helper_timeout(Seconds)

查看源代码
-spec set_helper_timeout(Seconds :: non_neg_integer()) -> ok.

更改内存检查的超时值,以秒为单位。

更改将在下一次内存检查时生效,并且是非持久的。也就是说,如果进程重新启动,则会忘记此值,并将使用默认值。请参阅上面的配置

链接到此函数

set_procmem_high_watermark(Float)

查看源代码
-spec set_procmem_high_watermark(Float :: term()) -> ok.

更改进程内存分配的阈值,以浮点数形式给出。

更改将在下一次定期内存检查期间生效,并且是非持久的。也就是说,如果进程重新启动,则会忘记此值,并将使用默认值。请参阅配置

链接到此函数

set_sysmem_high_watermark(Float)

查看源代码
-spec set_sysmem_high_watermark(Float :: term()) -> ok.

更改系统内存分配的阈值,以浮点数形式给出。

更改将在下一次定期内存检查期间生效,并且是非持久的。也就是说,如果进程重新启动,则会忘记此值,并将使用默认值。请参阅上面的 配置