]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd,mon,mds: support get|set tcmalloc release rate 26027/head
authorZengran Zhang <zhangzengran@sangfor.com.cn>
Fri, 18 Jan 2019 12:09:52 +0000 (20:09 +0800)
committerZengran Zhang <zhangzengran@sangfor.com.cn>
Tue, 12 Feb 2019 02:03:05 +0000 (10:03 +0800)
Signed-off-by: Zengran Zhang <zhangzengran@sangfor.com.cn>
doc/man/8/ceph.rst
src/mds/MDSDaemon.cc
src/mon/Monitor.cc
src/osd/OSD.cc
src/perfglue/disabled_heap_profiler.cc
src/perfglue/heap_profiler.cc
src/perfglue/heap_profiler.h

index 5f080dcb5d7d4cca43ab445b9bbb3e26c71a201a..a165e64404580feae670f0de5cfc5c98510f8638 100644 (file)
@@ -27,7 +27,7 @@ Synopsis
 
 | **ceph** **health** *{detail}*
 
-| **ceph** **heap** [ *dump* \| *start_profiler* \| *stop_profiler* \| *release* \| *stats* ] ...
+| **ceph** **heap** [ *dump* \| *start_profiler* \| *stop_profiler* \| *release* \| *get_release_rate* \| *set_release_rate* \| *stats* ] ...
 
 | **ceph** **injectargs** *<injectedargs>* [ *<injectedargs>*... ]
 
@@ -323,8 +323,22 @@ Show heap usage info (available only if compiled with tcmalloc)
 
 Usage::
 
-       ceph heap dump|start_profiler|stop_profiler|release|stats
+       ceph heap dump|start_profiler|stop_profiler|stats
 
+Subcommand ``release`` to make TCMalloc to releases no-longer-used memory back to the kernel at once. 
+
+Usage::
+
+       ceph heap release
+
+Subcommand ``(get|set)_release_rate`` get or set the TCMalloc memory release rate. TCMalloc releases 
+no-longer-used memory back to the kernel gradually. the rate controls how quickly this happens. 
+Increase this setting to make TCMalloc to return unused memory more frequently. 0 means never return
+memory to system, 1 means wait for 1000 pages after releasing a page to system. It is ``1.0`` by default..
+
+Usage::
+
+       ceph heap get_release_rate|set_release_rate {<val>}
 
 injectargs
 ----------
index 7aadfd43aff2d6e3e44f1bc53e7714ea2e7f8ff4..fe70afeaaf6f21f5f5acdbf1b458a52d250c5325 100644 (file)
@@ -838,6 +838,9 @@ int MDSDaemon::_handle_command(
       cmd_getval(cct, cmdmap, "heapcmd", heapcmd);
       vector<string> heapcmd_vec;
       get_str_vec(heapcmd, heapcmd_vec);
+      string value;
+      if (cmd_getval(cct, cmdmap, "value", value))
+        heapcmd_vec.push_back(value);
       ceph_heap_profiler_handle_command(heapcmd_vec, ds);
     }
   } else if (prefix == "cpu_profiler") {
index 5c7a92017791aa95c2379ec3b5c4dcc537d8f345..2856018beaf68940ca18d135a304f84ae0d1f03f 100644 (file)
@@ -3652,6 +3652,9 @@ void Monitor::handle_command(MonOpRequestRef op)
       // XXX 1-element vector, change at callee or make vector here?
       vector<string> heapcmd_vec;
       get_str_vec(heapcmd, heapcmd_vec);
+      string value;
+      if (cmd_getval(g_ceph_context, cmdmap, "value", value))
+        heapcmd_vec.push_back(value);
       ceph_heap_profiler_handle_command(heapcmd_vec, ds);
       rdata.append(ds);
       rs = "";
index 5ba037bba153f2f81877fc74cd42fcb7a0055693..b6f1f6453f0a1a371c83cb2d2af280c8fa2eb395 100644 (file)
@@ -3128,7 +3128,8 @@ void OSD::final_init()
 
   r = admin_socket->register_command( "heap",
                                       "heap " \
-                                      "name=heapcmd,type=CephString",
+                                      "name=heapcmd,type=CephString " \
+                                      "name=value,type=CephString,req=false",
                                       asok_hook,
                                       "show heap usage info (available only if "
                                       "compiled with tcmalloc)");
@@ -6208,8 +6209,10 @@ COMMAND("bench " \
        "osd", "rw")
 COMMAND("flush_pg_stats", "flush pg stats", "osd", "rw")
 COMMAND("heap " \
-       "name=heapcmd,type=CephChoices,strings=dump|start_profiler|stop_profiler|release|stats", \
-       "show heap usage info (available only if compiled with tcmalloc)", \
+       "name=heapcmd,type=CephChoices,strings="\
+           "dump|start_profiler|stop_profiler|release|get_release_rate|set_release_rate|stats " \
+       "name=value,type=CephString,req=false",
+       "show heap usage info (available only if compiled with tcmalloc)",
        "osd", "rw")
 COMMAND("debug dump_missing " \
        "name=filename,type=CephFilepath",
@@ -10805,10 +10808,15 @@ int heap(CephContext& cct, const cmdmap_t& cmdmap, Formatter& f,
   if (!cmd_getval(&cct, cmdmap, "heapcmd", cmd)) {
         os << "unable to get value for command \"" << cmd << "\"";
        return -EINVAL;
-   }
+  }
   
   std::vector<std::string> cmd_vec;
   get_str_vec(cmd, cmd_vec);
+
+  string val;
+  if (cmd_getval(&cct, cmdmap, "value", val)) {
+    cmd_vec.push_back(val);
+  }
   
   ceph_heap_profiler_handle_command(cmd_vec, os);
   
index 238ab4ad83c7305344b3ae9b5ef8e2eda15596b7..e2293afd26582077f5aebbfd38b3ea614574f85a 100644 (file)
@@ -21,6 +21,10 @@ void ceph_heap_profiler_stats(char *buf, int length) { return; }
 
 void ceph_heap_release_free_memory() { return; }
 
+double ceph_heap_get_release_rate() { return 0; }
+
+void ceph_heap_set_release_rate(double value) { return; }
+
 bool ceph_heap_profiler_running() { return false; }
 
 void ceph_heap_profiler_start() { return; }
index aceee55909f5c1ca5a14c011b34b3487ae9de475..c5cdbb4ee9627ca68fe30815d0d91e0fcf5ccee1 100644 (file)
@@ -52,6 +52,16 @@ void ceph_heap_release_free_memory()
   MallocExtension::instance()->ReleaseFreeMemory();
 }
 
+double ceph_heap_get_release_rate()
+{
+  return MallocExtension::instance()->GetMemoryReleaseRate();
+}
+
+void ceph_heap_set_release_rate(double val)
+{
+  MallocExtension::instance()->SetMemoryReleaseRate(val);
+}
+
 bool ceph_heap_get_numeric_property(
   const char *property, size_t *value)
 {
@@ -153,6 +163,18 @@ void ceph_heap_profiler_handle_command(const std::vector<std::string>& cmd,
   } else if (cmd.size() == 1 && cmd[0] == "release") {
     ceph_heap_release_free_memory();
     out << g_conf()->name << " releasing free RAM back to system.";
+  } else if (cmd.size() == 1 && cmd[0] == "get_release_rate") {
+    out << g_conf()->name << " release rate: " 
+       << std::setprecision(4) << ceph_heap_get_release_rate() << "\n";
+  } else if (cmd.size() == 2 && cmd[0] == "set_release_rate") {
+    try {
+      double val = std::stod(cmd[1]);
+      ceph_heap_set_release_rate(val);
+      out << g_conf()->name <<  " release rate changed to: " 
+          << std::setprecision(4) << ceph_heap_get_release_rate() << "\n";
+    } catch (...) {
+      out << g_conf()->name <<  " *** need an numerical value. ";
+    }
   } else
 #endif
   if (cmd.size() == 1 && cmd[0] == "stats") {
index 75fba8ac338204d140b56a4196f8a45f350c9ec9..1eacb462022e3dc24b122d1cf778d7367787bcf0 100644 (file)
@@ -35,6 +35,10 @@ void ceph_heap_profiler_stats(char *buf, int length);
 
 void ceph_heap_release_free_memory();
 
+double ceph_heap_get_release_rate();
+
+void ceph_heap_get_release_rate(double value);
+
 bool ceph_heap_profiler_running();
 
 void ceph_heap_profiler_start();