查看源代码 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。
另请参阅
摘要
函数
返回定期内存检查的时间间隔,以毫秒为单位。
返回内存检查的超时值,以秒为单位。
返回最新内存检查的结果,其中 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
,则 Worst
为 undefined
。
该函数通常是异步的,因为它不会调用内存检查,而是返回最新的可用值。如果该函数在第一次内存检查完成之前被调用,则会有一个例外,在这种情况下,它不会返回值,直到内存检查完成为止。
如果 memsup
不可用,或者到目前为止所有内存检查都已超时,则返回 {0,0,{pid(),0}}
或 {0,0,undefined}
。
-spec get_os_wordsize() -> Wordsize when Wordsize :: 32 | 64 | unsupported_os.
返回当前运行的操作系统字长。
-spec get_procmem_high_watermark() -> integer().
返回进程内存分配的阈值,以百分比表示。
-spec get_sysmem_high_watermark() -> integer().
返回系统内存分配的阈值,以百分比表示。
-spec get_system_memory_data() -> MemDataList when MemDataList :: [{Tag, Size}], Tag :: atom(), Size :: integer().
调用内存检查并返回结果,系统相关的数据作为标记的元组列表,其中 Tag
目前可以是以下之一
total_memory
- Erlang 虚拟机可用的总内存量,已分配和空闲的内存。可能等于或不等于系统中配置的内存量。available_memory
- 通知如果内存需求增加,可用于增加使用的内存量。此值不是基于其他提供的值的计算,并且应该比基于报告的其他值计算的值提供更好的可用内存量的值。此值当前仅在较新的 Linux 内核上提供。如果此值在 Linux 上不可用,则可以使用cached_memory
、buffered_memory
和free_memory
的总和作为近似值。free_memory
- Erlang 虚拟机可用于分配的空闲内存量。system_total_memory
- 整个操作系统可用的内存量。这很可能等于total_memory
,但不一定。buffered_memory
- 系统用于临时存储原始磁盘块的内存量。cached_memory
- 系统用于缓存从磁盘读取的文件的内存量。在 Linux 上,内核 slab 分配器中标记为可回收的内存也将添加到此值。total_swap
- 系统可用于磁盘交换的总内存量。free_swap
- 系统可用于磁盘交换的内存量。
注意
请注意,新的标记元组可能随时在结果中引入,恕不另行通知
请注意,结果列表中的元组顺序是未定义的,并且可能随时更改。
所有内存大小都以字节数表示。
如果 memsup
不可用,或内存检查超时,则返回空列表 []。
-spec set_check_interval(Minutes :: non_neg_integer()) -> ok.
更改定期内存检查的时间间隔,以分钟为单位。
更改将在下次内存检查后生效,并且是非持久的。也就是说,如果进程重新启动,则会忘记此值,并将使用默认值。请参阅 配置。
-spec set_helper_timeout(Seconds :: non_neg_integer()) -> ok.
更改内存检查的超时值,以秒为单位。
更改将在下一次内存检查时生效,并且是非持久的。也就是说,如果进程重新启动,则会忘记此值,并将使用默认值。请参阅上面的配置。
-spec set_procmem_high_watermark(Float :: term()) -> ok.
更改进程内存分配的阈值,以浮点数形式给出。
更改将在下一次定期内存检查期间生效,并且是非持久的。也就是说,如果进程重新启动,则会忘记此值,并将使用默认值。请参阅配置。
-spec set_sysmem_high_watermark(Float :: term()) -> ok.
更改系统内存分配的阈值,以浮点数形式给出。
更改将在下一次定期内存检查期间生效,并且是非持久的。也就是说,如果进程重新启动,则会忘记此值,并将使用默认值。请参阅上面的 配置。