diff options
Diffstat (limited to 'src/mongo/s/chunk_manager_refresh_bm.cpp')
| -rw-r--r-- | src/mongo/s/chunk_manager_refresh_bm.cpp | 165 |
1 files changed, 32 insertions, 133 deletions
diff --git a/src/mongo/s/chunk_manager_refresh_bm.cpp b/src/mongo/s/chunk_manager_refresh_bm.cpp index c3577944fab..3c7f3adb6b3 100644 --- a/src/mongo/s/chunk_manager_refresh_bm.cpp +++ b/src/mongo/s/chunk_manager_refresh_bm.cpp @@ -50,17 +50,17 @@ RoutingTableHistoryValueHandle makeStandaloneRoutingTableHistory(RoutingTableHis ComparableChunkVersion::makeComparableChunkVersion(version)); } -ShardId getShardId(int i) { - return {std::string(str::stream() << "shard_" << i)}; -} - ChunkRange getRangeForChunk(int i, int nChunks) { invariant(i >= 0); invariant(nChunks > 0); invariant(i < nChunks); - auto min = (i == 0) ? BSON("_id" << MINKEY) : BSON("_id" << (i - 1) * 100); - auto max = (i == nChunks - 1) ? BSON("_id" << MAXKEY) : BSON("_id" << i * 100); - return {std::move(min), std::move(max)}; + if (i == 0) { + return {BSON("_id" << MINKEY), BSON("_id" << 0)}; + } + if (i + 1 == nChunks) { + return {BSON("_id" << (i - 1) * 100), BSON("_id" << MAXKEY)}; + } + return {BSON("_id" << (i - 1) * 100), BSON("_id" << i * 100)}; } template <typename ShardSelectorFn> @@ -93,21 +93,21 @@ CollectionMetadata makeChunkManagerWithShardSelector(int nShards, boost::none /* chunkSizeBytes */, true, chunks); - return CollectionMetadata(ChunkManager(getShardId(0), + return CollectionMetadata(ChunkManager(ShardId("Shard0"), DatabaseVersion(UUID::gen(), Timestamp(1, 0)), makeStandaloneRoutingTableHistory(std::move(rt)), boost::none), - getShardId(0)); + ShardId("shard0")); } ShardId pessimalShardSelector(int i, int nShards, int nChunks) { - return getShardId(i % nShards); + return ShardId(str::stream() << "shard" << (i % nShards)); } ShardId optimalShardSelector(int i, int nShards, int nChunks) { invariant(nShards <= nChunks); const auto shardNum = (int64_t(i) * nShards / nChunks) % nShards; - return getShardId(shardNum); + return ShardId(str::stream() << "shard" << shardNum); } MONGO_COMPILER_NOINLINE auto makeChunkManagerWithPessimalBalancedDistribution(int nShards, @@ -124,133 +124,35 @@ MONGO_COMPILER_NOINLINE auto runIncrementalUpdate(const CollectionMetadata& cm, const std::vector<ChunkType>& newChunks) { auto rt = cm.getChunkManager()->getRoutingTableHistory_ForTest().makeUpdated( boost::none /* timeseriesFields */, boost::none, boost::none, true, newChunks); - return CollectionMetadata(ChunkManager(getShardId(0), + return CollectionMetadata(ChunkManager(ShardId("shard0"), DatabaseVersion(UUID::gen(), Timestamp(1, 0)), makeStandaloneRoutingTableHistory(std::move(rt)), boost::none), - getShardId(0)); + ShardId("shard0")); } -/* - * Simulate a refresh of the ChunkManager where a number of chunks is migrated from one shard to - * another. - * - * The chunks modified in the routing table are equally spaced. - */ -void BM_IncrementalSpacedRefreshMoveChunks(benchmark::State& state) { +void BM_IncrementalRefreshOfPessimalBalancedDistribution(benchmark::State& state) { const int nShards = state.range(0); const int nChunks = state.range(1); - const int nUpdates = state.range(2); auto metadata = makeChunkManagerWithPessimalBalancedDistribution(nShards, nChunks); - auto lastVersion = metadata.getCollVersion(); - + auto postMoveVersion = metadata.getChunkManager()->getVersion(); + const UUID uuid = metadata.getUUID(); std::vector<ChunkType> newChunks; - newChunks.reserve(nUpdates); - const auto updateSpacing = nChunks / nUpdates; - for (int i = 0; i < nUpdates; i++) { - const auto idx = i * updateSpacing; - lastVersion.incMajor(); - newChunks.emplace_back(metadata.getUUID(), - getRangeForChunk(idx, nChunks), - lastVersion, - pessimalShardSelector(idx, nShards, nChunks)); - } - - std::mt19937 g; - g.seed(456); - std::shuffle(newChunks.begin(), newChunks.end(), g); - - for (auto _ : state) { - benchmark::DoNotOptimize(runIncrementalUpdate(metadata, newChunks)); - } -} - -BENCHMARK(BM_IncrementalSpacedRefreshMoveChunks) - ->Args({4, 1, 1}) - ->Args({4, 10, 1}) - ->Args({4, 100, 1}) - ->Args({4, 1000, 1}) - ->Args({4, 10000, 1}) - ->Args({4, 100000, 1}) - ->Args({4, 10000, 10}) - ->Args({4, 10000, 100}) - ->Args({4, 10000, 1000}) - ->Args({4, 10000, 10000}); - -/* - * Simulate a refresh of the ChunkManager where a number of chunks is merged together. - */ -void BM_IncrementalSpacedRefreshMergeChunks(benchmark::State& state) { - const int nShards = state.range(0); - const int nChunks = state.range(1); - const int nUpdates = state.range(2); - auto metadata = makeChunkManagerWithOptimalBalancedDistribution(nShards, nChunks); - - auto lastVersion = metadata.getCollVersion(); + postMoveVersion.incMajor(); + newChunks.emplace_back(uuid, getRangeForChunk(1, nChunks), postMoveVersion, ShardId("shard0")); + postMoveVersion.incMajor(); + newChunks.emplace_back(uuid, getRangeForChunk(3, nChunks), postMoveVersion, ShardId("shard1")); - std::vector<ChunkType> newChunks; - newChunks.reserve(nUpdates); - invariant(nUpdates <= nShards); - const auto shardSpacing = nShards / (nUpdates + 1); - std::set<ShardId> shardsToMerge; - for (int i = 0; i < nUpdates; i++) { - invariant(i * shardSpacing <= nShards); - shardsToMerge.emplace(getShardId(i * shardSpacing)); - } - - ShardId shardId; - std::vector<ChunkRange> rangesToMerge; - - const auto flushRanges = [&] { - if (rangesToMerge.empty()) { - return; - } - - lastVersion.incMajor(); - newChunks.emplace_back( - metadata.getUUID(), - ChunkRange(rangesToMerge.front().getMin(), rangesToMerge.back().getMax()), - lastVersion, - shardId); - rangesToMerge.clear(); - }; - - for (int i = 0; i < nChunks; i++) { - auto nextShardId = pessimalShardSelector(i, nShards, nChunks); - if (nextShardId != shardId) { - flushRanges(); - shardId = nextShardId; - } - if (shardsToMerge.count(shardId) == 1) { - rangesToMerge.emplace_back(getRangeForChunk(i, nChunks)); - } - } - flushRanges(); - - std::mt19937 g; - g.seed(456); - std::shuffle(newChunks.begin(), newChunks.end(), g); - - for (auto _ : state) { + for (auto keepRunning : state) { benchmark::DoNotOptimize(runIncrementalUpdate(metadata, newChunks)); } } -/* - * Simulate chunks merge on a routing table of 10000 chunks partitioned among 4 shards. - * - * [ 0, 2500) -> shard0 - * [2500, 5000) -> shard1 - * [5000, 7500) -> shard2 - * [7500, 10000) -> shard3 - */ - -BENCHMARK(BM_IncrementalSpacedRefreshMergeChunks) - ->Args({4, 10000, 1}) // merge all chunks on shard2 - ->Args({4, 10000, 2}) // merge all chunks on shard2 and shard3 - ->Args({4, 10000, 3}) // merge all chunks on shard1, shard2 and shard3 - ->Args({4, 10000, 4}); // merge all chunks on shard1, shard2, shard3 and shard4 +BENCHMARK(BM_IncrementalRefreshOfPessimalBalancedDistribution) + ->Args({2, 50000}) + ->Args({2, 250000}) + ->Args({2, 500000}); template <typename ShardSelectorFn> auto BM_FullBuildOfChunkManager(benchmark::State& state, ShardSelectorFn selectShard) { @@ -285,11 +187,11 @@ auto BM_FullBuildOfChunkManager(benchmark::State& state, ShardSelectorFn selectS true, chunks); benchmark::DoNotOptimize( - CollectionMetadata(ChunkManager(getShardId(0), + CollectionMetadata(ChunkManager(ShardId("shard0"), DatabaseVersion(UUID::gen(), Timestamp(1, 0)), makeStandaloneRoutingTableHistory(std::move(rt)), boost::none), - getShardId(0))); + ShardId("shard0"))); } } @@ -511,14 +413,11 @@ MONGO_INITIALIZER(RegisterBenchmarks)(InitializerContext* context) { }; for (auto bmCase : bmCases) { - bmCase->Args({2, 2}) - ->Args({1, 10000}) - ->Args({10, 10000}) - ->Args({100, 10000}) - ->Args({1000, 10000}) - ->Args({10, 10}) - ->Args({10, 100}) - ->Args({10, 1000}); + bmCase->Args({2, 50000}) + ->Args({10, 50000}) + ->Args({100, 50000}) + ->Args({1000, 50000}) + ->Args({2, 2}); } } |
