交换空间使用量¶
通过 Swap 技术, Linux 内核可以将较少被访问的 内存页 交换到设定好的 磁盘空间 。 释放出来的内存页可另做他用,以缓解系统的内存压力。
交换空间通常是一个 磁盘分区 ,但是也可以是一个 文件 。 物理内存 和 交换空间 的总大小是理论上可以使用的内存总量——也称作 虚拟内存 总量。
\[virtual = physical + swap\]
警告
虽然 交换分区 理论上可以增加系统可用的内存总量,但不能滥用。 由于 磁盘 的访问速度远比 内存 慢, 频繁的交换操作将拖垮系统 。 因此,对 交换空间 使用情况进行监控很有必要。
指标¶
指标名 | 含义 |
---|---|
total | 交换空间总量 |
free | 空闲交换空间(未使用) |
used | 已用交换空间 |
total¶
total 表示 交换空间总量 ,单位为 字节 ,对应 /proc/meminfo 的 SwapTotal 字段。
free¶
free 表示 空闲交换空间 ,单位为 字节 ,对应 /proc/meminfo 的 SwapFree 字段。
采集¶
同样,一个简单的 Python 程序读取 /proc/meminfo 文件即可采集数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | import json
UNIT_MAPPING = {
'kB': 1024,
'KB': 1024,
}
def parse_value(value):
# default, no unit
unit = ''
# split value string
parts = value.strip().split()
if len(parts) == 2:
number, unit = parts
else:
number, = parts
return int(number.strip()) * UNIT_MAPPING.get(unit.strip(), -1)
def sample_memory_usage():
# open data file
with open('/proc/meminfo') as f:
# open all lines
lines = f.readlines()
# split every line to a pair by :
pairs = [
line.strip().split(':', 1)
for line in lines
]
# data dict
datas = {
name.strip(): parse_value(value)
for name, value in pairs
}
# calculate
total = datas['SwapTotal']
free = datas['SwapFree']
used = total - free
return {
'total': total,
'free': free,
'used': used,
}
if __name__ == '__main__':
usage = sample_memory_usage()
print(json.dumps(usage, indent=4))
|