Skip to content

Commit 9e244eb

Browse files
authored
Introduce Memory Controller (#6587)
1 parent c0f561e commit 9e244eb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1884
-1050
lines changed

ydb/core/base/appdata.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <ydb/core/protos/cms.pb.h>
1919
#include <ydb/core/protos/config.pb.h>
2020
#include <ydb/core/protos/key.pb.h>
21+
#include <ydb/core/protos/memory_controller_config.pb.h>
2122
#include <ydb/core/protos/pqconfig.pb.h>
2223
#include <ydb/core/protos/stream.pb.h>
2324
#include <ydb/core/protos/netclassifier.pb.h>
@@ -61,6 +62,7 @@ struct TAppData::TImpl {
6162
NKikimrConfig::TGraphConfig GraphConfig;
6263
NKikimrSharedCache::TSharedCacheConfig SharedCacheConfig;
6364
NKikimrConfig::TMetadataCacheConfig MetadataCacheConfig;
65+
NKikimrConfig::TMemoryControllerConfig MemoryControllerConfig;
6466
};
6567

6668
TAppData::TAppData(
@@ -113,6 +115,7 @@ TAppData::TAppData(
113115
, GraphConfig(Impl->GraphConfig)
114116
, SharedCacheConfig(Impl->SharedCacheConfig)
115117
, MetadataCacheConfig(Impl->MetadataCacheConfig)
118+
, MemoryControllerConfig(Impl->MemoryControllerConfig)
116119
, KikimrShouldContinue(kikimrShouldContinue)
117120
{}
118121

ydb/core/base/appdata_fwd.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ namespace NKikimrConfig {
6363
class TBackgroundCleaningConfig;
6464
class TGraphConfig;
6565
class TMetadataCacheConfig;
66+
class TMemoryControllerConfig;
6667
}
6768

6869
namespace NKikimrNetClassifier {
@@ -213,6 +214,7 @@ struct TAppData {
213214
NKikimrConfig::TGraphConfig& GraphConfig;
214215
NKikimrSharedCache::TSharedCacheConfig& SharedCacheConfig;
215216
NKikimrConfig::TMetadataCacheConfig& MetadataCacheConfig;
217+
NKikimrConfig::TMemoryControllerConfig& MemoryControllerConfig;
216218
bool EnforceUserTokenRequirement = false;
217219
bool EnforceUserTokenCheckRequirement = false; // check token if it was specified
218220
bool AllowHugeKeyValueDeletes = true; // delete when all clients limit deletes per request

ydb/core/base/events.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,8 @@ struct TKikimrEvents : TEvents {
178178
ES_BACKUP_SERVICE = 4255,
179179
ES_TX_BACKGROUND = 4256,
180180
ES_SS_BG_TASKS = 4257,
181-
ES_LIMITER = 4258,
181+
ES_LIMITER = 4258,
182+
ES_MEMORY = 4259,
182183
};
183184
};
184185

ydb/core/base/memobserver.h

Lines changed: 0 additions & 51 deletions
This file was deleted.
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
#pragma once
2+
3+
#include <ydb/core/base/events.h>
4+
5+
namespace NKikimr::NMemory {
6+
7+
enum class EMemoryConsumerKind {
8+
SharedCache,
9+
MemTable,
10+
};
11+
12+
struct IMemoryConsumer : public TThrRefBase {
13+
virtual void SetConsumption(ui64 value) = 0;
14+
};
15+
16+
enum EEvMemory {
17+
EvConsumerRegister = EventSpaceBegin(TKikimrEvents::ES_MEMORY),
18+
EvConsumerRegistered,
19+
EvConsumerLimit,
20+
21+
EvMemTableRegister,
22+
EvMemTableRegistered,
23+
EvMemTableCompact,
24+
EvMemTableCompacted,
25+
EvMemTableUnregister,
26+
27+
EvEnd
28+
};
29+
30+
static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_MEMORY), "expected EvEnd < EventSpaceEnd");
31+
32+
struct TEvConsumerRegister : public TEventLocal<TEvConsumerRegister, EvConsumerRegister> {
33+
const EMemoryConsumerKind Kind;
34+
35+
TEvConsumerRegister(EMemoryConsumerKind kind)
36+
: Kind(kind)
37+
{}
38+
};
39+
40+
struct TEvConsumerRegistered : public TEventLocal<TEvConsumerRegistered, EvConsumerRegistered> {
41+
TIntrusivePtr<IMemoryConsumer> Consumer;
42+
43+
TEvConsumerRegistered(TIntrusivePtr<IMemoryConsumer> consumer)
44+
: Consumer(std::move(consumer))
45+
{}
46+
};
47+
48+
struct TEvConsumerLimit : public TEventLocal<TEvConsumerLimit, EvConsumerLimit> {
49+
ui64 LimitBytes;
50+
51+
TEvConsumerLimit(ui64 limitBytes)
52+
: LimitBytes(limitBytes)
53+
{}
54+
};
55+
56+
struct TEvMemTableRegister : public TEventLocal<TEvMemTableRegister, EvMemTableRegister> {
57+
const ui32 Table;
58+
59+
TEvMemTableRegister(ui32 table)
60+
: Table(table)
61+
{}
62+
};
63+
64+
struct TEvMemTableRegistered : public TEventLocal<TEvMemTableRegistered, EvMemTableRegistered> {
65+
const ui32 Table;
66+
TIntrusivePtr<IMemoryConsumer> Consumer;
67+
68+
TEvMemTableRegistered(ui32 table, TIntrusivePtr<IMemoryConsumer> consumer)
69+
: Table(table)
70+
, Consumer(std::move(consumer))
71+
{}
72+
};
73+
74+
struct TEvMemTableCompact : public TEventLocal<TEvMemTableCompact, EvMemTableCompact> {
75+
const ui32 Table;
76+
const ui64 ExpectedSize;
77+
78+
TEvMemTableCompact(ui32 table, ui64 expectedSize)
79+
: Table(table)
80+
, ExpectedSize(expectedSize)
81+
{}
82+
};
83+
84+
struct TEvMemTableCompacted : public TEventLocal<TEvMemTableCompacted, EvMemTableCompacted> {
85+
const TIntrusivePtr<IMemoryConsumer> MemoryConsumer;
86+
87+
TEvMemTableCompacted(TIntrusivePtr<IMemoryConsumer> memoryConsumer)
88+
: MemoryConsumer(std::move(memoryConsumer))
89+
{}
90+
};
91+
92+
struct TEvMemTableUnregister : public TEventLocal<TEvMemTableUnregister, EvMemTableUnregister> {
93+
const ui32 Table;
94+
95+
TEvMemTableUnregister(ui32 table)
96+
: Table(table)
97+
{}
98+
};
99+
100+
inline TActorId MakeMemoryControllerId(ui64 id = 0) {
101+
char x[12] = { 'm', 'e', 'm', 'c' };
102+
WriteUnaligned<ui64>((ui64*)(x+4), id);
103+
return TActorId(0, TStringBuf(x, 12));
104+
}
105+
106+
}

ydb/core/base/ya.make

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ SRCS(
2929
location.h
3030
logoblob.cpp
3131
logoblob.h
32-
memobserver.h
32+
memory_controller_iface.h
3333
nameservice.h
3434
path.cpp
3535
pool_stats_collector.cpp
@@ -105,6 +105,8 @@ PEERDIR(
105105
)
106106
ENDIF()
107107

108+
GENERATE_ENUM_SERIALIZATION(memory_controller_iface.h)
109+
108110
END()
109111

110112
RECURSE_FOR_TESTS(

ydb/core/client/object_storage_listing_ut.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <library/cpp/testing/unittest/registar.h>
44
#include <ydb/public/api/protos/draft/ydb_object_storage.pb.h>
55
#include <ydb/public/api/grpc/draft/ydb_object_storage_v1.grpc.pb.h>
6+
#include <ydb/core/tablet_flat/shared_sausagecache.h>
67
#include <grpc++/client_context.h>
78
#include <grpc++/create_channel.h>
89

@@ -775,10 +776,7 @@ Y_UNIT_TEST_SUITE(TObjectStorageListingTest) {
775776
cleverServer.EnableGRpc(GRPC_PORT);
776777

777778
// Disable shared cache to trigger restarts
778-
TAtomic unused = 42;
779-
cleverServer.GetRuntime()->GetAppData().Icb->SetValue("SharedPageCache_Size", 10, unused);
780-
cleverServer.GetRuntime()->GetAppData().Icb->SetValue("SharedPageCache_Size", 10, unused);
781-
UNIT_ASSERT_VALUES_EQUAL(unused, 10);
779+
cleverServer.GetRuntime()->Send(MakeSharedPageCacheId(), TActorId{}, new NMemory::TEvConsumerLimit(0));
782780

783781
TFlatMsgBusClient annoyingClient(port);
784782

ydb/core/client/ut/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ PEERDIR(
2626
library/cpp/regex/pcre
2727
library/cpp/svnversion
2828
ydb/core/client/scheme_cache_lib
29+
ydb/core/tablet_flat
2930
ydb/core/tablet_flat/test/libs/rows
3031
ydb/core/testlib/default
3132
)

ydb/core/cms/console/configs_dispatcher.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ const THashSet<ui32> DYNAMIC_KINDS({
6666
(ui32)NKikimrConsole::TConfigItem::TracingConfigItem,
6767
(ui32)NKikimrConsole::TConfigItem::BlobStorageConfigItem,
6868
(ui32)NKikimrConsole::TConfigItem::MetadataCacheConfigItem,
69+
(ui32)NKikimrConsole::TConfigItem::MemoryControllerConfigItem,
6970
});
7071

7172
const THashSet<ui32> NON_YAML_KINDS({

ydb/core/driver_lib/run/kikimr_services_initializers.cpp

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959

6060
#include <ydb/core/keyvalue/keyvalue.h>
6161

62+
#include <ydb/core/memory_controller/memory_controller.h>
6263
#include <ydb/core/test_tablet/test_tablet.h>
6364
#include <ydb/core/test_tablet/state_server_interface.h>
6465

@@ -109,6 +110,7 @@
109110
#include <ydb/core/protos/console_config.pb.h>
110111
#include <ydb/core/protos/node_limits.pb.h>
111112
#include <ydb/core/protos/compile_service_config.pb.h>
113+
#include <ydb/core/protos/memory_controller_config.pb.h>
112114

113115
#include <ydb/core/public_http/http_service.h>
114116

@@ -1131,9 +1133,8 @@ void TLocalServiceInitializer::InitializeServices(
11311133

11321134
// TSharedCacheInitializer
11331135

1134-
TSharedCacheInitializer::TSharedCacheInitializer(const TKikimrRunConfig& runConfig, TIntrusivePtr<TMemObserver> memObserver)
1136+
TSharedCacheInitializer::TSharedCacheInitializer(const TKikimrRunConfig& runConfig)
11351137
: IKikimrServicesInitializer(runConfig)
1136-
, MemObserver(std::move(memObserver))
11371138
{}
11381139

11391140
void TSharedCacheInitializer::InitializeServices(
@@ -1149,27 +1150,26 @@ void TSharedCacheInitializer::InitializeServices(
11491150
cfg.MergeFrom(Config.GetSharedCacheConfig());
11501151
}
11511152

1153+
if (cfg.HasMemoryLimit() && cfg.GetMemoryLimit() != 0) {
1154+
// config limit is optional
1155+
// if preserved apply both memory controller limit and config limit
1156+
config->LimitBytes = cfg.GetMemoryLimit();
1157+
} else {
1158+
config->LimitBytes = {};
1159+
}
11521160
config->TotalAsyncQueueInFlyLimit = cfg.GetAsyncQueueInFlyLimit();
11531161
config->TotalScanQueueInFlyLimit = cfg.GetScanQueueInFlyLimit();
11541162

11551163
if (cfg.HasActivePagesReservationPercent()) {
11561164
config->ActivePagesReservationPercent = cfg.GetActivePagesReservationPercent();
11571165
}
1158-
if (cfg.HasMemTableReservationPercent()) {
1159-
config->MemTableReservationPercent = cfg.GetMemTableReservationPercent();
1160-
}
11611166

11621167
TIntrusivePtr<::NMonitoring::TDynamicCounters> tabletGroup = GetServiceCounters(appData->Counters, "tablets");
11631168
TIntrusivePtr<::NMonitoring::TDynamicCounters> sausageGroup = tabletGroup->GetSubgroup("type", "S_CACHE");
1164-
1165-
config->CacheConfig = new TCacheCacheConfig(cfg.GetMemoryLimit(),
1166-
sausageGroup->GetCounter("fresh"),
1167-
sausageGroup->GetCounter("staging"),
1168-
sausageGroup->GetCounter("warm"));
11691169
config->Counters = new TSharedPageCacheCounters(sausageGroup);
11701170

11711171
setup->LocalServices.push_back(std::pair<TActorId, TActorSetupCmd>(MakeSharedPageCacheId(0),
1172-
TActorSetupCmd(CreateSharedPageCache(std::move(config), MemObserver), TMailboxType::ReadAsFilled, appData->UserPoolId)));
1172+
TActorSetupCmd(CreateSharedPageCache(std::move(config)), TMailboxType::ReadAsFilled, appData->UserPoolId)));
11731173

11741174
auto *configurator = NConsole::CreateSharedCacheConfigurator();
11751175
setup->LocalServices.emplace_back(TActorId(),
@@ -2061,11 +2061,8 @@ void TPersQueueDirectReadCacheInitializer::InitializeServices(NActors::TActorSys
20612061
TActorSetupCmd(actor, TMailboxType::HTSwap, appData->UserPoolId)));
20622062
}
20632063

2064-
// TMemProfMonitorInitializer
2065-
2066-
TMemProfMonitorInitializer::TMemProfMonitorInitializer(const TKikimrRunConfig& runConfig, TIntrusivePtr<TMemObserver> memObserver)
2064+
TMemProfMonitorInitializer::TMemProfMonitorInitializer(const TKikimrRunConfig& runConfig)
20672065
: IKikimrServicesInitializer(runConfig)
2068-
, MemObserver(std::move(memObserver))
20692066
{}
20702067

20712068
void TMemProfMonitorInitializer::InitializeServices(
@@ -2079,8 +2076,7 @@ void TMemProfMonitorInitializer::InitializeServices(
20792076
}
20802077

20812078
IActor* monitorActor = CreateMemProfMonitor(
2082-
MemObserver,
2083-
1, // seconds
2079+
TDuration::Seconds(1),
20842080
appData->Counters,
20852081
filePathPrefix);
20862082

@@ -2092,8 +2088,6 @@ void TMemProfMonitorInitializer::InitializeServices(
20922088
appData->BatchPoolId));
20932089
}
20942090

2095-
// TMemoryTrackerInitializer
2096-
20972091
TMemoryTrackerInitializer::TMemoryTrackerInitializer(const TKikimrRunConfig& runConfig)
20982092
: IKikimrServicesInitializer(runConfig)
20992093
{}
@@ -2109,6 +2103,23 @@ void TMemoryTrackerInitializer::InitializeServices(
21092103
);
21102104
}
21112105

2106+
TMemoryControllerInitializer::TMemoryControllerInitializer(const TKikimrRunConfig& runConfig, TIntrusiveConstPtr<NMemory::IProcessMemoryInfoProvider> processMemoryInfoProvider)
2107+
: IKikimrServicesInitializer(runConfig)
2108+
, ProcessMemoryInfoProvider(std::move(processMemoryInfoProvider))
2109+
{}
2110+
2111+
void TMemoryControllerInitializer::InitializeServices(
2112+
NActors::TActorSystemSetup* setup,
2113+
const NKikimr::TAppData* appData)
2114+
{
2115+
auto config = appData->MemoryControllerConfig;
2116+
auto* actor = NMemory::CreateMemoryController(TDuration::Seconds(1), ProcessMemoryInfoProvider, config, appData->Counters);
2117+
setup->LocalServices.emplace_back(
2118+
NMemory::MakeMemoryControllerId(0),
2119+
TActorSetupCmd(actor, TMailboxType::HTSwap, appData->BatchPoolId)
2120+
);
2121+
}
2122+
21122123
TQuoterServiceInitializer::TQuoterServiceInitializer(const TKikimrRunConfig& runConfig)
21132124
: IKikimrServicesInitializer(runConfig)
21142125
{}

0 commit comments

Comments
 (0)