]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: make the minimum of schedule tick for QoS configurable. 24214/head
authorShiyang Ruan <ruansy.fnst@cn.fujitsu.com>
Wed, 17 Oct 2018 09:54:20 +0000 (17:54 +0800)
committerShiyang Ruan <ruansy.fnst@cn.fujitsu.com>
Wed, 7 Nov 2018 05:28:56 +0000 (13:28 +0800)
Signed-off-by: Shiyang Ruan <ruansy.fnst@cn.fujitsu.com>
qa/suites/rbd/thrash/workloads/rbd_fsx_rate_limit.yaml
src/common/Throttle.cc
src/common/Throttle.h
src/common/options.cc
src/librbd/ImageCtx.cc
src/librbd/io/ImageRequestWQ.cc
src/librbd/io/ImageRequestWQ.h

index 6d215c62b4b34c853ad8e09776d0681e80de5884..611320bca15702d36a7de6f46c55195fb355b154 100644 (file)
@@ -8,3 +8,4 @@ overrides:
       client:
         rbd qos iops limit: 50
         rbd qos iops burst: 100
+        rbd qos schedule tick min: 100
index 015ee09c357e0350106c9187ec01a5d5b33bc965..8e026bfdb9f199dba59fffbdaf2e5595777d2e18 100644 (file)
@@ -764,6 +764,13 @@ int TokenBucketThrottle::set_limit(uint64_t average, uint64_t burst) {
   return 0;
 }
 
+void TokenBucketThrottle::set_schedule_tick_min(uint64_t tick) {
+  std::lock_guard<Mutex> lock(m_lock);
+  if (tick != 0) {
+    m_tick_min = tick;
+  }
+}
+
 uint64_t TokenBucketThrottle::tokens_filled(double tick) {
   return (0 == m_avg) ? 0 : (tick / m_ticks_per_second * m_avg);
 }
index d66051c1b43c012556c6cabceedbe41c77d4ae18..5e506cdb3e947abc205f0c5bb50874f6f695b6d7 100644 (file)
@@ -368,7 +368,7 @@ class TokenBucketThrottle {
   Mutex m_lock;
 
   // minimum of the filling period.
-  static const uint64_t m_tick_min = 50;
+  uint64_t m_tick_min = 50;
   // tokens filling period, its unit is millisecond.
   uint64_t m_tick = 0;
   /**
@@ -446,6 +446,7 @@ public:
   }
   
   int set_limit(uint64_t average, uint64_t burst);
+  void set_schedule_tick_min(uint64_t tick);
 
 private:
   uint64_t tokens_filled(double tick);
index 7f75b07b71987b5b4a376222382275dbbf8b48eb..cf15115663ec8dbca4827a9aa0067387e278c65e 100644 (file)
@@ -6700,6 +6700,11 @@ static std::vector<Option> get_rbd_options() {
     .set_default(0)
     .set_description("the desired burst limit of write bytes"),
 
+    Option("rbd_qos_schedule_tick_min", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
+    .set_default(50)
+    .set_min(1)
+    .set_description("minimum schedule tick (in milliseconds) for QoS"),
+
     Option("rbd_discard_on_zeroed_write_same", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
     .set_default(true)
     .set_description("discard data on zeroed write same instead of writing zero"),
index 341f79fab61f85f0d783a4e191caab0066238246..c4c17a974ba8649ce7550500d1a6efd062c398e2 100644 (file)
@@ -809,6 +809,9 @@ public:
       sparse_read_threshold_bytes = get_object_size();
     }
 
+    io_work_queue->apply_qos_schedule_tick_min(
+      config.get_val<uint64_t>("rbd_qos_schedule_tick_min"));
+
     io_work_queue->apply_qos_limit(
       RBD_QOS_IOPS_THROTTLE,
       config.get_val<uint64_t>("rbd_qos_iops_limit"),
index 62f7e779a3a6119eb92e41aa611910db3aead4a4..ee07e10f740fc2f3dc26f54a504937cf6f24296c 100644 (file)
@@ -614,6 +614,13 @@ void ImageRequestWQ<I>::set_require_lock(Direction direction, bool enabled) {
   }
 }
 
+template <typename I>
+void ImageRequestWQ<I>::apply_qos_schedule_tick_min(uint64_t tick){
+  for (auto pair : m_throttles) {
+    pair.second->set_schedule_tick_min(tick);
+  }
+}
+
 template <typename I>
 void ImageRequestWQ<I>::apply_qos_limit(const uint64_t flag,
                                         uint64_t limit,
index f1a92d6dfad63226ea33595480071057be735e6a..5c726985964c416baa9c4f8b50c1330beaade9d6 100644 (file)
@@ -73,6 +73,8 @@ public:
 
   void set_require_lock(Direction direction, bool enabled);
 
+  void apply_qos_schedule_tick_min(uint64_t tick);
+
   void apply_qos_limit(const uint64_t flag, uint64_t limit, uint64_t burst);
 protected:
   void *_void_dequeue() override;