MB-19837: Increase number of NONIO threads 34/65934/6
authorJim Walker <jim@couchbase.com>
Tue, 19 Jul 2016 14:18:48 +0000 (15:18 +0100)
committerDave Rigby <daver@couchbase.com>
Wed, 20 Jul 2016 13:48:54 +0000 (13:48 +0000)
We've found that the NONIO threads can become
heavily utilised. On smaller systems only 1 or 2
threads were created, easily overwhelmed during
rebalance leading to rebalance failures.

This commit changes the code from creating
NONIO as 10% of nCPU to be 30% of nCPU and
ensuring at least 2 are always present.

The % is still hardwired because the thread count is global
and would be intialised by the first bucket's config.

Given that we can already override with a config flag the changes
are hardwired to give better throughput for nearly all users.

Comparison of old vs new.

CPU count = 1 NONIO threads old{1} new{2}
CPU count = 2 NONIO threads old{1} new{2}
CPU count = 4 NONIO threads old{1} new{2}
CPU count = 8 NONIO threads old{1} new{2}
CPU count = 16 NONIO threads old{2} new{3}
CPU count = 32 NONIO threads old{3} new{7}
CPU count = 36 NONIO threads old{3} new{8}
CPU count = 64 NONIO threads old{5} new{8}
CPU count = 128 NONIO threads old{8} new{8}

Change-Id: Ifa56730ad934ca9ae83993b3c539f4a725872696
Reviewed-on: http://review.couchbase.org/65934
Well-Formed: buildbot <build@couchbase.com>
Reviewed-by: Dave Rigby <daver@couchbase.com>
Tested-by: buildbot <build@couchbase.com>
src/executorpool.cc
tests/ep_testsuite.cc

index 294ca58..11a02ab 100644 (file)
@@ -34,6 +34,8 @@ ExecutorPool *ExecutorPool::instance = NULL;
 static const size_t EP_MIN_NUM_THREADS    = 10;
 static const size_t EP_MIN_READER_THREADS = 4;
 static const size_t EP_MIN_WRITER_THREADS = 4;
+static const size_t EP_MIN_NONIO_THREADS = 2;
+
 
 static const size_t EP_MAX_READER_THREADS = 12;
 static const size_t EP_MAX_WRITER_THREADS = 8;
@@ -54,15 +56,13 @@ size_t ExecutorPool::getNumCPU(void) {
 }
 
 size_t ExecutorPool::getNumNonIO(void) {
-    // 1. compute: ceil of 10% of total threads
-    size_t count = maxGlobalThreads / 10;
-    if (!count || maxGlobalThreads % 10) {
-        count++;
-    }
+    // 1. compute: 30% of total threads
+    size_t count = maxGlobalThreads * 0.3;
+
     // 2. adjust computed value to be within range
-    if (count > EP_MAX_NONIO_THREADS) {
-        count = EP_MAX_NONIO_THREADS;
-    }
+    count = std::min(EP_MAX_NONIO_THREADS,
+                     std::max(EP_MIN_NONIO_THREADS, count));
+
     // 3. pick user's value if specified
     if (maxWorkers[NONIO_TASK_IDX]) {
         count = maxWorkers[NONIO_TASK_IDX];
index ba9f8a5..1ca9997 100644 (file)
@@ -8636,12 +8636,14 @@ static enum test_result test_workload_stats(ENGINE_HANDLE *h, ENGINE_HANDLE_V1 *
     // MB-12279: limiting max writers to 4 for DGM bgfetch performance
     check(num_write_threads == 4, "Incorrect number of writers");
     check(num_auxio_threads == 1, "Incorrect number of auxio threads");
-    check(num_nonio_threads == 1, "Incorrect number of nonio threads");
+    check(num_nonio_threads > 1 && num_nonio_threads <= 8,
+          "Incorrect number of nonio threads");
     check(max_read_threads == 4, "Incorrect limit of readers");
     // MB-12279: limiting max writers to 4 for DGM bgfetch performance
     check(max_write_threads == 4, "Incorrect limit of writers");
     check(max_auxio_threads == 1, "Incorrect limit of auxio threads");
-    check(max_nonio_threads == 1, "Incorrect limit of nonio threads");
+    check(max_nonio_threads > 1 && max_nonio_threads <=8,
+          "Incorrect limit of nonio threads");
     check(num_shards == 5, "Incorrect number of shards");
     return SUCCESS;
 }
@@ -8739,7 +8741,7 @@ static enum test_result test_worker_stats(ENGINE_HANDLE *h, ENGINE_HANDLE_V1 *h1
     check(statelist.find(worker_1_state)!=statelist.end(),
           "worker_1's state incorrect");
 
-    check(get_int_stat(h, h1, "ep_num_workers") == 10, // cannot spawn less
+    check(get_int_stat(h, h1, "ep_num_workers") == 11, // cannot spawn less
           "Incorrect number of threads spawned");
     return SUCCESS;
 }