-
Notifications
You must be signed in to change notification settings - Fork 69
/
Copy pathnodestats.py
executable file
·95 lines (74 loc) · 2.72 KB
/
nodestats.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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/usr/bin/env python3
# Print some host NUMA node statistics
#
# Authors:
# Michal Privoznik <mprivozn@redhat.com>
import libvirt
from xml.dom import minidom
import libxml2
from typing import Any, Dict # noqa F401
def xpath_eval(ctxt, path: str) -> str:
res = ctxt.xpathEval(path)
if res is None or len(res) == 0:
value = ''
else:
value = res[0].content
return value
try:
conn = libvirt.openReadOnly(None)
except libvirt.libvirtError:
print("Failed to connect to the hypervisor")
exit(1)
try:
capsXML = conn.getCapabilities()
except libvirt.libvirtError:
print("Failed to request capabilities")
exit(1)
caps = minidom.parseString(capsXML)
cells = caps.getElementsByTagName("cells")[0]
nodesIDs = [
int(proc.getAttribute("id"))
for proc in cells.getElementsByTagName("cell")
]
nodesMem = [
conn.getMemoryStats(int(proc))
for proc in nodesIDs
]
doms = conn.listAllDomains(libvirt.VIR_CONNECT_LIST_DOMAINS_ACTIVE)
domsStrict = [
proc
for proc in doms
if proc.numaParameters()["numa_mode"] == libvirt.VIR_DOMAIN_NUMATUNE_MEM_STRICT
]
domsStrictCfg = {} # type: Dict[libvirt.virDomain, Dict[str, Dict[str, Any]]]
for dom in domsStrict:
xmlStr = dom.XMLDesc()
doc = libxml2.parseDoc(xmlStr)
ctxt = doc.xpathNewContext()
domsStrictCfg[dom] = {}
pin = ctxt.xpathEval("string(/domain/numatune/memory/@nodeset)")
memsize = ctxt.xpathEval("string(/domain/memory)")
domsStrictCfg[dom]["memory"] = {"size": int(memsize), "pin": pin}
for memnode in ctxt.xpathEval("/domain/numatune/memnode"):
ctxt.setContextNode(memnode)
cellid = xpath_eval(ctxt, "@cellid")
nodeset = xpath_eval(ctxt, "@nodeset")
nodesize = xpath_eval(ctxt, "/domain/cpu/numa/cell[@id='%s']/@memory" % cellid)
domsStrictCfg[dom][cellid] = {"size": int(nodesize), "pin": nodeset}
print("NUMA stats")
print("NUMA nodes:\t" + "\t".join(str(node) for node in nodesIDs))
print("MemTotal:\t" + "\t".join(str(i.get("total") // 1024) for i in nodesMem)) # type: ignore
print("MemFree:\t" + "\t".join(str(i.get("free") // 1024) for i in nodesMem)) # type: ignore
for dom, v in domsStrictCfg.items():
print("Domain '%s':\t" % dom.name())
toPrint = "\tOverall memory: %d MiB" % (v["memory"]["size"] // 1024)
if v["memory"]["pin"] is not None and v["memory"]["pin"] != "":
toPrint = toPrint + " nodes %s" % v["memory"]["pin"]
print(toPrint)
for k, node in sorted(v.items()):
if k == "memory":
continue
toPrint = "\tNode %s:\t%d MiB" % (k, node["size"] // 1024)
if node["pin"] is not None and node["pin"] != "":
toPrint = toPrint + " nodes %s" % node["pin"]
print(toPrint)