This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 1a81b9e  [MemTracker] Some enchance of MemTracker (#5783)
1a81b9e is described below

commit 1a81b9e1609370923472ab5af7db8036046df137
Author: HappenLee <[email protected]>
AuthorDate: Tue May 18 20:27:50 2021 -0500

    [MemTracker] Some enchance of MemTracker (#5783)
    
    1 Make some MemTracker have reasonable parent MemTracker not the root 
tracker
    2 Make each MemTracker can be easily to trace.
    3 Add show level of MemTracker to reduce the MemTracker show in the web 
page to have a way to control show how many tracker in web page.
---
 be/src/common/config.h                             |  6 ++
 be/src/exec/olap_scanner.cpp                       | 14 ++---
 be/src/exec/olap_scanner.h                         |  2 +
 be/src/exec/tablet_sink.cpp                        |  2 +-
 be/src/olap/compaction.cpp                         | 10 ++--
 be/src/olap/lru_cache.cpp                          |  2 +-
 be/src/olap/memtable.cpp                           |  2 +-
 be/src/olap/row_block2.cpp                         |  3 +-
 be/src/olap/rowset/beta_rowset_reader.cpp          | 21 ++++---
 be/src/olap/rowset/beta_rowset_reader.h            |  2 +-
 be/src/olap/rowset/segment_v2/segment.cpp          |  2 +-
 be/src/olap/rowset/segment_v2/segment_iterator.cpp |  2 +-
 be/src/olap/schema_change.cpp                      |  9 ++-
 be/src/olap/tablet.cpp                             | 10 ++--
 be/src/olap/tablet.h                               |  7 ++-
 be/src/runtime/data_stream_recvr.cc                |  2 +-
 be/src/runtime/data_stream_sender.cpp              |  3 +-
 be/src/runtime/exec_env_init.cpp                   |  4 +-
 be/src/runtime/export_sink.cpp                     |  3 +-
 be/src/runtime/load_channel.cpp                    |  2 +-
 be/src/runtime/mem_tracker.cpp                     | 64 +++++++++++++++++-----
 be/src/runtime/mem_tracker.h                       | 12 +++-
 be/src/runtime/plan_fragment_executor.cpp          |  2 +-
 be/src/runtime/runtime_state.cpp                   |  4 +-
 be/src/runtime/tablets_channel.cpp                 |  2 +-
 docs/en/administrator-guide/config/be_config.md    | 14 ++++-
 docs/zh-CN/administrator-guide/config/be_config.md | 10 ++++
 27 files changed, 150 insertions(+), 66 deletions(-)

diff --git a/be/src/common/config.h b/be/src/common/config.h
index c9a8790..d70f935 100644
--- a/be/src/common/config.h
+++ b/be/src/common/config.h
@@ -598,6 +598,12 @@ CONF_Int32(aws_log_level, "3");
 // the buffer size when read data from remote storage like s3
 CONF_mInt32(remote_storage_read_buffer_mb, "256");
 
+// Default level of MemTracker to show in web page
+// now MemTracker support two level:
+//      RELEASE: 0
+//      DEBUG: 1
+// the level equal or lower than mem_tracker_level will show in web page
+CONF_Int16(mem_tracker_level, "0");
 } // namespace config
 
 } // namespace doris
diff --git a/be/src/exec/olap_scanner.cpp b/be/src/exec/olap_scanner.cpp
index 76273d7..10ce02d 100644
--- a/be/src/exec/olap_scanner.cpp
+++ b/be/src/exec/olap_scanner.cpp
@@ -47,7 +47,11 @@ OlapScanner::OlapScanner(RuntimeState* runtime_state, 
OlapScanNode* parent, bool
           _aggregation(aggregation),
           _need_agg_finalize(need_agg_finalize),
           _tuple_idx(parent->_tuple_idx),
-          _direct_conjunct_size(parent->_direct_conjunct_size) {
+          _direct_conjunct_size(parent->_direct_conjunct_size),
+          
_mem_tracker(MemTracker::CreateTracker(runtime_state->fragment_mem_tracker()->limit(),
+                                             "OlapScanner",
+                                             
runtime_state->fragment_mem_tracker(),
+                                             true, true, 
MemTrackerLevel::DEBUG)) {
     _reader.reset(new Reader());
     DCHECK(_reader.get() != NULL);
 
@@ -90,7 +94,7 @@ Status OlapScanner::prepare(const TPaloScanRange& scan_range,
             // the rowsets maybe compacted when the last olap scanner starts
             Version rd_version(0, _version);
             OLAPStatus acquire_reader_st =
-                    _tablet->capture_rs_readers(rd_version, 
&_params.rs_readers);
+                    _tablet->capture_rs_readers(rd_version, 
&_params.rs_readers, _mem_tracker);
             if (acquire_reader_st != OLAP_SUCCESS) {
                 LOG(WARNING) << "fail to init reader.res=" << 
acquire_reader_st;
                 std::stringstream ss;
@@ -248,11 +252,7 @@ Status OlapScanner::get_batch(RuntimeState* state, 
RowBatch* batch, bool* eof) {
     bzero(tuple_buf, state->batch_size() * _tuple_desc->byte_size());
     Tuple* tuple = reinterpret_cast<Tuple*>(tuple_buf);
 
-    auto tracker = 
MemTracker::CreateTracker(state->fragment_mem_tracker()->limit(),
-                                             "OlapScanner:" + 
print_id(state->query_id()),
-                                             state->fragment_mem_tracker());
-    std::unique_ptr<MemPool> mem_pool(new MemPool(tracker.get()));
-
+    std::unique_ptr<MemPool> mem_pool(new MemPool(_mem_tracker.get()));
     int64_t raw_rows_threshold = raw_rows_read() + 
config::doris_scanner_row_num;
     {
         SCOPED_TIMER(_parent->_scan_timer);
diff --git a/be/src/exec/olap_scanner.h b/be/src/exec/olap_scanner.h
index 08b6035..15cf13b 100644
--- a/be/src/exec/olap_scanner.h
+++ b/be/src/exec/olap_scanner.h
@@ -145,6 +145,8 @@ private:
     bool _is_closed = false;
 
     MonotonicStopWatch _watcher;
+
+    std::shared_ptr<MemTracker> _mem_tracker;
 };
 
 } // namespace doris
diff --git a/be/src/exec/tablet_sink.cpp b/be/src/exec/tablet_sink.cpp
index 5208941..60b1706 100644
--- a/be/src/exec/tablet_sink.cpp
+++ b/be/src/exec/tablet_sink.cpp
@@ -534,7 +534,7 @@ Status OlapTableSink::prepare(RuntimeState* state) {
     // profile must add to state's object pool
     _profile = state->obj_pool()->add(new RuntimeProfile("OlapTableSink"));
     _mem_tracker = MemTracker::CreateTracker(-1, "OlapTableSink:" + 
std::to_string(state->load_job_id()),
-                                             state->instance_mem_tracker());
+                                             state->instance_mem_tracker(), 
true, false);
 
     SCOPED_TIMER(_profile->total_time_counter());
 
diff --git a/be/src/olap/compaction.cpp b/be/src/olap/compaction.cpp
index 6a47c89..ee57e39 100644
--- a/be/src/olap/compaction.cpp
+++ b/be/src/olap/compaction.cpp
@@ -28,9 +28,11 @@ namespace doris {
 
 Compaction::Compaction(TabletSharedPtr tablet, const std::string& label,
                        const std::shared_ptr<MemTracker>& parent_tracker)
-        : _mem_tracker(MemTracker::CreateTracker(-1, label, parent_tracker)),
-          _readers_tracker(MemTracker::CreateTracker(-1, 
"CompactionReaderTracker:" + std::to_string(tablet->tablet_id()), 
_mem_tracker)),
-          _writer_tracker(MemTracker::CreateTracker(-1, 
"CompationWriterTracker:" + std::to_string(tablet->tablet_id()), _mem_tracker)),
+        : _mem_tracker(MemTracker::CreateTracker(-1, label, parent_tracker, 
true, false)),
+          _readers_tracker(MemTracker::CreateTracker(-1, 
"CompactionReaderTracker:" + std::to_string(tablet->tablet_id()), _mem_tracker,
+                  true, false)),
+          _writer_tracker(MemTracker::CreateTracker(-1, 
"CompationWriterTracker:" + std::to_string(tablet->tablet_id()), _mem_tracker,
+                  true, false)),
           _tablet(tablet),
           _input_rowsets_size(0),
           _input_row_num(0),
@@ -171,7 +173,7 @@ OLAPStatus Compaction::construct_input_rowset_readers() {
         RETURN_NOT_OK(rowset->create_reader(
                 MemTracker::CreateTracker(
                         -1, "Compaction:RowsetReader:" + 
rowset->rowset_id().to_string(),
-                        _readers_tracker),
+                        _readers_tracker, true, true, MemTrackerLevel::DEBUG),
                 &rs_reader));
         _input_rs_readers.push_back(std::move(rs_reader));
     }
diff --git a/be/src/olap/lru_cache.cpp b/be/src/olap/lru_cache.cpp
index 81da1b8..0abf428 100644
--- a/be/src/olap/lru_cache.cpp
+++ b/be/src/olap/lru_cache.cpp
@@ -400,7 +400,7 @@ uint32_t ShardedLRUCache::_shard(uint32_t hash) {
 
 ShardedLRUCache::ShardedLRUCache(const std::string& name, size_t 
total_capacity, std::shared_ptr<MemTracker> parent)
         : _name(name), _last_id(1),
-        _mem_tracker(MemTracker::CreateTracker(-1, name, parent, true)) {
+        _mem_tracker(MemTracker::CreateTracker(-1, name, parent, true, false)) 
{
     const size_t per_shard = (total_capacity + (kNumShards - 1)) / kNumShards;
     for (int s = 0; s < kNumShards; s++) {
         _shards[s].set_capacity(per_shard);
diff --git a/be/src/olap/memtable.cpp b/be/src/olap/memtable.cpp
index 4ee8b4a..f728af5 100644
--- a/be/src/olap/memtable.cpp
+++ b/be/src/olap/memtable.cpp
@@ -40,7 +40,7 @@ MemTable::MemTable(int64_t tablet_id, Schema* schema, const 
TabletSchema* tablet
           _slot_descs(slot_descs),
           _keys_type(keys_type),
           _row_comparator(_schema),
-          _mem_tracker(MemTracker::CreateTracker(-1, "MemTable:" + 
std::to_string(tablet_id), parent_tracker)),
+          _mem_tracker(MemTracker::CreateTracker(-1, "MemTable", 
parent_tracker)),
           _buffer_mem_pool(new MemPool(_mem_tracker.get())),
           _table_mem_pool(new MemPool(_mem_tracker.get())),
           _schema_size(_schema->schema_size()),
diff --git a/be/src/olap/row_block2.cpp b/be/src/olap/row_block2.cpp
index 2b940bd..94d600d 100644
--- a/be/src/olap/row_block2.cpp
+++ b/be/src/olap/row_block2.cpp
@@ -18,6 +18,7 @@
 #include "olap/row_block2.h"
 
 #include <sstream>
+#include <utility>
 
 #include "gutil/strings/substitute.h"
 #include "olap/row_cursor.h"
@@ -33,7 +34,7 @@ RowBlockV2::RowBlockV2(const Schema& schema, uint16_t 
capacity, std::shared_ptr<
         : _schema(schema),
           _capacity(capacity),
           _column_vector_batches(_schema.num_columns()),
-          _tracker(MemTracker::CreateTracker(-1, "RowBlockV2", parent)),
+          _tracker(MemTracker::CreateTracker(-1, "RowBlockV2", 
std::move(parent))),
           _pool(new MemPool(_tracker.get())),
           _selection_vector(nullptr) {
     for (auto cid : _schema.column_ids()) {
diff --git a/be/src/olap/rowset/beta_rowset_reader.cpp 
b/be/src/olap/rowset/beta_rowset_reader.cpp
index 0f5899c..7a3c49b 100644
--- a/be/src/olap/rowset/beta_rowset_reader.cpp
+++ b/be/src/olap/rowset/beta_rowset_reader.cpp
@@ -17,6 +17,8 @@
 
 #include "beta_rowset_reader.h"
 
+#include <utility>
+
 #include "olap/delete_handler.h"
 #include "olap/generic_iterators.h"
 #include "olap/row_block.h"
@@ -28,12 +30,17 @@
 namespace doris {
 
 BetaRowsetReader::BetaRowsetReader(BetaRowsetSharedPtr rowset,
-                                   const std::shared_ptr<MemTracker>& 
parent_tracker)
-        : _rowset(std::move(rowset)), _stats(&_owned_stats), 
_parent_tracker(parent_tracker) {
+                                   std::shared_ptr<MemTracker>  parent_tracker)
+        : _rowset(std::move(rowset)), _stats(&_owned_stats), 
_parent_tracker(std::move(parent_tracker)) {
     _rowset->aquire();
 }
 
 OLAPStatus BetaRowsetReader::init(RowsetReaderContext* read_context) {
+    // If do not init the RowsetReader with a parent_tracker, use the 
runtime_state instance_mem_tracker
+    if (_parent_tracker == nullptr && read_context->runtime_state != nullptr) {
+        _parent_tracker = read_context->runtime_state->instance_mem_tracker();
+    }
+
     RETURN_NOT_OK(_rowset->load(true, _parent_tracker));
     _context = read_context;
     if (_context->stats != nullptr) {
@@ -110,13 +117,9 @@ OLAPStatus BetaRowsetReader::init(RowsetReaderContext* 
read_context) {
     // init input block
     _input_block.reset(new RowBlockV2(schema, 1024, _parent_tracker));
 
-    // init output block and row
-    if (_parent_tracker == nullptr && read_context->runtime_state != nullptr) {
-        _output_block.reset(new RowBlock(read_context->tablet_schema,
-                                         
read_context->runtime_state->instance_mem_tracker()));
-    } else {
-        _output_block.reset(new RowBlock(read_context->tablet_schema, 
_parent_tracker));
-    }
+    // init input/output block and row
+    _output_block.reset(new RowBlock(read_context->tablet_schema, 
_parent_tracker));
+
     RowBlockInfo output_block_info;
     output_block_info.row_num = 1024;
     output_block_info.null_supported = true;
diff --git a/be/src/olap/rowset/beta_rowset_reader.h 
b/be/src/olap/rowset/beta_rowset_reader.h
index 1318d89..6d8a3f1 100644
--- a/be/src/olap/rowset/beta_rowset_reader.h
+++ b/be/src/olap/rowset/beta_rowset_reader.h
@@ -30,7 +30,7 @@ namespace doris {
 class BetaRowsetReader : public RowsetReader {
 public:
     BetaRowsetReader(BetaRowsetSharedPtr rowset,
-                     const std::shared_ptr<MemTracker>& parent_tracker = 
nullptr);
+                     std::shared_ptr<MemTracker> parent_tracker = nullptr);
 
     ~BetaRowsetReader() override { _rowset->release(); }
 
diff --git a/be/src/olap/rowset/segment_v2/segment.cpp 
b/be/src/olap/rowset/segment_v2/segment.cpp
index f8e6024..992d8c4 100644
--- a/be/src/olap/rowset/segment_v2/segment.cpp
+++ b/be/src/olap/rowset/segment_v2/segment.cpp
@@ -46,7 +46,7 @@ Status Segment::open(std::string filename, uint32_t 
segment_id, const TabletSche
 
 Segment::Segment(std::string fname, uint32_t segment_id, const TabletSchema* 
tablet_schema, std::shared_ptr<MemTracker> parent)
         : _fname(std::move(fname)), _segment_id(segment_id),
-          _tablet_schema(tablet_schema), 
_mem_tracker(MemTracker::CreateTracker(-1, "Segment", std::move(parent), 
false)) {}
+          _tablet_schema(tablet_schema), 
_mem_tracker(MemTracker::CreateTracker(-1, "Segment", std::move(parent), false, 
true)) {}
 
 Segment::~Segment() {
     _mem_tracker->Release(_mem_tracker->consumption());
diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp 
b/be/src/olap/rowset/segment_v2/segment_iterator.cpp
index 67c5adf..859cca5 100644
--- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp
+++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp
@@ -189,7 +189,7 @@ Status SegmentIterator::_prepare_seek(const 
StorageReadOptions::KeyRange& key_ra
         }
     }
     _seek_schema.reset(new Schema(key_fields, key_fields.size()));
-    _seek_block.reset(new RowBlockV2(*_seek_schema, 1));
+    _seek_block.reset(new RowBlockV2(*_seek_schema, 1, _mem_tracker));
 
     // create used column iterator
     for (auto cid : _seek_schema->column_ids()) {
diff --git a/be/src/olap/schema_change.cpp b/be/src/olap/schema_change.cpp
index e738897..7d69f60 100644
--- a/be/src/olap/schema_change.cpp
+++ b/be/src/olap/schema_change.cpp
@@ -1338,7 +1338,7 @@ bool 
SchemaChangeWithSorting::_external_sorting(vector<RowsetSharedPtr>& src_row
     std::vector<RowsetReaderSharedPtr> rs_readers;
     for (auto& rowset : src_rowsets) {
         RowsetReaderSharedPtr rs_reader;
-        auto res = rowset->create_reader(&rs_reader);
+        auto res = rowset->create_reader(_mem_tracker, &rs_reader);
         if (res != OLAP_SUCCESS) {
             LOG(WARNING) << "failed to create rowset reader.";
             return false;
@@ -1473,6 +1473,9 @@ OLAPStatus 
SchemaChangeHandler::_do_process_alter_tablet_v2(const TAlterTabletRe
     // for schema change, seek_columns is the same to return_columns
     reader_context.seek_columns = &return_columns;
 
+    auto mem_tracker = MemTracker::CreateTracker(-1, "AlterTablet:" + 
std::to_string(base_tablet->tablet_id()) + "-"
+        + std::to_string(new_tablet->tablet_id()), _mem_tracker, true, false, 
MemTrackerLevel::DEBUG);
+
     do {
         // get history data to be converted and it will check if there is hold 
in base tablet
         res = _get_versions_to_be_changed(base_tablet, 
&versions_to_be_changed);
@@ -1535,7 +1538,7 @@ OLAPStatus 
SchemaChangeHandler::_do_process_alter_tablet_v2(const TAlterTabletRe
         }
 
         // acquire data sources correspond to history versions
-        base_tablet->capture_rs_readers(versions_to_be_changed, &rs_readers);
+        base_tablet->capture_rs_readers(versions_to_be_changed, &rs_readers, 
mem_tracker);
         if (rs_readers.size() < 1) {
             LOG(WARNING) << "fail to acquire all data sources. "
                          << "version_num=" << versions_to_be_changed.size()
@@ -1688,7 +1691,7 @@ OLAPStatus 
SchemaChangeHandler::schema_version_convert(TabletSharedPtr base_tabl
     reader_context.seek_columns = &return_columns;
 
     RowsetReaderSharedPtr rowset_reader;
-    RETURN_NOT_OK((*base_rowset)->create_reader(&rowset_reader));
+    RETURN_NOT_OK((*base_rowset)->create_reader(_mem_tracker, &rowset_reader));
     rowset_reader->init(&reader_context);
 
     RowsetWriterContext writer_context;
diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp
index 7866f0f..7921d04 100644
--- a/be/src/olap/tablet.cpp
+++ b/be/src/olap/tablet.cpp
@@ -628,15 +628,17 @@ OLAPStatus Tablet::_capture_consistent_rowsets_unlocked(
 }
 
 OLAPStatus Tablet::capture_rs_readers(const Version& spec_version,
-                                      std::vector<RowsetReaderSharedPtr>* 
rs_readers) const {
+                                      std::vector<RowsetReaderSharedPtr>* 
rs_readers,
+                                      std::shared_ptr<MemTracker> 
parent_tracker) const {
     std::vector<Version> version_path;
     RETURN_NOT_OK(capture_consistent_versions(spec_version, &version_path));
-    RETURN_NOT_OK(capture_rs_readers(version_path, rs_readers));
+    RETURN_NOT_OK(capture_rs_readers(version_path, rs_readers, 
parent_tracker));
     return OLAP_SUCCESS;
 }
 
 OLAPStatus Tablet::capture_rs_readers(const std::vector<Version>& version_path,
-                                      std::vector<RowsetReaderSharedPtr>* 
rs_readers) const {
+                                      std::vector<RowsetReaderSharedPtr>* 
rs_readers,
+                                      std::shared_ptr<MemTracker> 
parent_tracker) const {
     DCHECK(rs_readers != nullptr && rs_readers->empty());
     for (auto version : version_path) {
         auto it = _rs_version_map.find(version);
@@ -653,7 +655,7 @@ OLAPStatus Tablet::capture_rs_readers(const 
std::vector<Version>& version_path,
             }
         }
         RowsetReaderSharedPtr rs_reader;
-        auto res = it->second->create_reader(&rs_reader);
+        auto res = it->second->create_reader(parent_tracker, &rs_reader);
         if (res != OLAP_SUCCESS) {
             LOG(WARNING) << "failed to create reader for rowset:" << 
it->second->rowset_id();
             return OLAP_ERR_CAPTURE_ROWSET_READER_ERROR;
diff --git a/be/src/olap/tablet.h b/be/src/olap/tablet.h
index 1102fb5..7da632e 100644
--- a/be/src/olap/tablet.h
+++ b/be/src/olap/tablet.h
@@ -121,9 +121,12 @@ public:
     OLAPStatus capture_consistent_rowsets(const Version& spec_version,
                                           vector<RowsetSharedPtr>* rowsets) 
const;
     OLAPStatus capture_rs_readers(const Version& spec_version,
-                                  vector<RowsetReaderSharedPtr>* rs_readers) 
const;
+                                  vector<RowsetReaderSharedPtr>* rs_readers,
+                                  std::shared_ptr<MemTracker> parent_tracker = 
nullptr) const;
+
     OLAPStatus capture_rs_readers(const vector<Version>& version_path,
-                                  vector<RowsetReaderSharedPtr>* rs_readers) 
const;
+                                  vector<RowsetReaderSharedPtr>* rs_readers,
+                                  std::shared_ptr<MemTracker> parent_tracker = 
nullptr) const;
 
     DelPredicateArray delete_predicates() { return 
_tablet_meta->delete_predicates(); }
     void add_delete_predicate(const DeletePredicatePB& delete_predicate, 
int64_t version);
diff --git a/be/src/runtime/data_stream_recvr.cc 
b/be/src/runtime/data_stream_recvr.cc
index fd3a536..cba524e 100644
--- a/be/src/runtime/data_stream_recvr.cc
+++ b/be/src/runtime/data_stream_recvr.cc
@@ -447,7 +447,7 @@ DataStreamRecvr::DataStreamRecvr(
           _profile(profile),
           _sub_plan_query_statistics_recvr(sub_plan_query_statistics_recvr) {
     _mem_tracker = MemTracker::CreateTracker(
-            _profile, -1, "DataStreamRecvr:" + 
print_id(_fragment_instance_id), parent_tracker);
+            _profile, -1, "DataStreamRecvr", parent_tracker);
 
     // Create one queue per sender if is_merging is true.
     int num_queues = is_merging ? num_senders : 1;
diff --git a/be/src/runtime/data_stream_sender.cpp 
b/be/src/runtime/data_stream_sender.cpp
index 343baf5..a8a500b 100644
--- a/be/src/runtime/data_stream_sender.cpp
+++ b/be/src/runtime/data_stream_sender.cpp
@@ -469,8 +469,7 @@ Status DataStreamSender::prepare(RuntimeState* state) {
     _profile = _pool->add(new RuntimeProfile(title.str()));
     SCOPED_TIMER(_profile->total_time_counter());
     _mem_tracker = MemTracker::CreateTracker(
-            _profile, -1, "DataStreamSender:" + 
print_id(state->fragment_instance_id()),
-            state->instance_mem_tracker());
+            _profile, -1, "DataStreamSender", state->instance_mem_tracker());
 
     if (_part_type == TPartitionType::UNPARTITIONED || _part_type == 
TPartitionType::RANDOM) {
         // Randomize the order we open/transmit to channels to avoid 
thundering herd problems.
diff --git a/be/src/runtime/exec_env_init.cpp b/be/src/runtime/exec_env_init.cpp
index 39b9a2a..7bd31a3 100644
--- a/be/src/runtime/exec_env_init.cpp
+++ b/be/src/runtime/exec_env_init.cpp
@@ -185,8 +185,8 @@ Status ExecEnv::_init_mem_tracker() {
         return Status::InternalError(ss.str());
     }
 
-    _mem_tracker =
-            MemTracker::CreateTracker(bytes_limit, "Query", 
MemTracker::GetRootTracker());
+    _mem_tracker = MemTracker::CreateTracker(bytes_limit, "Query", 
MemTracker::GetRootTracker(),
+                    false, false);
 
     LOG(INFO) << "Using global memory limit: " << 
PrettyPrinter::print(bytes_limit, TUnit::BYTES);
     RETURN_IF_ERROR(_disk_io_mgr->init(_mem_tracker));
diff --git a/be/src/runtime/export_sink.cpp b/be/src/runtime/export_sink.cpp
index 0e88bb4..5e4d2cc 100644
--- a/be/src/runtime/export_sink.cpp
+++ b/be/src/runtime/export_sink.cpp
@@ -72,8 +72,7 @@ Status ExportSink::prepare(RuntimeState* state) {
 
     _mem_tracker = MemTracker::CreateTracker(
             -1,
-            "ExportSink:" + print_id(state->fragment_instance_id()),
-            state->instance_mem_tracker());
+            "ExportSink", state->instance_mem_tracker());
 
     // Prepare the exprs to run.
     RETURN_IF_ERROR(Expr::prepare(_output_expr_ctxs, state, _row_desc, 
_mem_tracker));
diff --git a/be/src/runtime/load_channel.cpp b/be/src/runtime/load_channel.cpp
index 30c2f2f..d6ade09 100644
--- a/be/src/runtime/load_channel.cpp
+++ b/be/src/runtime/load_channel.cpp
@@ -27,7 +27,7 @@ LoadChannel::LoadChannel(const UniqueId& load_id, int64_t 
mem_limit, int64_t tim
                          const std::shared_ptr<MemTracker>& mem_tracker)
         : _load_id(load_id), _timeout_s(timeout_s) {
     _mem_tracker = MemTracker::CreateTracker(
-            mem_limit, "LoadChannel:" + _load_id.to_string(), mem_tracker);
+            mem_limit, "LoadChannel:" + _load_id.to_string(), mem_tracker, 
true, false);
     // _last_updated_time should be set before being inserted to
     // _load_channels in load_channel_mgr, or it may be erased
     // immediately by gc thread.
diff --git a/be/src/runtime/mem_tracker.cpp b/be/src/runtime/mem_tracker.cpp
index 2c5fac4..bdb8030 100644
--- a/be/src/runtime/mem_tracker.cpp
+++ b/be/src/runtime/mem_tracker.cpp
@@ -17,9 +17,11 @@
 
 #include "runtime/mem_tracker.h"
 
-#include <stdint.h>
+#include <cstdint>
 
 #include <boost/algorithm/string/join.hpp>
+#include <boost/algorithm/string.hpp>
+
 #include <limits>
 #include <memory>
 
@@ -75,15 +77,32 @@ void MemTracker::CreateRootTracker() {
 }
 
 std::shared_ptr<MemTracker> MemTracker::CreateTracker(RuntimeProfile* profile, 
int64_t byte_limit,
-                                                      const std::string& label,
-                                                      const 
std::shared_ptr<MemTracker>& parent) {
-    shared_ptr<MemTracker> real_parent;
+                                                      const std::string& 
label, const std::shared_ptr<MemTracker>& parent,
+                                                      bool reset_label_name, 
MemTrackerLevel level) {
+    std::shared_ptr<MemTracker> real_parent;
+    std::string label_name;
+    // if parent is not null, reset label name to query id.
+    // The parent label always: 
RuntimeState:instance:8ca5a59e3aa84f74-84bb0d0466193736
+    // we just need the last id of it: 8ca5a59e3aa84f74-84bb0d0466193736
+    // to build the new label name of tracker: `label`: 
8ca5a59e3aa84f74-84bb0d0466193736
+    // else if parent is null
+    //  just use the root is parent and keep the label_name as label
     if (parent) {
-        real_parent = std::move(parent);
+        real_parent = parent;
+        if (reset_label_name) {
+            std::vector<string> tmp_result;
+            boost::split(tmp_result, parent->label(), boost::is_any_of(":"));
+            label_name = label + ":" + tmp_result[tmp_result.size() - 1];
+        } else {
+            label_name = label;
+        }
     } else {
         real_parent = GetRootTracker();
+        label_name = label;
     }
-    shared_ptr<MemTracker> tracker(new MemTracker(profile, byte_limit, label, 
real_parent, true));
+
+    shared_ptr<MemTracker> tracker(new MemTracker(profile, byte_limit, 
label_name, real_parent, true,
+            level > real_parent->_level ? level : real_parent->_level));
     real_parent->AddChildTracker(tracker);
     tracker->Init();
 
@@ -91,16 +110,32 @@ std::shared_ptr<MemTracker> 
MemTracker::CreateTracker(RuntimeProfile* profile, i
 }
 
 std::shared_ptr<MemTracker> MemTracker::CreateTracker(int64_t byte_limit, 
const std::string& label,
-        std::shared_ptr<MemTracker> parent,
-        bool log_usage_if_zero) {
-    shared_ptr<MemTracker> real_parent;
+        std::shared_ptr<MemTracker> parent, bool log_usage_if_zero, bool 
reset_label_name, MemTrackerLevel level) {
+    std::shared_ptr<MemTracker> real_parent;
+    std::string label_name;
+    // if parent is not null, reset label name to query id.
+    // The parent label always: 
RuntimeState:instance:8ca5a59e3aa84f74-84bb0d0466193736
+    // we just need the last id of it: 8ca5a59e3aa84f74-84bb0d0466193736
+    // to build the new label name of tracker: `label`: 
8ca5a59e3aa84f74-84bb0d0466193736
+    // else if parent is null
+    //  just use the root is parent and keep the label_name as label
     if (parent) {
-        real_parent = std::move(parent);
+        real_parent = parent;
+        if (reset_label_name) {
+            std::vector<string> tmp_result;
+            boost::split(tmp_result, parent->label(), boost::is_any_of(":"));
+            label_name = label + ":" + tmp_result[tmp_result.size() - 1];
+        } else {
+            label_name = label;
+        }
     } else {
         real_parent = GetRootTracker();
+        label_name = label;
     }
+
     shared_ptr<MemTracker> tracker(
-            new MemTracker(nullptr, byte_limit, label, real_parent, 
log_usage_if_zero));
+            new MemTracker(nullptr, byte_limit, label_name, real_parent, 
log_usage_if_zero,
+                    level > real_parent->_level ? level : 
real_parent->_level));
     real_parent->AddChildTracker(tracker);
     tracker->Init();
 
@@ -108,16 +143,17 @@ std::shared_ptr<MemTracker> 
MemTracker::CreateTracker(int64_t byte_limit, const
 }
 
 MemTracker::MemTracker(int64_t byte_limit, const std::string& label)
-        : MemTracker(nullptr, byte_limit, label, 
std::shared_ptr<MemTracker>(), true) {}
+        : MemTracker(nullptr, byte_limit, label, 
std::shared_ptr<MemTracker>(), true, MemTrackerLevel::RELEASE) {}
 
 MemTracker::MemTracker(RuntimeProfile* profile, int64_t byte_limit, const 
string& label,
-                       const std::shared_ptr<MemTracker>& parent, bool 
log_usage_if_zero)
+                       const std::shared_ptr<MemTracker>& parent, bool 
log_usage_if_zero, MemTrackerLevel level)
         : limit_(byte_limit),
           soft_limit_(CalcSoftLimit(byte_limit)),
           label_(label),
           parent_(parent),
           consumption_metric_(nullptr),
           log_usage_if_zero_(log_usage_if_zero),
+          _level(level),
           num_gcs_metric_(nullptr),
           bytes_freed_by_last_gc_metric_(nullptr),
           bytes_over_limit_metric_(nullptr),
@@ -259,7 +295,7 @@ void 
MemTracker::ListTrackers(vector<shared_ptr<MemTracker>>* trackers) {
         }
         for (const auto& child_weak : children) {
             shared_ptr<MemTracker> child = child_weak.lock();
-            if (child) {
+            if (child && 
static_cast<decltype(config::mem_tracker_level)>(child->_level) <= 
config::mem_tracker_level) {
                 to_process.emplace_back(std::move(child));
             }
         }
diff --git a/be/src/runtime/mem_tracker.h b/be/src/runtime/mem_tracker.h
index 94f40fa..142e611 100644
--- a/be/src/runtime/mem_tracker.h
+++ b/be/src/runtime/mem_tracker.h
@@ -40,6 +40,10 @@ namespace doris {
 /// limit should be used.
 enum class MemLimit { HARD, SOFT };
 
+/// The Level use to decide whether to show it in web page
+/// each MemTracker have a Level equals to parent, only be set explicit
+enum class MemTrackerLevel {RELEASE = 0, DEBUG};
+
 class ObjectPool;
 class MemTracker;
 struct ReservationTrackerCounters;
@@ -88,11 +92,11 @@ public:
     static std::shared_ptr<MemTracker> CreateTracker(
             int64_t byte_limit = -1, const std::string& label = std::string(),
             std::shared_ptr<MemTracker> parent = std::shared_ptr<MemTracker>(),
-            bool log_usage_if_zero = true);
+            bool log_usage_if_zero = true, bool reset_label_name = true, 
MemTrackerLevel level = MemTrackerLevel::RELEASE);
 
     static std::shared_ptr<MemTracker> CreateTracker(
             RuntimeProfile* profile, int64_t byte_limit, const std::string& 
label = std::string(),
-            const std::shared_ptr<MemTracker>& parent = 
std::shared_ptr<MemTracker>());
+            const std::shared_ptr<MemTracker>& parent = 
std::shared_ptr<MemTracker>(), bool reset_label_name = true, MemTrackerLevel 
level = MemTrackerLevel::RELEASE);
 
     // this is used for creating an orphan mem tracker, or for unit test.
     // If a mem tracker has parent, it should be created by `CreateTracker()`
@@ -420,7 +424,7 @@ private:
     /// If 'log_usage_if_zero' is false, this tracker (and its children) will 
not be
     /// included in LogUsage() output if consumption is 0.
     MemTracker(RuntimeProfile* profile, int64_t byte_limit, const std::string& 
label,
-               const std::shared_ptr<MemTracker>& parent, bool 
log_usage_if_zero);
+               const std::shared_ptr<MemTracker>& parent, bool 
log_usage_if_zero, MemTrackerLevel);
 
 private:
     friend class PoolMemTrackerRegistry;
@@ -553,6 +557,8 @@ private:
     /// if consumption is 0.
     bool log_usage_if_zero_;
 
+    MemTrackerLevel _level;
+
     /// The number of times the GcFunctions were called.
     IntCounter* num_gcs_metric_;
 
diff --git a/be/src/runtime/plan_fragment_executor.cpp 
b/be/src/runtime/plan_fragment_executor.cpp
index 815d0d1..3bd8a1b 100644
--- a/be/src/runtime/plan_fragment_executor.cpp
+++ b/be/src/runtime/plan_fragment_executor.cpp
@@ -132,7 +132,7 @@ Status PlanFragmentExecutor::prepare(const 
TExecPlanFragmentParams& request,
     _mem_tracker = MemTracker::CreateTracker(bytes_limit,
                                              "PlanFragmentExecutor:" + 
print_id(_query_id) + ":" +
                                                      
print_id(params.fragment_instance_id),
-                                             _exec_env->process_mem_tracker());
+                                             _exec_env->process_mem_tracker(), 
true, false);
     _runtime_state->set_fragment_mem_tracker(_mem_tracker);
 
     LOG(INFO) << "Using query memory limit: " << 
PrettyPrinter::print(bytes_limit, TUnit::BYTES);
diff --git a/be/src/runtime/runtime_state.cpp b/be/src/runtime/runtime_state.cpp
index b8c0c26..5237646 100644
--- a/be/src/runtime/runtime_state.cpp
+++ b/be/src/runtime/runtime_state.cpp
@@ -215,9 +215,9 @@ Status RuntimeState::init_mem_trackers(const TUniqueId& 
query_id) {
 
     _query_mem_tracker =
             MemTracker::CreateTracker(bytes_limit, "RuntimeState:query:" + 
print_id(query_id),
-                                      _exec_env->process_mem_tracker());
+                                      _exec_env->process_mem_tracker(), true, 
false);
     _instance_mem_tracker = MemTracker::CreateTracker(
-            &_profile, -1, "RuntimeState:instance:" + print_id(query_id), 
_query_mem_tracker);
+            &_profile, -1, "RuntimeState:instance:", _query_mem_tracker);
 
     /*
     // TODO: this is a stopgap until we implement ExprContext
diff --git a/be/src/runtime/tablets_channel.cpp 
b/be/src/runtime/tablets_channel.cpp
index 5e647bb..531a3bd 100644
--- a/be/src/runtime/tablets_channel.cpp
+++ b/be/src/runtime/tablets_channel.cpp
@@ -34,7 +34,7 @@ std::atomic<uint64_t> TabletsChannel::_s_tablet_writer_count;
 TabletsChannel::TabletsChannel(const TabletsChannelKey& key,
                                const std::shared_ptr<MemTracker>& mem_tracker)
         : _key(key), _state(kInitialized), _closed_senders(64) {
-    _mem_tracker = MemTracker::CreateTracker(-1, "TabletsChannel:" + 
key.to_string(), mem_tracker);
+    _mem_tracker = MemTracker::CreateTracker(-1, "TabletsChannel", 
mem_tracker);
     static std::once_flag once_flag;
     std::call_once(once_flag, [] {
         REGISTER_HOOK_METRIC(tablet_writer_count, [&]() { return 
_s_tablet_writer_count.load(); });
diff --git a/docs/en/administrator-guide/config/be_config.md 
b/docs/en/administrator-guide/config/be_config.md
index 8dd31c1..38ea221 100644
--- a/docs/en/administrator-guide/config/be_config.md
+++ b/docs/en/administrator-guide/config/be_config.md
@@ -874,6 +874,7 @@ If the parameter is `THREAD_POOL`, the model is a blocking 
I/O model.
 ### `aws_log_level`
 
 * Type: int32
+
 * Description: log level of AWS SDK, 
   ```
      Off = 0,
@@ -884,4 +885,15 @@ If the parameter is `THREAD_POOL`, the model is a blocking 
I/O model.
      Debug = 5,
      Trace = 6
   ```
-* Default: 3
\ No newline at end of file
+  
+* Default: 3
+
+### `mem_tracker_level`
+
+* Type: int16
+* Description: The level at which MemTracker is displayed on the Web page 
equal or lower than this level will be displayed on the Web page
+  ```
+    RELEASE = 0
+    DEBUG = 1
+  ```
+* Default: 0
\ No newline at end of file
diff --git a/docs/zh-CN/administrator-guide/config/be_config.md 
b/docs/zh-CN/administrator-guide/config/be_config.md
index 8f97567..2b1f6ff 100644
--- a/docs/zh-CN/administrator-guide/config/be_config.md
+++ b/docs/zh-CN/administrator-guide/config/be_config.md
@@ -886,3 +886,13 @@ Stream Load 一般适用于导入几个GB以内的数据,不适合导入过大
   ```
 * 默认值: 3
 
+
+### `mem_tracker_level`
+
+* 类型: int16
+* 描述: MemTracker在Web页面上展示的级别,等于或低于这个级别的MemTracker会在Web页面上展示
+  ```
+    RELEASE = 0
+    DEBUG = 1
+  ```
+* 默认值: 0

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to