首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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设置为trueWorst则为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_freenumber_of_free标签目前只能返回VxWorks系统上。

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

Linux上的可用内存仿真器cached_memorybuffered_memoryfree_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)

扫码关注腾讯云开发者

领取腾讯云代金券