腾讯云cvm 内存使用率监控指标解读

2024-07-11 14:54:36 浏览数 (1)

前言

腾讯云cvm内存使用率监控指标到底是怎么统计的?按照官网的解释,内存使用率是用户实际使用的内存量与总内存量之比,不包括缓冲区与系统缓存占用的内存。 官网这里解释比较笼统, 是free 命令里面的(total-free)100%/total? 还是(total-free-buffer/cache)100%/total? 答案都不是,具体看下面的解释。

tapd_20421800_1603678694_41.pngtapd_20421800_1603678694_41.png
/proc/meminfo 关键指标说明
代码语言:txt复制
[root@VM_0_113_centos test]# cat /proc/meminfo 
MemTotal:       16265592 kB
MemFree:         1880084 kB
......
Buffers:          194384 kB
Cached:         13647556 kB
......
Shmem:           7727752 kB
Slab:             328864 kB
SReclaimable:     306500 kB
SUnreclaim:        22364 kB
......

MemTotal: 系统总的内存

MemFree:系统剩余内存

Buffers:表示块设备(block device)所占用的缓存页,包括:直接读写块设备、以及文件系统元数据(metadata)比如SuperBlock所使用的缓存页

Cached: page cache, 包含tmpfs中的文件,POSIX/SysV shared memory,以及shared anonymous mmap

Shmem: 包括共享内存,tmpfs等

Slab: 内核slab 分配器分配的内存,可以用slabtop查看

SReclaimable: 可回收的slab

SUnreclaim: 不可回收的slab

barad监控agent关于内存使用率算法

内存使用率算法关键函数可以直接看云服务器barad agent的采集脚本,在 /usr/local/qcloud/monitor/barad/lib/psutil/_pslinux.py文件下面(写于2020-10-24,后续如果有变更,可以根据mem_usage关键字查找跟踪对应代码实现)

代码语言:txt复制
def virtual_memory():
    total, free, buffers, shared, _, _ = cext.linux_sysinfo()
    cached = active = inactive = sreclaimable = shmem = 0
    with open('/proc/meminfo', 'rb') as f:
        for line in f:
            if line.startswith(b"Cached:"):
                cached = int(line.split()[1]) * 1024
            elif line.startswith(b"Active:"):
                active = int(line.split()[1]) * 1024
            elif line.startswith(b"Inactive:"):
                inactive = int(line.split()[1]) * 1024
            elif line.startswith(b"Shmem:"):
                shmem = int(line.split()[1]) * 1024
            elif line.startswith(b"SReclaimable:"):
                sreclaimable = int(line.split()[1]) * 1024

            else:
                # we might get here when dealing with exotic Linux flavors, see:
                # https://github.com/giampaolo/psutil/issues/313
                continue

    cached  = sreclaimable
    avail = free   buffers   cached - shmem
    used = total - free
    percent = usage_percent((total - avail), total, _round=1)
    return svmem(total, avail, percent, used, free,
                 active, inactive, buffers, cached)
                

通过上面的函数,我们可以得出内存使用率算法:

内存使用率 = (Total - avail)100% / Total = (Total - (Free Buffers Cached SReclaimable - Shmem))100% /Total = ( Total - Free - Buffers - Cached - SReclaimable Shmem)* 100% / Total, 这里的Total,Free,Buffer,Cached,SReclaimable,Shmem 对应/proc/meminfo的指标。( 注意 shmem统计的是共享内存使用的内存,对应的值也统计到了Cached,因为shmem在内存不足时是不会自动回收的,所以shmem不能统计到剩余可用内存里面,需要减掉 )

2024年07月更新

2024年07月左右 barad agent开始变更内存使用率算法,如果/proc/meminfo存在 MemAvailable值, 则内存使用率 = (Total - MemAvailable)*100% / Total, 不存在MemAvailable则按原来的计算方法

注意事项

不能简单通过free 命令输出计算内存使用率,因为不同linux发行版的free命令输出表示的意思可能有区别,最常见的是centos6.x跟centos7.x的区别,centos6.x free命令输出的buffer/cache不包括/proc/meminfo的SReclaimable,而centos7.x free命令输出的buffer/cache是包括/proc/meminfo的SReclaimable。

0 人点赞