diff --git a/ydb/library/actors/core/executor_pool_basic.cpp b/ydb/library/actors/core/executor_pool_basic.cpp index 28e73d6aba9a..52f63a90282c 100644 --- a/ydb/library/actors/core/executor_pool_basic.cpp +++ b/ydb/library/actors/core/executor_pool_basic.cpp @@ -611,7 +611,7 @@ namespace NActors { } TExecutorThreadCtx& threadCtx = Threads[threadIdx]; TExecutorThreadStats stats; - threadCtx.Thread->GetCurrentStats(stats); + threadCtx.Thread->GetCurrentStatsForHarmonizer(stats); return {Ts2Us(stats.SafeElapsedTicks), static_cast(stats.CpuUs), stats.NotEnoughCpuExecutions}; } diff --git a/ydb/library/actors/core/executor_pool_shared.cpp b/ydb/library/actors/core/executor_pool_shared.cpp index 54b54e15de0c..2424c18c78be 100644 --- a/ydb/library/actors/core/executor_pool_shared.cpp +++ b/ydb/library/actors/core/executor_pool_shared.cpp @@ -149,12 +149,19 @@ void TSharedExecutorPool::GetSharedStats(i16 poolId, std::vector& statsCopy) { + statsCopy.resize(SharedThreadCount + 1); + for (i16 i = 0; i < SharedThreadCount; ++i) { + Threads[i].Thread->GetSharedStatsForHarmonizer(poolId, statsCopy[i + 1]); + } +} + TCpuConsumption TSharedExecutorPool::GetThreadCpuConsumption(i16 poolId, i16 threadIdx) { if (threadIdx >= SharedThreadCount) { return {0.0, 0.0}; } TExecutorThreadStats stats; - Threads[threadIdx].Thread->GetSharedStats(poolId, stats); + Threads[threadIdx].Thread->GetSharedStatsForHarmonizer(poolId, stats); return {Ts2Us(stats.SafeElapsedTicks), static_cast(stats.CpuUs), stats.NotEnoughCpuExecutions}; } diff --git a/ydb/library/actors/core/executor_pool_shared.h b/ydb/library/actors/core/executor_pool_shared.h index b215a5d4e547..c083c21654a0 100644 --- a/ydb/library/actors/core/executor_pool_shared.h +++ b/ydb/library/actors/core/executor_pool_shared.h @@ -37,6 +37,7 @@ namespace NActors { TSharedExecutorThreadCtx *GetSharedThread(i16 poolId); void GetSharedStats(i16 pool, std::vector& statsCopy); + void GetSharedStatsForHarmonizer(i16 pool, std::vector& statsCopy); TCpuConsumption GetThreadCpuConsumption(i16 poolId, i16 threadIdx); std::vector GetThreadsCpuConsumption(i16 poolId); diff --git a/ydb/library/actors/core/executor_thread.cpp b/ydb/library/actors/core/executor_thread.cpp index b796037508d6..e9287e2059d9 100644 --- a/ydb/library/actors/core/executor_thread.cpp +++ b/ydb/library/actors/core/executor_thread.cpp @@ -811,6 +811,19 @@ namespace NActors { statsCopy.Aggregate(SharedStats[poolId]); } + void TGenericExecutorThread::GetCurrentStatsForHarmonizer(TExecutorThreadStats& statsCopy) { + statsCopy.SafeElapsedTicks = RelaxedLoad(&Ctx.Stats->SafeElapsedTicks); + statsCopy.CpuUs = RelaxedLoad(&Ctx.Stats->CpuUs); + statsCopy.NotEnoughCpuExecutions = RelaxedLoad(&Ctx.Stats->NotEnoughCpuExecutions); + } + + void TGenericExecutorThread::GetSharedStatsForHarmonizer(i16 poolId, TExecutorThreadStats &stats) { + stats.SafeElapsedTicks = RelaxedLoad(&SharedStats[poolId].SafeElapsedTicks); + stats.CpuUs = RelaxedLoad(&SharedStats[poolId].CpuUs); + stats.NotEnoughCpuExecutions = RelaxedLoad(&SharedStats[poolId].NotEnoughCpuExecutions); + } + + TGenericExecutorThreadCtx::~TGenericExecutorThreadCtx() {} } diff --git a/ydb/library/actors/core/executor_thread.h b/ydb/library/actors/core/executor_thread.h index 239c831bac0a..ddbb34254566 100644 --- a/ydb/library/actors/core/executor_thread.h +++ b/ydb/library/actors/core/executor_thread.h @@ -71,6 +71,9 @@ namespace NActors { void GetCurrentStats(TExecutorThreadStats& statsCopy); void GetSharedStats(i16 poolId, TExecutorThreadStats &stats); + void GetCurrentStatsForHarmonizer(TExecutorThreadStats& statsCopy); + void GetSharedStatsForHarmonizer(i16 poolId, TExecutorThreadStats &stats); + TThreadId GetThreadId() const; // blocks, must be called after Start() TWorkerId GetWorkerId() const; diff --git a/ydb/library/actors/core/harmonizer.cpp b/ydb/library/actors/core/harmonizer.cpp index 8d63423fb7a3..12a51556e0f0 100644 --- a/ydb/library/actors/core/harmonizer.cpp +++ b/ydb/library/actors/core/harmonizer.cpp @@ -295,7 +295,7 @@ TCpuConsumption TPoolInfo::PullStats(ui64 ts) { } TVector sharedStats; if (Shared) { - Shared->GetSharedStats(Pool->PoolId, sharedStats); + Shared->GetSharedStatsForHarmonizer(Pool->PoolId, sharedStats); } for (ui32 sharedIdx = 0; sharedIdx < SharedInfo.size(); ++sharedIdx) {