MB-36956: Add ExecutorBench LongLived benchmark
MB-36956: Add ExecutorBench LongLived benchmark

Benchmark a long-lived task (runs once, then sleeps, then run
again...).  Measure how long it takes to:

- wake the Task to run on a background thread (to run asap),
- then run that Task and notify back to the main thread.

This is the pattern of the Flusher - it creates a Flusher task per
shard, then runs that task whenever there is pending items to flush
for a vBucket in that shard.

This is a multithreaded benchmark - N sets of "benchmark" and NonIO
threads are created. The benchmark threads repeatedly wake a Task to
be run to perform some work asynchronously, then waits on the
result. The background NonIO threads pickup the Task and run it, then
notifies the requesting thread via a condition variable.

By creating multiple benchmark threads we can measure the performance
of the ExecutorPool's scheduling implementation. By creating multiple
background NonIO threads we can measure the performance of the actual
dispatch of Tasks on a ThreadPool.

Results:

    ----------------------------------------------------------------------------------------------------------------------------------------------------------
    Benchmark                                                                                                Time             CPU   Iterations UserCounters...
    ----------------------------------------------------------------------------------------------------------------------------------------------------------
    ExecutorPoolFixture<CB3ExecutorPool>/LongLivedScheduleRun_CB3/Tasks:16/real_time/threads:1            9902 ns         7908 ns        71757 items_per_second=100.986k/s
    ExecutorPoolFixture<CB3ExecutorPool>/LongLivedScheduleRun_CB3/Tasks:16/real_time/threads:2            7310 ns         9316 ns        98142 items_per_second=136.794k/s
    ExecutorPoolFixture<CB3ExecutorPool>/LongLivedScheduleRun_CB3/Tasks:16/real_time/threads:4            9767 ns        12351 ns        72516 items_per_second=102.382k/s
    ExecutorPoolFixture<CB3ExecutorPool>/LongLivedScheduleRun_CB3/Tasks:16/real_time/threads:8           10785 ns        13131 ns        64136 items_per_second=92.7216k/s
    ExecutorPoolFixture<CB3ExecutorPool>/LongLivedScheduleRun_CB3/Tasks:16/real_time/threads:16          11016 ns        13625 ns        63424 items_per_second=90.7754k/s
    ExecutorPoolFixture<CB3ExecutorPool>/LongLivedScheduleRun_CB3/Tasks:64/real_time/threads:1           11748 ns         9302 ns        59774 items_per_second=85.1244k/s
    ExecutorPoolFixture<CB3ExecutorPool>/LongLivedScheduleRun_CB3/Tasks:64/real_time/threads:2            7913 ns        10193 ns        89868 items_per_second=126.378k/s
    ExecutorPoolFixture<CB3ExecutorPool>/LongLivedScheduleRun_CB3/Tasks:64/real_time/threads:4           10839 ns        13545 ns        63420 items_per_second=92.2577k/s
    ExecutorPoolFixture<CB3ExecutorPool>/LongLivedScheduleRun_CB3/Tasks:64/real_time/threads:8           11592 ns        13852 ns        61208 items_per_second=86.2675k/s
    ExecutorPoolFixture<CB3ExecutorPool>/LongLivedScheduleRun_CB3/Tasks:64/real_time/threads:16          11661 ns        14015 ns        59920 items_per_second=85.756k/s
    ExecutorPoolFixture<FollyExecutorPool>/LongLivedScheduleRun_Folly/Tasks:16/real_time/threads:1       42963 ns         3709 ns       131831 items_per_second=23.2757k/s
    ExecutorPoolFixture<FollyExecutorPool>/LongLivedScheduleRun_Folly/Tasks:16/real_time/threads:2        4931 ns         6835 ns       144234 items_per_second=202.819k/s
    ExecutorPoolFixture<FollyExecutorPool>/LongLivedScheduleRun_Folly/Tasks:16/real_time/threads:4        4426 ns         7635 ns       163556 items_per_second=225.941k/s
    ExecutorPoolFixture<FollyExecutorPool>/LongLivedScheduleRun_Folly/Tasks:16/real_time/threads:8        4321 ns         7425 ns       160832 items_per_second=231.447k/s
    ExecutorPoolFixture<FollyExecutorPool>/LongLivedScheduleRun_Folly/Tasks:16/real_time/threads:16       4964 ns         9034 ns       148096 items_per_second=201.47k/s
    ExecutorPoolFixture<FollyExecutorPool>/LongLivedScheduleRun_Folly/Tasks:64/real_time/threads:1        4328 ns         3879 ns       163566 items_per_second=231.047k/s
    ExecutorPoolFixture<FollyExecutorPool>/LongLivedScheduleRun_Folly/Tasks:64/real_time/threads:2     1502527 ns         6124 ns         2000 items_per_second=665.545/s
    ExecutorPoolFixture<FollyExecutorPool>/LongLivedScheduleRun_Folly/Tasks:64/real_time/threads:4        4306 ns         7375 ns       180296 items_per_second=232.25k/s
    ExecutorPoolFixture<FollyExecutorPool>/LongLivedScheduleRun_Folly/Tasks:64/real_time/threads:8        4290 ns         7400 ns       164904 items_per_second=233.089k/s
    ExecutorPoolFixture<FollyExecutorPool>/LongLivedScheduleRun_Folly/Tasks:64/real_time/threads:16       4328 ns         7401 ns       155664 items_per_second=231.058k/s

CB3ExecutorPool is around 100K wakes per second, slifhtly degrating to
~85k wakes per second when thread count increases to 16.

FollyExecutorPool is around 200k wakes per second; relatively
consistent as thread counts increase. There are some strange results
at threads:1 and Tasks:16 - only 23k wakes per second, which require
further analysis / tuning.

Change-Id: I90b53f40c4d1180d4a5a955d350194a4319beb98

daverigby/kv_engine,daverigby/kv_engine,daverigby/kv_engine,daverigby/kv_engine