]> code.delx.au - monosys/blob - bin/mfree
notes: fix raspi install notes, also @home -> @username
[monosys] / bin / mfree
1 #!/usr/bin/env python3
2
3 import sys
4
5 def read_meminfo():
6 f = open("/proc/meminfo")
7 result = {}
8 for line in f:
9 key, value, *_ = line.split()
10 key = key.strip(":")
11 result[key] = int(value) * 1024
12 return result
13
14 def read_zfs_arcstats():
15 try:
16 f = open("/proc/spl/kstat/zfs/arcstats")
17 except FileNotFoundError:
18 return {}
19
20 # skip first two lines
21 f.readline()
22 f.readline()
23
24 result = {}
25 for line in f:
26 key, _, value = line.split()
27 result[key] = int(value)
28 return result
29
30 def print_template(first, *rest):
31 sys.stdout.write(first.ljust(7))
32 for x in rest:
33 sys.stdout.write(x.rjust(12))
34 sys.stdout.write("\n")
35
36 def main():
37 meminfo = read_meminfo()
38 arcstats = read_zfs_arcstats()
39
40 mem_total = meminfo["MemTotal"]
41 mem_free = meminfo["MemFree"]
42 mem_cached = meminfo["Cached"] + meminfo["SReclaimable"]
43 mem_buffers = meminfo["Buffers"]
44 mem_shared = meminfo["Shmem"]
45 mem_available = meminfo["MemAvailable"]
46
47 swap_total = meminfo["SwapTotal"]
48 swap_free = meminfo["SwapFree"]
49
50 arc_total = arcstats.get("c_max", 0)
51 arc_used = arcstats.get("size", 0)
52
53 calc_used = mem_total - mem_free - mem_cached - mem_buffers - arc_used
54 calc_cache = mem_buffers + mem_cached + arc_used
55 calc_available = mem_available + arc_used
56
57 def fmt(x):
58 return str(round(x/1024/1024))
59
60 print_template("", "total", "used", "free", "shared", "buff/cache", "available")
61
62 print_template(
63 "Mem:",
64 fmt(mem_total),
65 fmt(calc_used),
66 fmt(mem_free),
67 fmt(mem_shared),
68 fmt(calc_cache),
69 fmt(calc_available),
70 )
71 print_template(
72 "Swap:",
73 fmt(swap_total),
74 fmt(swap_total - swap_free),
75 fmt(swap_free),
76 )
77 if arcstats:
78 print_template(
79 "ZFS:",
80 fmt(arc_total),
81 fmt(arc_used),
82 )
83
84 if __name__ == "__main__":
85 main()
86