交换空间使用量

通过 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. import json
  2. UNIT_MAPPING = {
  3. 'kB': 1024,
  4. 'KB': 1024,
  5. }
  6. def parse_value(value):
  7. # default, no unit
  8. unit = ''
  9. # split value string
  10. parts = value.strip().split()
  11. if len(parts) == 2:
  12. number, unit = parts
  13. else:
  14. number, = parts
  15. return int(number.strip()) * UNIT_MAPPING.get(unit.strip(), -1)
  16. def sample_memory_usage():
  17. # open data file
  18. with open('/proc/meminfo') as f:
  19. # open all lines
  20. lines = f.readlines()
  21. # split every line to a pair by :
  22. pairs = [
  23. line.strip().split(':', 1)
  24. for line in lines
  25. ]
  26. # data dict
  27. datas = {
  28. name.strip(): parse_value(value)
  29. for name, value in pairs
  30. }
  31. # calculate
  32. total = datas['SwapTotal']
  33. free = datas['SwapFree']
  34. used = total - free
  35. return {
  36. 'total': total,
  37. 'free': free,
  38. 'used': used,
  39. }
  40. if __name__ == '__main__':
  41. usage = sample_memory_usage()
  42. print(json.dumps(usage, indent=4))

下一步

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

../../../_images/wechat-mp-qrcode.png小菜学编程

参考文献