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