3
3
#include < ydb/core/tablet/resource_broker.h>
4
4
#include < ydb/core/tablet_flat/shared_sausagecache.h>
5
5
#include < ydb/core/tx/datashard/ut_common/datashard_ut_common.h>
6
+ #include < ydb/core/tx/columnshard/common/limits.h>
7
+ #include < ydb/core/tx/limiter/grouped_memory/usage/service.h>
6
8
#include < ydb/library/actors/testlib/test_runtime.h>
7
9
8
10
namespace NKikimr ::NMemory {
@@ -502,11 +504,13 @@ Y_UNIT_TEST(ResourceBroker_ConfigCS) {
502
504
TServerSettings serverSettings (pm.GetPort (2134 ));
503
505
serverSettings.SetDomainName (" Root" ).SetUseRealThreads (false );
504
506
507
+ const ui64 compactionMemoryLimitPercent = 36 ;
505
508
auto memoryControllerConfig = serverSettings.AppConfig ->MutableMemoryControllerConfig ();
506
- memoryControllerConfig->SetColumnTablesCompactionLimitPercent (32 );
509
+ memoryControllerConfig->SetColumnTablesCompactionLimitPercent (compactionMemoryLimitPercent );
507
510
511
+ ui64 currentHardMemoryLimit = 1000_MB;
508
512
auto resourceBrokerConfig = serverSettings.AppConfig ->MutableResourceBrokerConfig ();
509
- resourceBrokerConfig->MutableResourceLimit ()->SetMemory (1000_MB );
513
+ resourceBrokerConfig->MutableResourceLimit ()->SetMemory (currentHardMemoryLimit );
510
514
511
515
auto addQueueWithMemoryLimit = [&](const TString& name, const ui64 memoryLimit) {
512
516
auto queue = resourceBrokerConfig->AddQueues ();
@@ -520,7 +524,7 @@ Y_UNIT_TEST(ResourceBroker_ConfigCS) {
520
524
addQueueWithMemoryLimit (NLocalDb::ColumnShardCompactionNormalizerQueue, 1_MB);
521
525
522
526
auto server = MakeIntrusive<TWithMemoryControllerServer>(serverSettings);
523
- server->ProcessMemoryInfo ->CGroupLimit = 1000_MB ;
527
+ server->ProcessMemoryInfo ->CGroupLimit = currentHardMemoryLimit ;
524
528
auto & runtime = *server->GetRuntime ();
525
529
TAutoPtr<IEventHandle> handle;
526
530
auto sender = runtime.AllocateEdgeActor ();
@@ -529,25 +533,81 @@ Y_UNIT_TEST(ResourceBroker_ConfigCS) {
529
533
530
534
runtime.SimulateSleep (TDuration::Seconds (2 ));
531
535
532
- auto checkMemoryLimit = [&](const TString& queueName, const ui64 expectedLimit ) {
536
+ auto checkMemoryLimit = [&](const TString& queueName, const double coeff ) {
533
537
runtime.Send (new IEventHandle (MakeResourceBrokerID (), sender, new TEvResourceBroker::TEvConfigRequest (queueName)));
534
538
auto config = runtime.GrabEdgeEvent <TEvResourceBroker::TEvConfigResponse>(handle);
535
- UNIT_ASSERT_VALUES_EQUAL (config->QueueConfig ->GetLimit ().GetMemory (), expectedLimit);
539
+ UNIT_ASSERT_VALUES_EQUAL (config->QueueConfig ->GetLimit ().GetMemory (),
540
+ static_cast <ui64>(currentHardMemoryLimit * coeff * compactionMemoryLimitPercent / 100 ));
536
541
};
537
542
538
- checkMemoryLimit (NLocalDb::ColumnShardCompactionIndexationQueue, 40_MB);
539
- checkMemoryLimit (NLocalDb::ColumnShardCompactionTtlQueue, 40_MB);
540
- checkMemoryLimit (NLocalDb::ColumnShardCompactionGeneralQueue, 120_MB);
541
- checkMemoryLimit (NLocalDb::ColumnShardCompactionNormalizerQueue, 120_MB);
543
+ using OlapLimits = NKikimr::NOlap::TGlobalLimits;
544
+ checkMemoryLimit (NLocalDb::ColumnShardCompactionIndexationQueue, OlapLimits::CompactionIndexationQueueLimitCoefficient);
545
+ checkMemoryLimit (NLocalDb::ColumnShardCompactionTtlQueue, OlapLimits::CompactionTtlQueueLimitCoefficient);
546
+ checkMemoryLimit (NLocalDb::ColumnShardCompactionGeneralQueue, OlapLimits::CompactionGeneralQueueLimitCoefficient);
547
+ checkMemoryLimit (NLocalDb::ColumnShardCompactionNormalizerQueue, OlapLimits::CompactionNormalizerQueueLimitCoefficient);
542
548
543
549
// Check memory change
544
- server->ProcessMemoryInfo ->CGroupLimit = 50_MB;
550
+ currentHardMemoryLimit = 100_MB;
551
+ server->ProcessMemoryInfo ->CGroupLimit = currentHardMemoryLimit;
552
+ runtime.SimulateSleep (TDuration::Seconds (2 ));
553
+
554
+ checkMemoryLimit (NLocalDb::ColumnShardCompactionIndexationQueue, OlapLimits::CompactionIndexationQueueLimitCoefficient);
555
+ checkMemoryLimit (NLocalDb::ColumnShardCompactionTtlQueue, OlapLimits::CompactionTtlQueueLimitCoefficient);
556
+ checkMemoryLimit (NLocalDb::ColumnShardCompactionGeneralQueue, OlapLimits::CompactionGeneralQueueLimitCoefficient);
557
+ checkMemoryLimit (NLocalDb::ColumnShardCompactionNormalizerQueue, OlapLimits::CompactionNormalizerQueueLimitCoefficient);
558
+ }
559
+
560
+ Y_UNIT_TEST (GroupedMemoryLimiter_ConfigCS) {
561
+ using namespace NResourceBroker ;
562
+
563
+ TPortManager pm;
564
+ TServerSettings serverSettings (pm.GetPort (2134 ));
565
+ serverSettings.SetDomainName (" Root" ).SetUseRealThreads (false );
566
+
567
+ const ui64 compactionMemoryLimitPercent = 36 ;
568
+ const ui64 readExecutionMemoryLimitPercent = 20 ;
569
+ auto memoryControllerConfig = serverSettings.AppConfig ->MutableMemoryControllerConfig ();
570
+ memoryControllerConfig->SetColumnTablesCompactionLimitPercent (compactionMemoryLimitPercent);
571
+ memoryControllerConfig->SetColumnTablesReadExecutionLimitPercent (readExecutionMemoryLimitPercent);
572
+
573
+ ui64 currentHardMemoryLimit = 1000_MB;
574
+ auto server = MakeIntrusive<TWithMemoryControllerServer>(serverSettings);
575
+ server->ProcessMemoryInfo ->CGroupLimit = currentHardMemoryLimit;
576
+ auto & runtime = *server->GetRuntime ();
577
+ TAutoPtr<IEventHandle> handle;
578
+ auto sender = runtime.AllocateEdgeActor ();
579
+
580
+ auto scanLimits = NKikimr::NOlap::NGroupedMemoryManager::TScanMemoryLimiterOperator::GetDefaultStageFeatures ();
581
+ auto compactionLimits = NKikimr::NOlap::NGroupedMemoryManager::TCompMemoryLimiterOperator::GetDefaultStageFeatures ();
582
+
583
+ InitRoot (server, sender);
584
+
585
+ auto checkMemoryLimits = [&]() {
586
+ using OlapLimits = NKikimr::NOlap::TGlobalLimits;
587
+ UNIT_ASSERT_VALUES_EQUAL (static_cast <ui64>(currentHardMemoryLimit * OlapLimits::GroupedMemoryLimiterSoftLimitCoefficient * readExecutionMemoryLimitPercent / 100 ),
588
+ scanLimits->GetLimit ());
589
+ UNIT_ASSERT_VALUES_EQUAL (currentHardMemoryLimit * readExecutionMemoryLimitPercent / 100 , scanLimits->GetHardLimit ());
590
+
591
+ UNIT_ASSERT_VALUES_EQUAL (static_cast <ui64>(currentHardMemoryLimit * OlapLimits::GroupedMemoryLimiterCompactionLimitCoefficient * OlapLimits::GroupedMemoryLimiterSoftLimitCoefficient * compactionMemoryLimitPercent / 100 ),
592
+ compactionLimits->GetLimit ());
593
+ UNIT_ASSERT_VALUES_EQUAL (static_cast <ui64>(currentHardMemoryLimit * OlapLimits::GroupedMemoryLimiterCompactionLimitCoefficient * compactionMemoryLimitPercent / 100 ),
594
+ compactionLimits->GetHardLimit ());
595
+ };
596
+
545
597
runtime.SimulateSleep (TDuration::Seconds (2 ));
598
+ checkMemoryLimits ();
546
599
547
- checkMemoryLimit (NLocalDb::ColumnShardCompactionIndexationQueue, 2_MB);
548
- checkMemoryLimit (NLocalDb::ColumnShardCompactionTtlQueue, 2_MB);
549
- checkMemoryLimit (NLocalDb::ColumnShardCompactionGeneralQueue, 6_MB);
550
- checkMemoryLimit (NLocalDb::ColumnShardCompactionNormalizerQueue, 6_MB);
600
+ // Check memory decrease
601
+ currentHardMemoryLimit = 500_MB;
602
+ server->ProcessMemoryInfo ->CGroupLimit = currentHardMemoryLimit;
603
+ runtime.SimulateSleep (TDuration::Seconds (2 ));
604
+ checkMemoryLimits ();
605
+
606
+ // Check memory increase
607
+ currentHardMemoryLimit = 2000_MB;
608
+ server->ProcessMemoryInfo ->CGroupLimit = currentHardMemoryLimit;
609
+ runtime.SimulateSleep (TDuration::Seconds (2 ));
610
+ checkMemoryLimits ();
551
611
}
552
612
}
553
613
0 commit comments