内存使用率

报警描述

业务[XX业务],虚拟机[X.X.X.X]内存使用率报警,使用率为95.00%

说明

对于Windows而言,如果内存占满,则系统会频繁的在物理内存与磁盘上的虚拟内存空间之间进行数据调入调出的操作,系统整体运行变慢。同时,用于磁盘读写的缓冲区会被压缩,磁盘读写持续变慢。
Linux的机制则与Windows有所不同,Linux会按照一定比例平衡物理内存与SWAP分区的使用,所以两者会按照比例同时增长。当Linux系统物理内存占满时,SWAP区也会飞速上涨,直到所有内存空间用尽。此时,Linux内部会对已有进程进行淘汰,按照OOM机制进行投票,选择优先级较高的进程杀死以释放内存。

监控对象

Windows操作系统、Linux操作系统、Unix操作系统

监控方式

Windows

对于Windows操作系统,通过监控代理读取。读取命令为:

sysmonitor.exe -counter mem

注意:该命令执行后,采集的是实时内存使用率。
实现机制:通过调取kernel32.dll的GlobalMemoryStatusEx函数实现。

GlobalMemoryStatusEx函数
BOOL WINAPI GlobalMemoryStatusEx(
  _Inout_ LPMEMORYSTATUSEX lpBuffer
);

该命令的参数 lpBuffer 是一个结构体,其结构定义为:

typedef struct _MEMORYSTATUSEX
    {
        DWORD dwLength; // 结构的长度,在使用函数前必须初始化此值
        DWORD dwMemoryLoad;// 物理内存的使用率(0~100的整数)
        DWORDLONG ullTotalPhys;// 物理内存的总量,以字节为单位(以下均相同)
        DWORDLONG ullAvailPhys;// 物理内存的剩余量
        DWORDLONG ullTotalPageFile;// 系统页面文件大小
        DWORDLONG ullAvailPageFile;// 系统可用页面文件大小
        DWORDLONG ullTotalVirtual;// 虚拟内存的总量
        DWORDLONG ullAvailVirtual;// 虚拟内存的剩余量
        DWORDLONG ullAvailExtendedVirtual;// 保留,值为0
    } MEMORYSTATUSEX,*LPMEMORYSTATUSEX;

返回值
如果函数成功,返回值为true。
如果函数失败,返回值为false。
调用GetLastError函数可获得更多的错误信息。

Linux

对于Linux操作系统,通过监控代理读取。读取命令为:

./sysmonitor.bin -counter mem

注意:该命令执行后,采集的是实时内存使用率。
实现机制:通过读取/proc/meminfo文件内容实现。

proc/meminfo输出示例如下:

MemTotal:       16213660 kB
MemFree:        15033744 kB
MemAvailable:   15509184 kB
Buffers:            2104 kB
Cached:           662288 kB
SwapCached:            0 kB
Active:           570068 kB
Inactive:         296696 kB
Active(anon):     197048 kB
Inactive(anon):     1808 kB
Active(file):     373020 kB
Inactive(file):   294888 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:               380 kB
Writeback:             0 kB
AnonPages:        199044 kB
Mapped:           122620 kB
Shmem:              2008 kB
KReclaimable:     120528 kB
Slab:             193088 kB
SReclaimable:     120528 kB
SUnreclaim:        72560 kB
KernelStack:        3568 kB
PageTables:         8616 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8106828 kB
Committed_AS:     565300 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:             5120 kB
HardwareCorrupted:     0 kB
AnonHugePages:     92160 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      190336 kB
DirectMap2M:     7149568 kB
DirectMap1G:    11534336 kB

UNIX

对于Unix操作系统:
AIX通过定时任务执行脚本读取。读取命令为:

svmon -G -O unit=KB

svmon是IBM AIX系统中常用的命令,用来捕获并分析虚拟内存快照。

规则

默认规则为:

[0<=使用率<90] 正常
[90<=使用率<95] 提醒
[95<=] 报警

可通过报警策略进行配置。