From 1d5ad4d653b884df926daf22683eb03e07e1b964 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 4 Jan 2019 09:34:29 -0600 Subject: [PATCH] mon/OSDMonitor: add 'osd numa-status' command Signed-off-by: Sage Weil --- src/mon/MonCommands.h | 3 ++ src/mon/OSDMonitor.cc | 104 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 7e10e2628f39f..143b4bded8ab0 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -497,6 +497,9 @@ COMMAND("osd count-metadata name=property,type=CephString", COMMAND("osd versions", \ "check running versions of OSDs", "osd", "r") +COMMAND("osd numa-status", + "show NUMA status of OSDs", + "osd", "r") COMMAND("osd map " \ "name=pool,type=CephPoolname " \ "name=object,type=CephObjectname " \ diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index e9879b1d4ebfd..dbf55422ba4f0 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -60,6 +60,7 @@ #include "common/ceph_argparse.h" #include "common/perf_counters.h" #include "common/strtol.h" +#include "common/numa.h" #include "common/config.h" #include "common/errno.h" @@ -4450,6 +4451,22 @@ bool OSDMonitor::handle_osd_timeouts(const utime_t &now, return new_down; } +static void dump_cpu_list(Formatter *f, const char *name, + const string& strlist) +{ + cpu_set_t cpu_set; + size_t cpu_set_size; + if (parse_cpu_set_list(strlist.c_str(), &cpu_set_size, &cpu_set) < 0) { + return; + } + set cpus = cpu_set_to_set(cpu_set_size, &cpu_set); + f->open_array_section(name); + for (auto cpu : cpus) { + f->dump_int("cpu", cpu); + } + f->close_section(); +} + void OSDMonitor::dump_info(Formatter *f) { f->open_object_section("osdmap"); @@ -4851,6 +4868,93 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op) count_metadata(field, f.get()); f->flush(rdata); r = 0; + } else if (prefix == "osd numa-status") { + TextTable tbl; + if (f) { + f->open_array_section("osds"); + } else { + tbl.define_column("OSD", TextTable::LEFT, TextTable::RIGHT); + tbl.define_column("HOST", TextTable::LEFT, TextTable::LEFT); + tbl.define_column("NETWORK", TextTable::RIGHT, TextTable::RIGHT); + tbl.define_column("STORAGE", TextTable::RIGHT, TextTable::RIGHT); + tbl.define_column("AFFINITY", TextTable::RIGHT, TextTable::RIGHT); + tbl.define_column("CPUS", TextTable::LEFT, TextTable::LEFT); + } + for (int i=0; i m; + ostringstream err; + if (load_metadata(i, m, &err) < 0) { + continue; + } + string host; + auto p = m.find("hostname"); + if (p != m.end()) { + host = p->second; + } + if (f) { + f->open_object_section("osd"); + f->dump_int("osd", i); + f->dump_string("host", host); + for (auto n : { "network_numa_node", "objectstore_numa_node", + "numa_node" }) { + p = m.find(n); + if (p != m.end()) { + f->dump_int(n, atoi(p->second.c_str())); + } + } + for (auto n : { "network_numa_nodes", "objectstore_numa_nodes" }) { + p = m.find(n); + if (p != m.end()) { + list ls = get_str_list(p->second, ","); + f->open_array_section(n); + for (auto node : ls) { + f->dump_int("node", atoi(node.c_str())); + } + f->close_section(); + } + } + for (auto n : { "numa_node_cpus" }) { + p = m.find(n); + if (p != m.end()) { + dump_cpu_list(f.get(), n, p->second); + } + } + f->close_section(); + } else { + tbl << i; + tbl << host; + p = m.find("network_numa_nodes"); + if (p != m.end()) { + tbl << p->second; + } else { + tbl << "-"; + } + p = m.find("objectstore_numa_nodes"); + if (p != m.end()) { + tbl << p->second; + } else { + tbl << "-"; + } + p = m.find("numa_node"); + auto q = m.find("numa_node_cpus"); + if (p != m.end() && q != m.end()) { + tbl << p->second; + tbl << q->second; + } else { + tbl << "-"; + tbl << "-"; + } + tbl << TextTable::endrow; + } + } + } + if (f) { + f->close_section(); + f->flush(rdata); + } else { + rdata.append(stringify(tbl)); + } } else if (prefix == "osd map") { string poolstr, objstr, namespacestr; cmd_getval(cct, cmdmap, "pool", poolstr); -- 2.39.5