]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: add 'osd numa-status' command
authorSage Weil <sage@redhat.com>
Fri, 4 Jan 2019 15:34:29 +0000 (09:34 -0600)
committerSage Weil <sage@redhat.com>
Tue, 8 Jan 2019 18:57:00 +0000 (12:57 -0600)
Signed-off-by: Sage Weil <sage@redhat.com>
src/mon/MonCommands.h
src/mon/OSDMonitor.cc

index 7e10e2628f39f59c189bdf8483508b8a407e9966..143b4bded8ab0cb504a9af39b2913618b0d130a4 100644 (file)
@@ -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 " \
index e9879b1d4ebfdf5ffbbea6f0f7bed596c2eecd64..dbf55422ba4f0a078a4a90872538a1d532250a67 100644 (file)
@@ -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<int> 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<osdmap.get_max_osd(); ++i) {
+      if (osdmap.exists(i)) {
+       map<string,string> 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<string> 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);