]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: track kv utilization in kv_sync_thread
authorIgor Fedotov <ifedotov@suse.com>
Fri, 14 Jun 2019 11:04:33 +0000 (14:04 +0300)
committerIgor Fedotov <ifedotov@suse.com>
Fri, 4 Dec 2020 21:09:52 +0000 (00:09 +0300)
Signed-off-by: Igor Fedotov <ifedotov@suse.com>
src/common/legacy_config_opts.h
src/common/options.cc
src/os/bluestore/BlueStore.cc

index dd5b3e0af2f0aaa4671b5f114b582eac3735b4c2..8539b353bb1f83a800fc7b45bd01cac86835aa9b 100644 (file)
@@ -1051,6 +1051,7 @@ OPTION(bluestore_debug_enforce_settings, OPT_STR)
 OPTION(bluestore_volume_selection_policy, OPT_STR)
 OPTION(bluestore_volume_selection_reserved_factor, OPT_DOUBLE)
 OPTION(bluestore_volume_selection_reserved, OPT_INT)
+OPTION(bluestore_kv_sync_util_logging_s, OPT_DOUBLE)
 
 OPTION(kstore_max_ops, OPT_U64)
 OPTION(kstore_max_bytes, OPT_U64)
index 7de01868ccfdf6b4f1a3a94e806c73f89731e3ef..cf963230ed18b915e74d0ae36cf35dae567579bd 100644 (file)
@@ -4799,6 +4799,14 @@ std::vector<Option> get_global_options() {
     .set_default(false)
     .set_description("Enables Linux io_uring API Offload submission/completion to kernel thread"),
 
+    Option("bluestore_kv_sync_util_logging_s", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
+    .set_default(10.0)
+    .set_flag(Option::FLAG_RUNTIME)
+    .set_description("KV sync thread utilization logging period")
+    .set_long_description("How often (in seconds) to print KV sync thread utilization, "
+      "not logged when set to 0 or when utilization is 0%"),
+
+
     // -----------------------------------------
     // kstore
 
index 89e2e3aec18ac609103950fe3f38b37ca78b6a93..1d66ad48cce4bc628cd0123837fc63164ec18f0f 100644 (file)
@@ -11722,7 +11722,25 @@ void BlueStore::_kv_sync_thread()
   ceph_assert(!kv_sync_started);
   kv_sync_started = true;
   kv_cond.notify_all();
+
+  auto t0 = mono_clock::now();
+  timespan twait = ceph::make_timespan(0);
+  size_t kv_submitted = 0;
+
   while (true) {
+    auto period = cct->_conf->bluestore_kv_sync_util_logging_s;
+    auto observation_period =
+      ceph::make_timespan(period);
+    auto elapsed = mono_clock::now() - t0;
+    if (period && elapsed >= observation_period) {
+      dout(5) << __func__ << " utilization: idle "
+             << twait << " of " << elapsed
+             << ", submitted: " << kv_submitted
+             <<dendl;
+      t0 = mono_clock::now();
+      twait = ceph::make_timespan(0);
+      kv_submitted = 0;
+    }
     ceph_assert(kv_committing.empty());
     if (kv_queue.empty() &&
        ((deferred_done_queue.empty() && deferred_stable_queue.empty()) ||
@@ -11730,8 +11748,11 @@ void BlueStore::_kv_sync_thread()
       if (kv_stop)
        break;
       dout(20) << __func__ << " sleep" << dendl;
+      auto t = mono_clock::now();
       kv_sync_in_progress = false;
       kv_cond.wait(l);
+      twait += mono_clock::now() - t;
+
       dout(20) << __func__ << " wake" << dendl;
     } else {
       deque<TransContext*> kv_submitting;
@@ -11825,6 +11846,7 @@ void BlueStore::_kv_sync_thread()
       for (auto txc : kv_committing) {
        throttle.log_state_latency(*txc, logger, l_bluestore_state_kv_queued_lat);
        if (txc->get_state() == TransContext::STATE_KV_QUEUED) {
+         ++kv_submitted;
          _txc_apply_kv(txc, false);
          --txc->osr->kv_committing_serially;
        } else {