Skip to content

Commit 41ace4f

Browse files
authored
Report QueryExecution memory stats (#7936)
1 parent 23c7ceb commit 41ace4f

File tree

4 files changed

+65
-95
lines changed

4 files changed

+65
-95
lines changed

ydb/core/memory_controller/memory_controller.cpp

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <ydb/library/actors/core/log.h>
1616
#include <ydb/library/actors/core/process_stats.h>
1717
#include <ydb/library/services/services.pb.h>
18+
#include <ydb/library/yql/minikql/aligned_page_pool.h>
1819

1920
namespace NKikimr::NMemory {
2021

@@ -262,8 +263,20 @@ class TMemoryController : public TActorBootstrapped<TMemoryController> {
262263
Counters->GetCounter("Stats/ConsumersLimit")->Set(consumersLimitBytes);
263264
memoryStats.SetConsumersLimit(consumersLimitBytes);
264265

266+
ui64 queryExecutionConsumption = TAlignedPagePool::GetGlobalPagePoolSize();
267+
ui64 queryExecutionLimitBytes = GetQueryExecutionLimitBytes(Config, hardLimitBytes);
268+
LOG_INFO_S(ctx, NKikimrServices::MEMORY_CONTROLLER, "Consumer QueryExecution state:"
269+
<< " Consumption: " << queryExecutionConsumption << " Limit: " << queryExecutionLimitBytes);
270+
Counters->GetCounter("Consumer/QueryExecution/Consumption")->Set(queryExecutionConsumption);
271+
Counters->GetCounter("Consumer/QueryExecution/Limit")->Set(queryExecutionLimitBytes);
272+
memoryStats.SetQueryExecutionConsumption(queryExecutionConsumption);
273+
memoryStats.SetQueryExecutionLimit(queryExecutionLimitBytes);
274+
265275
// Note: for now ResourceBroker and its queues aren't MemoryController consumers and don't share limits with other caches
266-
ApplyResourceBrokerLimits(hardLimitBytes, activitiesLimitBytes);
276+
ApplyResourceBrokerLimits({
277+
activitiesLimitBytes,
278+
queryExecutionLimitBytes
279+
});
267280

268281
Send(NNodeWhiteboard::MakeNodeWhiteboardServiceId(SelfId().NodeId()), memoryStatsUpdate);
269282

@@ -350,34 +363,22 @@ class TMemoryController : public TActorBootstrapped<TMemoryController> {
350363
}
351364
}
352365

353-
void ApplyResourceBrokerLimits(ui64 hardLimitBytes, ui64 activitiesLimitBytes) {
354-
ui64 queryExecutionLimitBytes = GetQueryExecutionLimitBytes(Config, hardLimitBytes);
355-
356-
TResourceBrokerLimits newLimits{
357-
activitiesLimitBytes,
358-
queryExecutionLimitBytes
359-
};
360-
361-
if (newLimits == CurrentResourceBrokerLimits) {
366+
void ApplyResourceBrokerLimits(TResourceBrokerLimits limits) {
367+
if (limits == CurrentResourceBrokerLimits) {
362368
return;
363369
}
364370

365-
CurrentResourceBrokerLimits = newLimits;
366-
367-
LOG_INFO_S(TlsActivationContext->AsActorContext(), NKikimrServices::MEMORY_CONTROLLER, "Consumer QueryExecution state:"
368-
<< " Limit: " << newLimits.QueryExecutionLimitBytes);
369-
370-
Counters->GetCounter("Consumer/QueryExecution/Limit")->Set(newLimits.QueryExecutionLimitBytes);
371-
372371
TAutoPtr<TEvResourceBroker::TEvConfigure> configure = new TEvResourceBroker::TEvConfigure();
373372
configure->Merge = true;
374-
configure->Record.MutableResourceLimit()->SetMemory(activitiesLimitBytes);
373+
configure->Record.MutableResourceLimit()->SetMemory(limits.LimitBytes);
375374

376375
auto queue = configure->Record.AddQueues();
377376
queue->SetName(NLocalDb::KqpResourceManagerQueue);
378-
queue->MutableLimit()->SetMemory(queryExecutionLimitBytes);
377+
queue->MutableLimit()->SetMemory(limits.QueryExecutionLimitBytes);
379378

380379
Send(MakeResourceBrokerID(), configure.Release());
380+
381+
CurrentResourceBrokerLimits.emplace(std::move(limits));
381382
}
382383

383384
TConsumerCounters& GetConsumerCounters(EMemoryConsumerKind consumer) {

ydb/core/memory_controller/memory_controller_config.h

Lines changed: 41 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,39 @@ ui64 GetPercent(float percent, ui64 value) {
1212
return static_cast<ui64>(static_cast<double>(value) * (percent / 100.0));
1313
}
1414

15+
#define GET_LIMIT(name) \
16+
inline ui64 Get##name##Bytes(const NKikimrConfig::TMemoryControllerConfig& config, ui64 hardLimitBytes) { \
17+
if (config.Has##name##Percent() && config.Has##name##Bytes()) { \
18+
return Min(GetPercent(config.Get##name##Percent(), hardLimitBytes), config.Get##name##Bytes()); \
19+
} \
20+
if (config.Has##name##Bytes()) { \
21+
return config.Get##name##Bytes(); \
22+
} \
23+
return GetPercent(config.Get##name##Percent(), hardLimitBytes); \
24+
}
25+
26+
#define GET_MIN_LIMIT(name) \
27+
inline ui64 Get##name##MinBytes(const NKikimrConfig::TMemoryControllerConfig& config, ui64 hardLimitBytes) { \
28+
if (config.Has##name##MinPercent() && config.Has##name##MinBytes()) { \
29+
return Max(GetPercent(config.Get##name##MinPercent(), hardLimitBytes), config.Get##name##MinBytes()); \
30+
} \
31+
if (config.Has##name##MinBytes()) { \
32+
return config.Get##name##MinBytes(); \
33+
} \
34+
return GetPercent(config.Get##name##MinPercent(), hardLimitBytes); \
35+
}
36+
37+
#define GET_MAX_LIMIT(name) \
38+
inline ui64 Get##name##MaxBytes(const NKikimrConfig::TMemoryControllerConfig& config, ui64 hardLimitBytes) { \
39+
if (config.Has##name##MaxPercent() && config.Has##name##MaxBytes()) { \
40+
return Min(GetPercent(config.Get##name##MaxPercent(), hardLimitBytes), config.Get##name##MaxBytes()); \
41+
} \
42+
if (config.Has##name##MaxBytes()) { \
43+
return config.Get##name##MaxBytes(); \
44+
} \
45+
return GetPercent(config.Get##name##MaxPercent(), hardLimitBytes); \
46+
}
47+
1548
};
1649

1750
inline ui64 GetHardLimitBytes(const NKikimrConfig::TMemoryControllerConfig& config, const TProcessMemoryInfo& info, bool& hasMemTotalHardLimit) {
@@ -32,84 +65,16 @@ inline ui64 GetHardLimitBytes(const NKikimrConfig::TMemoryControllerConfig& conf
3265
return 512_MB; // fallback
3366
}
3467

35-
inline ui64 GetSoftLimitBytes(const NKikimrConfig::TMemoryControllerConfig& config, ui64 hardLimitBytes) {
36-
if (config.HasSoftLimitPercent() && config.HasSoftLimitBytes()) {
37-
return Min(GetPercent(config.GetSoftLimitPercent(), hardLimitBytes), config.GetSoftLimitBytes());
38-
}
39-
if (config.HasSoftLimitBytes()) {
40-
return config.GetSoftLimitBytes();
41-
}
42-
return GetPercent(config.GetSoftLimitPercent(), hardLimitBytes);
43-
}
44-
45-
inline ui64 GetTargetUtilizationBytes(const NKikimrConfig::TMemoryControllerConfig& config, ui64 hardLimitBytes) {
46-
if (config.HasTargetUtilizationPercent() && config.HasTargetUtilizationBytes()) {
47-
return Min(GetPercent(config.GetTargetUtilizationPercent(), hardLimitBytes), config.GetTargetUtilizationBytes());
48-
}
49-
if (config.HasTargetUtilizationBytes()) {
50-
return config.GetTargetUtilizationBytes();
51-
}
52-
return GetPercent(config.GetTargetUtilizationPercent(), hardLimitBytes);
53-
}
54-
55-
inline ui64 GetActivitiesLimitBytes(const NKikimrConfig::TMemoryControllerConfig& config, ui64 hardLimitBytes) {
56-
if (config.HasActivitiesLimitPercent() && config.HasActivitiesLimitBytes()) {
57-
return Min(GetPercent(config.GetActivitiesLimitPercent(), hardLimitBytes), config.GetActivitiesLimitBytes());
58-
}
59-
if (config.HasActivitiesLimitBytes()) {
60-
return config.GetActivitiesLimitBytes();
61-
}
62-
return GetPercent(config.GetActivitiesLimitPercent(), hardLimitBytes);
63-
}
64-
65-
inline ui64 GetMemTableMinBytes(const NKikimrConfig::TMemoryControllerConfig& config, ui64 hardLimitBytes) {
66-
if (config.HasMemTableMinPercent() && config.HasMemTableMinBytes()) {
67-
return Max(GetPercent(config.GetMemTableMinPercent(), hardLimitBytes), config.GetMemTableMinBytes());
68-
}
69-
if (config.HasMemTableMinBytes()) {
70-
return config.GetMemTableMinBytes();
71-
}
72-
return GetPercent(config.GetMemTableMinPercent(), hardLimitBytes);
73-
}
68+
GET_LIMIT(SoftLimit)
69+
GET_LIMIT(TargetUtilization)
70+
GET_LIMIT(ActivitiesLimit)
7471

75-
inline ui64 GetMemTableMaxBytes(const NKikimrConfig::TMemoryControllerConfig& config, ui64 hardLimitBytes) {
76-
if (config.HasMemTableMaxPercent() && config.HasMemTableMaxBytes()) {
77-
return Min(GetPercent(config.GetMemTableMaxPercent(), hardLimitBytes), config.GetMemTableMaxBytes());
78-
}
79-
if (config.HasMemTableMaxBytes()) {
80-
return config.GetMemTableMaxBytes();
81-
}
82-
return GetPercent(config.GetMemTableMaxPercent(), hardLimitBytes);
83-
}
72+
GET_MIN_LIMIT(MemTable)
73+
GET_MAX_LIMIT(MemTable)
8474

85-
inline ui64 GetSharedCacheMinBytes(const NKikimrConfig::TMemoryControllerConfig& config, ui64 hardLimitBytes) {
86-
if (config.HasSharedCacheMinPercent() && config.HasSharedCacheMinBytes()) {
87-
return Max(GetPercent(config.GetSharedCacheMinPercent(), hardLimitBytes), config.GetSharedCacheMinBytes());
88-
}
89-
if (config.HasSharedCacheMinBytes()) {
90-
return config.GetSharedCacheMinBytes();
91-
}
92-
return GetPercent(config.GetSharedCacheMinPercent(), hardLimitBytes);
93-
}
94-
95-
inline ui64 GetSharedCacheMaxBytes(const NKikimrConfig::TMemoryControllerConfig& config, ui64 hardLimitBytes) {
96-
if (config.HasSharedCacheMaxPercent() && config.HasSharedCacheMaxBytes()) {
97-
return Min(GetPercent(config.GetSharedCacheMaxPercent(), hardLimitBytes), config.GetSharedCacheMaxBytes());
98-
}
99-
if (config.HasSharedCacheMaxBytes()) {
100-
return config.GetSharedCacheMaxBytes();
101-
}
102-
return GetPercent(config.GetSharedCacheMaxPercent(), hardLimitBytes);
103-
}
75+
GET_MIN_LIMIT(SharedCache)
76+
GET_MAX_LIMIT(SharedCache)
10477

105-
inline ui64 GetQueryExecutionLimitBytes(const NKikimrConfig::TMemoryControllerConfig& config, ui64 hardLimitBytes) {
106-
if (config.HasQueryExecutionLimitPercent() && config.HasQueryExecutionLimitBytes()) {
107-
return Min(GetPercent(config.GetQueryExecutionLimitPercent(), hardLimitBytes), config.GetQueryExecutionLimitBytes());
108-
}
109-
if (config.HasQueryExecutionLimitBytes()) {
110-
return config.GetQueryExecutionLimitBytes();
111-
}
112-
return GetPercent(config.GetQueryExecutionLimitPercent(), hardLimitBytes);
113-
}
78+
GET_LIMIT(QueryExecutionLimit)
11479

11580
}

ydb/core/memory_controller/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ PEERDIR(
99
ydb/core/base
1010
ydb/library/actors/core
1111
ydb/library/services
12+
ydb/library/yql/minikql
1213
ydb/core/cms/console
1314
ydb/core/mon_alloc
1415
ydb/core/node_whiteboard

ydb/core/protos/memory_stats.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,7 @@ message TMemoryStats {
2424

2525
optional uint64 MemTableConsumption = 16;
2626
optional uint64 MemTableLimit = 17;
27+
28+
optional uint64 QueryExecutionConsumption = 18;
29+
optional uint64 QueryExecutionLimit = 19;
2730
}

0 commit comments

Comments
 (0)