交换空间使用量

通过 Swap 技术, Linux 内核可以将较少被访问的 内存页 交换到设定好的 磁盘空间 。 释放出来的内存页可另做他用,以缓解系统的内存压力。

交换空间通常是一个 磁盘分区 ,但是也可以是一个 文件物理内存交换空间 的总大小是理论上可以使用的内存总量——也称作 虚拟内存 总量。

\[virtual = physical + swap\]

警告

虽然 交换分区 理论上可以增加系统可用的内存总量,但不能滥用。 由于 磁盘 的访问速度远比 内存 慢, 频繁的交换操作将拖垮系统 。 因此,对 交换空间 使用情况进行监控很有必要。

指标

交换空间使用量指标(字节)
指标名 含义
total 交换空间总量
free 空闲交换空间(未使用)
used 已用交换空间

total

total 表示 交换空间总量 ,单位为 字节 ,对应 /proc/meminfoSwapTotal 字段。

free

free 表示 空闲交换空间 ,单位为 字节 ,对应 /proc/meminfoSwapFree 字段。

used

used 表示 已用交换空间 ,单位为 字节 ,可由前两个字段计算而来:

\[used = total - free\]

采集

同样,一个简单的 Python 程序读取 /proc/meminfo 文件即可采集数据:

swap_usage.py
 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))

下一步

订阅更新,获取更多学习资料,请关注我们的 微信公众号

../../../_images/wechat-mp-qrcode.png

小菜学编程