This is an automated email from the ASF dual-hosted git repository.
liaoxin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new ea0e95f4c95 [opt](load) limit concurrency of delete_bitmap computation
(#52962)
ea0e95f4c95 is described below
commit ea0e95f4c95aebc5088d9f7805a6314d5a812225
Author: Kaijie Chen <[email protected]>
AuthorDate: Fri Sep 19 09:22:52 2025 +0800
[opt](load) limit concurrency of delete_bitmap computation (#52962)
### What problem does this PR solve?
Related PR: #48156
Problem Summary:
Previously, the same thread pool was used to calculate the DeleteBitmap
during both the build rowset and publish stages. This led to high CPU
usage and resource contention, especially impacting memtable flushing
performance.
To mitigate this, a dedicated thread pool is introduced for DeleteBitmap
computation during the build rowset stage. This new pool is configured
with a lower maximum thread count (8 vs. the original 32) to better
control resource consumption and reduce interference with other critical
operations.
---
be/src/cloud/cloud_storage_engine.cpp | 8 +++++++-
be/src/common/config.cpp | 2 ++
be/src/common/config.h | 2 ++
be/src/olap/calc_delete_bitmap_executor.cpp | 5 ++---
be/src/olap/calc_delete_bitmap_executor.h | 2 +-
be/src/olap/rowset/beta_rowset_writer.cpp | 2 +-
be/src/olap/storage_engine.cpp | 9 ++++++++-
be/src/olap/storage_engine.h | 5 +++++
8 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/be/src/cloud/cloud_storage_engine.cpp
b/be/src/cloud/cloud_storage_engine.cpp
index cd450714e38..83c30955b9d 100644
--- a/be/src/cloud/cloud_storage_engine.cpp
+++ b/be/src/cloud/cloud_storage_engine.cpp
@@ -204,7 +204,13 @@ Status CloudStorageEngine::open() {
cast_set<int32_t>(io::FileCacheFactory::instance()->get_cache_instance_size()));
_calc_delete_bitmap_executor =
std::make_unique<CalcDeleteBitmapExecutor>();
- _calc_delete_bitmap_executor->init();
+ _calc_delete_bitmap_executor->init(config::calc_delete_bitmap_max_thread);
+
+ _calc_delete_bitmap_executor_for_load =
std::make_unique<CalcDeleteBitmapExecutor>();
+ _calc_delete_bitmap_executor_for_load->init(
+ config::calc_delete_bitmap_for_load_max_thread > 0
+ ? config::calc_delete_bitmap_for_load_max_thread
+ : std::max(1, CpuInfo::num_cores() / 2));
// The default cache is set to 100MB, use memory limit to dynamic
adjustment
bool is_percent = false;
diff --git a/be/src/common/config.cpp b/be/src/common/config.cpp
index d9d9d8e47c9..d13f4993ca5 100644
--- a/be/src/common/config.cpp
+++ b/be/src/common/config.cpp
@@ -214,6 +214,8 @@ DEFINE_Int32(tablet_publish_txn_max_thread, "32");
DEFINE_Int32(publish_version_task_timeout_s, "8");
// the count of thread to calc delete bitmap
DEFINE_Int32(calc_delete_bitmap_max_thread, "32");
+// the num of threads to calc delete bitmap when building rowset, 0 = auto
+DEFINE_Int32(calc_delete_bitmap_for_load_max_thread, "0");
// the count of thread to calc delete bitmap worker, only used for cloud
DEFINE_Int32(calc_delete_bitmap_worker_count, "8");
// the count of thread to calc tablet delete bitmap task, only used for cloud
diff --git a/be/src/common/config.h b/be/src/common/config.h
index 3c801e94d43..079ce9ead15 100644
--- a/be/src/common/config.h
+++ b/be/src/common/config.h
@@ -258,6 +258,8 @@ DECLARE_Int32(tablet_publish_txn_max_thread);
DECLARE_Int32(publish_version_task_timeout_s);
// the count of thread to calc delete bitmap
DECLARE_Int32(calc_delete_bitmap_max_thread);
+// the num of threads to calc delete bitmap when building rowset
+DECLARE_Int32(calc_delete_bitmap_for_load_max_thread);
// the count of thread to calc delete bitmap worker, only used for cloud
DECLARE_Int32(calc_delete_bitmap_worker_count);
// the count of thread to calc tablet delete bitmap task, only used for cloud
diff --git a/be/src/olap/calc_delete_bitmap_executor.cpp
b/be/src/olap/calc_delete_bitmap_executor.cpp
index dadc0a22aa2..28cb0038771 100644
--- a/be/src/olap/calc_delete_bitmap_executor.cpp
+++ b/be/src/olap/calc_delete_bitmap_executor.cpp
@@ -21,7 +21,6 @@
#include <ostream>
-#include "common/config.h"
#include "common/logging.h"
#include "olap/base_tablet.h"
#include "olap/memtable.h"
@@ -93,10 +92,10 @@ Status CalcDeleteBitmapToken::wait() {
return _status;
}
-void CalcDeleteBitmapExecutor::init() {
+void CalcDeleteBitmapExecutor::init(int max_threads) {
static_cast<void>(ThreadPoolBuilder("TabletCalcDeleteBitmapThreadPool")
.set_min_threads(1)
-
.set_max_threads(config::calc_delete_bitmap_max_thread)
+ .set_max_threads(max_threads)
.build(&_thread_pool));
}
diff --git a/be/src/olap/calc_delete_bitmap_executor.h
b/be/src/olap/calc_delete_bitmap_executor.h
index ae2d154bd85..040fe1d40e5 100644
--- a/be/src/olap/calc_delete_bitmap_executor.h
+++ b/be/src/olap/calc_delete_bitmap_executor.h
@@ -85,7 +85,7 @@ public:
~CalcDeleteBitmapExecutor() { _thread_pool->shutdown(); }
// init should be called after storage engine is opened,
- void init();
+ void init(int max_threads);
std::unique_ptr<CalcDeleteBitmapToken> create_token();
diff --git a/be/src/olap/rowset/beta_rowset_writer.cpp
b/be/src/olap/rowset/beta_rowset_writer.cpp
index c78724324ef..71760b343f7 100644
--- a/be/src/olap/rowset/beta_rowset_writer.cpp
+++ b/be/src/olap/rowset/beta_rowset_writer.cpp
@@ -364,7 +364,7 @@ Status BetaRowsetWriter::init(const RowsetWriterContext&
rowset_writer_context)
_segcompaction_worker->init_mem_tracker(rowset_writer_context);
}
if (_context.mow_context != nullptr) {
- _calc_delete_bitmap_token =
_engine.calc_delete_bitmap_executor()->create_token();
+ _calc_delete_bitmap_token =
_engine.calc_delete_bitmap_executor_for_load()->create_token();
}
return Status::OK();
}
diff --git a/be/src/olap/storage_engine.cpp b/be/src/olap/storage_engine.cpp
index f6163066405..83dabfc0a61 100644
--- a/be/src/olap/storage_engine.cpp
+++ b/be/src/olap/storage_engine.cpp
@@ -303,7 +303,13 @@ Status StorageEngine::_open() {
_memtable_flush_executor->init(_disk_num);
_calc_delete_bitmap_executor =
std::make_unique<CalcDeleteBitmapExecutor>();
- _calc_delete_bitmap_executor->init();
+ _calc_delete_bitmap_executor->init(config::calc_delete_bitmap_max_thread);
+
+ _calc_delete_bitmap_executor_for_load =
std::make_unique<CalcDeleteBitmapExecutor>();
+ _calc_delete_bitmap_executor_for_load->init(
+ config::calc_delete_bitmap_for_load_max_thread > 0
+ ? config::calc_delete_bitmap_for_load_max_thread
+ : std::max(1, CpuInfo::num_cores() / 2));
_parse_default_rowset_type();
@@ -763,6 +769,7 @@ void StorageEngine::stop() {
_memtable_flush_executor.reset(nullptr);
_calc_delete_bitmap_executor.reset(nullptr);
+ _calc_delete_bitmap_executor_for_load.reset();
_stopped = true;
LOG(INFO) << "Storage engine is stopped.";
diff --git a/be/src/olap/storage_engine.h b/be/src/olap/storage_engine.h
index 03945c3fbb8..b55b2f1863b 100644
--- a/be/src/olap/storage_engine.h
+++ b/be/src/olap/storage_engine.h
@@ -134,6 +134,10 @@ public:
return _calc_delete_bitmap_executor.get();
}
+ CalcDeleteBitmapExecutor* calc_delete_bitmap_executor_for_load() {
+ return _calc_delete_bitmap_executor_for_load.get();
+ }
+
void add_quering_rowset(RowsetSharedPtr rs);
RowsetSharedPtr get_quering_rowset(RowsetId rs_id);
@@ -163,6 +167,7 @@ protected:
std::unique_ptr<RowsetIdGenerator> _rowset_id_generator;
std::unique_ptr<MemTableFlushExecutor> _memtable_flush_executor;
std::unique_ptr<CalcDeleteBitmapExecutor> _calc_delete_bitmap_executor;
+ std::unique_ptr<CalcDeleteBitmapExecutor>
_calc_delete_bitmap_executor_for_load;
CountDownLatch _stop_background_threads_latch;
// Hold reference of quering rowsets
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]