memsup
memsup
模块
memsup
模块摘要
内存监督程序
描述
memsup
是一个监督系统和各个进程的内存使用情况的进程。它是OS_Mon应用程序的一部分,请参阅os_mon(6)
。适用于Unix,Windows和VxWorks。
定期执行内存检查:
- 如果分配了超过一定数量的可用系统内存(由底层操作系统报告),
{system_memory_high_watermark, []}
则会设置警报。
- 如果系统中的任何Erlang进程
Pid
分配了超过一定数量的总系统内存,{process_memory_high_watermark, Pid}
则会设置该警报。
报警报告给SASL报警处理程序,请参阅alarm_handler(3)
。要设置闹钟,alarm_handler:set_alarm(Alarm)
被称为Alarm
以上指定的任一闹钟。
当警报原因不再有效时,警报会自动清除。
该功能get_memory_data()
可用于检索最近一次定期记忆检查的结果。
还有一个与系统相关的内存数据的接口get_system_memory_data()
。结果高度依赖于底层操作系统,接口主要针对没有虚拟内存的系统(例如VxWorks)。然而,其他系统上的输出仍然有效,虽然稀疏。
对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
进程等待内存检查结果的时间。如果超时过期,"OS_MON (memsup) timeout"
则通过发出警告消息error_logger
并且任何挂起的同步客户机调用将返回一个虚拟值。通常情况下,这种情况不应该发生。然而,在Linux上有一些情况,当系统负载很重时,从中读取系统数据的伪文件暂时不可用。
默认为30秒。
memsup_system_only = bool()
指定memsup
进程是否应该仅检查系统内存使用情况(true
)。默认值是false
,这意味着收集关于系统内存使用情况和Erlang进程内存使用情况的信息。
建议false
在具有许多并发进程的系统上设置此参数,因为每个进程内存检查都会遍历整个进程列表。
请参阅config(4)
有关如何更改配置参数值的信息。
输出
get_memory_data() -> {Total,Allocated,Worst}
类型
返回最新内存检查的结果,其中Total
是总内存大小和Allocated
分配的内存大小(以字节为单位)。
Worst
是节点上最大Erlang进程的PID和分配字节数。如果memsup
不应收集过程数据,即如果配置参数memsup_system_only
设置为true
,Worst
则为undefined
。
该函数通常是异步的,因为它不会调用内存检查,但会返回最新的可用值。如果在第一次内存检查完成之前调用该函数,则会发生一个例外,在这种情况下,直到内存检查完成后才会返回值。
如果memsup
不可用,返回{0,0,{pid(),0}}
或{0,0,undefined};
如果memsup
不可用,或者如果所有内存检查到目前为止都已超时。
get_system_memory_data() -> MemDataList
类型
调用内存检查,并将结果的系统依赖的数据作为标记元组列表返回,其中Tag
可以是下列之一:
total_memory Erlang模拟器可用的内存总量,已分配和空闲。 可能会或可能不等于系统中配置的内存量。 free_memory Erlang仿真器可用于分配的可用内存量。 system_total_memory整个操作系统可用的内存量。 这可能等于total_memory,但不一定。 largest_free Erlang仿真器可用的最大连续空闲内存块的大小。 number_of_free Erlang运行时系统可用的空闲块数。 这可以很好地表明内存是如何分散的。 buffered_memory系统用于临时存储原始磁盘块的内存量。 cached_memory系统用于从磁盘读取的缓存文件的内存量。 total_swap系统可用于磁盘交换的总内存量。 free_swap系统可用于磁盘交换的内存量。
所有内存大小都以字节
...
在largest_free
和number_of_free
标签目前只能返回VxWorks系统上。
如果memsup
不可用,或者如果内存检查超时,则返回空列表[] 。
注
Linux上的可用内存仿真器cached_memory
和buffered_memory
除free_memory
。
get_os_wordsize() -> Wordsize
类型
返回当前正在运行的操作系统的字大小。
get_check_interval() -> MS
类型
返回周期性内存检查的时间间隔(以毫秒为单位)。
set_check_interval(Minutes) -> ok
类型
更改周期性内存检查的时间间隔(以分钟为单位)。
更改将在下一次内存检查后生效,并且是非持久性的。也就是说,在进程重新启动的情况下,该值将被遗忘,并将使用默认值。见Configuration
上面。
get_procmem_high_watermark() -> int()
返回进程内存分配的阈值(以百分比为单位)。
set_procmem_high_watermark(Float) -> ok
更改进程内存分配的阈值(作为浮点数)。
更改将在下次定期内存检查期间生效,并且是非持久性的。也就是说,在进程重启的情况下,该值被遗忘,并使用默认值。见Configuration
。
get_sysmem_high_watermark() -> int()
返回系统内存分配的阈值(以百分比为单位)。
set_sysmem_high_watermark(Float) -> ok
更改系统内存分配的阈值(作为浮点数)。
更改将在下次定期内存检查期间生效,并且是非持久性的。也就是说,在进程重启的情况下,该值被遗忘,并使用默认值。见Configuration
。
get_helper_timeout() -> Seconds
类型
返回超时值,以秒为单位,用于内存检查。
set_helper_timeout(Seconds) -> ok
类型
更改以秒为单位的超时值,以进行内存检查。
更改将对下一次内存检查生效,并且是非持久性的。也就是说,在进程重新启动的情况下,该值将被遗忘,并将使用默认值。见Configuration
。
另见
alarm_handler(3)
,,,os_mon(3)