Skip to content

Commit e8267c3

Browse files
Hor911blinkov
authored andcommitted
Accurate TR timings (#14487)
1 parent 7cf23f3 commit e8267c3

File tree

6 files changed

+90
-37
lines changed

6 files changed

+90
-37
lines changed

ydb/library/yql/dq/actors/compute/dq_compute_actor_stats.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,8 +284,9 @@ void FillTaskRunnerStats(ui64 taskId, ui32 stageId, const TTaskRunnerStatsBase&
284284
protoTask->SetResultRows(resultStats.Rows);
285285
protoTask->SetResultBytes(resultStats.Bytes);
286286

287-
protoTask->SetFinishTimeMs(finishTime.MilliSeconds());
287+
protoTask->SetCreateTimeMs(taskStats.CreateTs.MilliSeconds());
288288
protoTask->SetStartTimeMs(startTime.MilliSeconds());
289+
protoTask->SetFinishTimeMs(finishTime.MilliSeconds());
289290
}
290291

291292
} // namespace NDq

ydb/library/yql/dq/actors/protos/dq_stats.proto

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -247,11 +247,8 @@ message TDqTaskStats {
247247

248248
google.protobuf.Any Extra = 200;
249249

250-
// BASIC: StartTs from TR since we don't have better times
251-
// FULL+: min(FirstMessageMs) from all Inputs
250+
uint64 CreateTimeMs = 166;
252251
uint64 StartTimeMs = 158;
253-
254-
// always FinishTs from TR
255252
uint64 FinishTimeMs = 5;
256253

257254
reserved 4; // was FirstRowTimeMs

ydb/library/yql/dq/runtime/dq_input_producer.cpp

Lines changed: 59 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,15 @@ template<bool IsWide>
2424
class TDqInputUnionStreamValue : public TComputationValue<TDqInputUnionStreamValue<IsWide>> {
2525
using TBase = TComputationValue<TDqInputUnionStreamValue<IsWide>>;
2626
public:
27-
TDqInputUnionStreamValue(TMemoryUsageInfo* memInfo, const NKikimr::NMiniKQL::TType* type, TVector<IDqInput::TPtr>&& inputs, TDqMeteringStats::TInputStatsMeter stats)
27+
TDqInputUnionStreamValue(TMemoryUsageInfo* memInfo, const NKikimr::NMiniKQL::TType* type, TVector<IDqInput::TPtr>&& inputs,
28+
TDqMeteringStats::TInputStatsMeter stats, TInstant& startTs, bool& inputConsumed)
2829
: TBase(memInfo)
2930
, Inputs(std::move(inputs))
3031
, Alive(Inputs.size())
3132
, Batch(type)
3233
, Stats(stats)
34+
, StartTs(startTs)
35+
, InputConsumed(inputConsumed)
3336
{}
3437

3538
private:
@@ -41,6 +44,10 @@ class TDqInputUnionStreamValue : public TComputationValue<TDqInputUnionStreamVal
4144
case NUdf::EFetchStatus::Ok:
4245
break;
4346
case NUdf::EFetchStatus::Finish:
47+
if (Y_UNLIKELY(!StartTs)) {
48+
StartTs = Now();
49+
}
50+
[[fallthrough]];
4451
case NUdf::EFetchStatus::Yield:
4552
return status;
4653
}
@@ -52,6 +59,10 @@ class TDqInputUnionStreamValue : public TComputationValue<TDqInputUnionStreamVal
5259
if (Stats) {
5360
Stats.Add(result);
5461
}
62+
if (Y_UNLIKELY(!StartTs)) {
63+
StartTs = Now();
64+
}
65+
InputConsumed = true;
5566
return NUdf::EFetchStatus::Ok;
5667
}
5768

@@ -63,6 +74,10 @@ class TDqInputUnionStreamValue : public TComputationValue<TDqInputUnionStreamVal
6374
case NUdf::EFetchStatus::Ok:
6475
break;
6576
case NUdf::EFetchStatus::Finish:
77+
if (Y_UNLIKELY(!StartTs)) {
78+
StartTs = Now();
79+
}
80+
[[fallthrough]];
6681
case NUdf::EFetchStatus::Yield:
6782
return status;
6883
}
@@ -76,6 +91,10 @@ class TDqInputUnionStreamValue : public TComputationValue<TDqInputUnionStreamVal
7691
if (Stats) {
7792
Stats.Add(result, width);
7893
}
94+
if (Y_UNLIKELY(!StartTs)) {
95+
StartTs = Now();
96+
}
97+
InputConsumed = true;
7998
return NUdf::EFetchStatus::Ok;
8099
}
81100

@@ -108,19 +127,23 @@ class TDqInputUnionStreamValue : public TComputationValue<TDqInputUnionStreamVal
108127
size_t Index = 0;
109128
TUnboxedValueBatch Batch;
110129
TDqMeteringStats::TInputStatsMeter Stats;
130+
TInstant& StartTs;
131+
bool& InputConsumed;
111132
};
112133

113134
template<bool IsWide>
114135
class TDqInputMergeStreamValue : public TComputationValue<TDqInputMergeStreamValue<IsWide>> {
115136
using TBase = TComputationValue<TDqInputMergeStreamValue<IsWide>>;
116137
public:
117138
TDqInputMergeStreamValue(TMemoryUsageInfo* memInfo, const NKikimr::NMiniKQL::TType* type, TVector<IDqInput::TPtr>&& inputs,
118-
TVector<TSortColumnInfo>&& sortCols, TDqMeteringStats::TInputStatsMeter stats)
139+
TVector<TSortColumnInfo>&& sortCols, TDqMeteringStats::TInputStatsMeter stats, TInstant& startTs, bool& inputConsumed)
119140
: TBase(memInfo)
120141
, Inputs(std::move(inputs))
121142
, Width(type->IsMulti() ? static_cast<const NMiniKQL::TMultiType*>(type)->GetElementsCount() : TMaybe<ui32>())
122143
, SortCols(std::move(sortCols))
123144
, Stats(stats)
145+
, StartTs(startTs)
146+
, InputConsumed(inputConsumed)
124147
{
125148
YQL_ENSURE(!IsWide ^ Width.Defined());
126149
CurrentBuffers.reserve(Inputs.size());
@@ -196,6 +219,10 @@ class TDqInputMergeStreamValue : public TComputationValue<TDqInputMergeStreamVal
196219
case NUdf::EFetchStatus::Ok:
197220
break;
198221
case NUdf::EFetchStatus::Finish:
222+
if (Y_UNLIKELY(!StartTs)) {
223+
StartTs = Now();
224+
}
225+
[[fallthrough]];
199226
case NUdf::EFetchStatus::Yield:
200227
return status;
201228
}
@@ -204,6 +231,10 @@ class TDqInputMergeStreamValue : public TComputationValue<TDqInputMergeStreamVal
204231
if (Stats) {
205232
Stats.Add(result);
206233
}
234+
if (Y_UNLIKELY(!StartTs)) {
235+
StartTs = Now();
236+
}
237+
InputConsumed = true;
207238
return NUdf::EFetchStatus::Ok;
208239
}
209240

@@ -223,6 +254,7 @@ class TDqInputMergeStreamValue : public TComputationValue<TDqInputMergeStreamVal
223254
if (Stats) {
224255
Stats.Add(result, width);
225256
}
257+
InputConsumed = true;
226258
return NUdf::EFetchStatus::Ok;
227259
}
228260

@@ -309,6 +341,8 @@ class TDqInputMergeStreamValue : public TComputationValue<TDqInputMergeStreamVal
309341
ui32 InitializationIndex = 0;
310342
TMap<ui32, EDataSlot> SortColTypes;
311343
TDqMeteringStats::TInputStatsMeter Stats;
344+
TInstant& StartTs;
345+
bool& InputConsumed;
312346
};
313347

314348
TVector<NKikimr::NMiniKQL::TType*> ExtractBlockItemTypes(const NKikimr::NMiniKQL::TType* type) {
@@ -380,7 +414,7 @@ class TDqInputMergeBlockStreamValue : public TComputationValue<TDqInputMergeBloc
380414
public:
381415
TDqInputMergeBlockStreamValue(TMemoryUsageInfo* memInfo, const NKikimr::NMiniKQL::TType* type, TVector<IDqInput::TPtr>&& inputs,
382416
TVector<TSortColumnInfo>&& sortCols, const NKikimr::NMiniKQL::THolderFactory& factory, TDqMeteringStats::TInputStatsMeter stats,
383-
NUdf::IPgBuilder* pgBuilder)
417+
TInstant& startTs, bool& inputConsumed, NUdf::IPgBuilder* pgBuilder)
384418
: TBase(memInfo)
385419
, SortCols_(std::move(sortCols))
386420
, ItemTypes_(ExtractBlockItemTypes(type))
@@ -389,6 +423,8 @@ class TDqInputMergeBlockStreamValue : public TComputationValue<TDqInputMergeBloc
389423
, Builders_(MakeBuilders(MaxOutputBlockLen_, ItemTypes_, pgBuilder))
390424
, Factory_(factory)
391425
, Stats_(stats)
426+
, StartTs(startTs)
427+
, InputConsumed(inputConsumed)
392428
{
393429
YQL_ENSURE(MaxOutputBlockLen_ > 0);
394430
InputData_.reserve(inputs.size());
@@ -552,6 +588,9 @@ class TDqInputMergeBlockStreamValue : public TComputationValue<TDqInputMergeBloc
552588
NUdf::EFetchStatus WideFetch(NKikimr::NUdf::TUnboxedValue* result, ui32 width) final {
553589
YQL_ENSURE(width == ItemTypes_.size() + 1);
554590
if (IsFinished_) {
591+
if (Y_UNLIKELY(!StartTs)) {
592+
StartTs = Now();
593+
}
555594
return NUdf::EFetchStatus::Finish;
556595
}
557596

@@ -576,6 +615,10 @@ class TDqInputMergeBlockStreamValue : public TComputationValue<TDqInputMergeBloc
576615
if (Stats_) {
577616
Stats_.Add(result, width);
578617
}
618+
if (Y_UNLIKELY(!StartTs)) {
619+
StartTs = Now();
620+
}
621+
InputConsumed = true;
579622
return NUdf::EFetchStatus::Ok;
580623
}
581624

@@ -645,7 +688,7 @@ class TDqInputMergeBlockStreamValue : public TComputationValue<TDqInputMergeBloc
645688
if (status == NUdf::EFetchStatus::Ok) {
646689
std::make_heap(InputRows_.begin(), InputRows_.end());
647690
}
648-
}
691+
}
649692
}
650693

651694
if (!OutputBlockLen_) {
@@ -685,9 +728,11 @@ class TDqInputMergeBlockStreamValue : public TComputationValue<TDqInputMergeBloc
685728

686729
const NKikimr::NMiniKQL::THolderFactory& Factory_;
687730
TDqMeteringStats::TInputStatsMeter Stats_;
688-
731+
689732
std::unique_ptr<TArgsDechunker> Output_;
690733
bool IsFinished_ = false;
734+
TInstant& StartTs;
735+
bool& InputConsumed;
691736
};
692737

693738
void ValidateInputTypes(const NKikimr::NMiniKQL::TType* type, const TVector<IDqInput::TPtr>& inputs) {
@@ -723,7 +768,7 @@ void TDqMeteringStats::TInputStatsMeter::Add(const NKikimr::NUdf::TUnboxedValue*
723768
} else {
724769
Stats->RowsConsumed += 1;
725770
}
726-
771+
727772
NYql::NDq::TDqDataSerializer::TEstimateSizeSettings settings;
728773
settings.DiscardUnsupportedTypes = true;
729774
settings.WithHeaders = false;
@@ -740,18 +785,18 @@ void TDqMeteringStats::TInputStatsMeter::Add(const NKikimr::NUdf::TUnboxedValue*
740785
}
741786

742787
NUdf::TUnboxedValue CreateInputUnionValue(const NKikimr::NMiniKQL::TType* type, TVector<IDqInput::TPtr>&& inputs,
743-
const NMiniKQL::THolderFactory& factory, TDqMeteringStats::TInputStatsMeter stats)
788+
const NMiniKQL::THolderFactory& factory, TDqMeteringStats::TInputStatsMeter stats, TInstant& startTs, bool& inputConsumed)
744789
{
745790
ValidateInputTypes(type, inputs);
746791
if (type->IsMulti()) {
747-
return factory.Create<TDqInputUnionStreamValue<true>>(type, std::move(inputs), stats);
792+
return factory.Create<TDqInputUnionStreamValue<true>>(type, std::move(inputs), stats, startTs, inputConsumed);
748793
}
749-
return factory.Create<TDqInputUnionStreamValue<false>>(type, std::move(inputs), stats);
794+
return factory.Create<TDqInputUnionStreamValue<false>>(type, std::move(inputs), stats, startTs, inputConsumed);
750795
}
751796

752797
NKikimr::NUdf::TUnboxedValue CreateInputMergeValue(const NKikimr::NMiniKQL::TType* type, TVector<IDqInput::TPtr>&& inputs,
753798
TVector<TSortColumnInfo>&& sortCols, const NKikimr::NMiniKQL::THolderFactory& factory, TDqMeteringStats::TInputStatsMeter stats,
754-
NUdf::IPgBuilder* pgBuilder)
799+
TInstant& startTs, bool& inputConsumed, NUdf::IPgBuilder* pgBuilder)
755800
{
756801
ValidateInputTypes(type, inputs);
757802
YQL_ENSURE(!inputs.empty());
@@ -760,13 +805,13 @@ NKikimr::NUdf::TUnboxedValue CreateInputMergeValue(const NKikimr::NMiniKQL::TTyp
760805
// we can ignore scalar columns, since all they have exactly the same value in all inputs
761806
EraseIf(sortCols, [](const auto& sortCol) { return *sortCol.IsScalar; });
762807
if (sortCols.empty()) {
763-
return factory.Create<TDqInputUnionStreamValue<true>>(type, std::move(inputs), stats);
808+
return factory.Create<TDqInputUnionStreamValue<true>>(type, std::move(inputs), stats, startTs, inputConsumed);
764809
}
765-
return factory.Create<TDqInputMergeBlockStreamValue>(type, std::move(inputs), std::move(sortCols), factory, stats, pgBuilder);
810+
return factory.Create<TDqInputMergeBlockStreamValue>(type, std::move(inputs), std::move(sortCols), factory, stats, startTs, inputConsumed, pgBuilder);
766811
}
767-
return factory.Create<TDqInputMergeStreamValue<true>>(type, std::move(inputs), std::move(sortCols), stats);
812+
return factory.Create<TDqInputMergeStreamValue<true>>(type, std::move(inputs), std::move(sortCols), stats, startTs, inputConsumed);
768813
}
769-
return factory.Create<TDqInputMergeStreamValue<false>>(type, std::move(inputs), std::move(sortCols), stats);
814+
return factory.Create<TDqInputMergeStreamValue<false>>(type, std::move(inputs), std::move(sortCols), stats, startTs, inputConsumed);
770815
}
771816

772817
} // namespace NYql::NDq

ydb/library/yql/dq/runtime/dq_input_producer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ struct TDqMeteringStats {
3131
};
3232

3333
NKikimr::NUdf::TUnboxedValue CreateInputUnionValue(const NKikimr::NMiniKQL::TType* type, TVector<IDqInput::TPtr>&& inputs,
34-
const NKikimr::NMiniKQL::THolderFactory& holderFactory, TDqMeteringStats::TInputStatsMeter = {});
34+
const NKikimr::NMiniKQL::THolderFactory& holderFactory, TDqMeteringStats::TInputStatsMeter, TInstant& startTs, bool& inputConsumed);
3535

3636
NKikimr::NUdf::TUnboxedValue CreateInputMergeValue(const NKikimr::NMiniKQL::TType* type, TVector<IDqInput::TPtr>&& inputs,
3737
TVector<TSortColumnInfo>&& sortCols, const NKikimr::NMiniKQL::THolderFactory& factory,
38-
TDqMeteringStats::TInputStatsMeter = {}, NUdf::IPgBuilder* pgBuilder = nullptr);
38+
TDqMeteringStats::TInputStatsMeter, TInstant& startTs, bool& inputConsumed, NUdf::IPgBuilder* pgBuilder = nullptr);
3939

4040
} // namespace NYql::NDq

ydb/library/yql/dq/runtime/dq_tasks_runner.cpp

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -143,21 +143,21 @@ void ValidateParamValue(std::string_view paramName, const TType* type, const NUd
143143

144144
NUdf::TUnboxedValue DqBuildInputValue(const NDqProto::TTaskInput& inputDesc, const NKikimr::NMiniKQL::TType* type,
145145
TVector<IDqInput::TPtr>&& inputs, const THolderFactory& holderFactory, TDqMeteringStats::TInputStatsMeter stats,
146-
NUdf::IPgBuilder* pgBuilder)
146+
TInstant& startTs, bool& inputConsumed, NUdf::IPgBuilder* pgBuilder)
147147
{
148148
switch (inputDesc.GetTypeCase()) {
149149
case NYql::NDqProto::TTaskInput::kSource:
150150
Y_ABORT_UNLESS(inputs.size() == 1);
151151
[[fallthrough]];
152152
case NYql::NDqProto::TTaskInput::kUnionAll:
153-
return CreateInputUnionValue(type, std::move(inputs), holderFactory, stats);
153+
return CreateInputUnionValue(type, std::move(inputs), holderFactory, stats, startTs, inputConsumed);
154154
case NYql::NDqProto::TTaskInput::kMerge: {
155155
const auto& protoSortCols = inputDesc.GetMerge().GetSortColumns();
156156
TVector<TSortColumnInfo> sortColsInfo;
157157
GetSortColumnsInfo(type, protoSortCols, sortColsInfo);
158158
YQL_ENSURE(!sortColsInfo.empty());
159159

160-
return CreateInputMergeValue(type, std::move(inputs), std::move(sortColsInfo), holderFactory, stats, pgBuilder);
160+
return CreateInputMergeValue(type, std::move(inputs), std::move(sortColsInfo), holderFactory, stats, startTs, inputConsumed, pgBuilder);
161161
}
162162
default:
163163
YQL_ENSURE(false, "Unknown input type: " << (ui32) inputDesc.GetTypeCase());
@@ -240,12 +240,10 @@ class TDqTaskRunner : public IDqTaskRunner {
240240
, LogFunc(logFunc)
241241
, AllocatedHolder(std::make_optional<TAllocatedHolder>())
242242
{
243-
if (CollectBasic()) {
244-
Stats = std::make_unique<TDqTaskRunnerStats>();
245-
Stats->StartTs = TInstant::Now();
246-
if (Y_UNLIKELY(CollectFull())) {
247-
Stats->ComputeCpuTimeByRun = NMonitoring::ExponentialHistogram(6, 10, 10);
248-
}
243+
Stats = std::make_unique<TDqTaskRunnerStats>();
244+
Stats->CreateTs = TInstant::Now();
245+
if (Y_UNLIKELY(CollectFull())) {
246+
Stats->ComputeCpuTimeByRun = NMonitoring::ExponentialHistogram(6, 10, 10);
249247
}
250248

251249
if (Context.TypeEnv) {
@@ -531,7 +529,7 @@ class TDqTaskRunner : public IDqTaskRunner {
531529

532530
for (ui32 i = 0; i < task.InputsSize(); ++i) {
533531
auto& inputDesc = task.GetInputs(i);
534-
TDqMeteringStats::TInputStats* inputStats = nullptr;
532+
TDqMeteringStats::TInputStats* inputStats = nullptr;
535533
if (task.EnableMetering()) {
536534
inputStats = &MeteringStats.AddInputs();
537535
}
@@ -592,16 +590,16 @@ class TDqTaskRunner : public IDqTaskRunner {
592590

593591
auto entryNode = AllocatedHolder->ProgramParsed.CompGraph->GetEntryPoint(i, true);
594592
if (transform) {
595-
transform->TransformInput = DqBuildInputValue(inputDesc, transform->TransformInputType, std::move(inputs), holderFactory, {}, PgBuilder_.get());
593+
transform->TransformInput = DqBuildInputValue(inputDesc, transform->TransformInputType, std::move(inputs), holderFactory, {}, Stats->StartTs, InputConsumed, PgBuilder_.get());
596594
inputs.clear();
597595
inputs.emplace_back(transform->TransformOutput);
598596
entryNode->SetValue(AllocatedHolder->ProgramParsed.CompGraph->GetContext(),
599597
CreateInputUnionValue(transform->TransformOutput->GetInputType(), std::move(inputs), holderFactory,
600-
{inputStats, transform->TransformOutputType}));
598+
{inputStats, transform->TransformOutputType}, Stats->StartTs, InputConsumed));
601599
} else {
602600
entryNode->SetValue(AllocatedHolder->ProgramParsed.CompGraph->GetContext(),
603601
DqBuildInputValue(inputDesc, entry->InputItemTypes[i], std::move(inputs), holderFactory,
604-
{inputStats, entry->InputItemTypes[i]}, PgBuilder_.get()));
602+
{inputStats, entry->InputItemTypes[i]}, Stats->StartTs, InputConsumed, PgBuilder_.get()));
605603
}
606604
}
607605

@@ -733,6 +731,7 @@ class TDqTaskRunner : public IDqTaskRunner {
733731
StopWaiting();
734732
}
735733

734+
InputConsumed = false;
736735
auto runStatus = FetchAndDispatch();
737736

738737
if (Y_UNLIKELY(CollectFull())) {
@@ -766,7 +765,9 @@ class TDqTaskRunner : public IDqTaskRunner {
766765
Stats->FinishTs = TInstant::Now();
767766
break;
768767
case ERunStatus::PendingInput:
769-
StartWaitingInput();
768+
if (!InputConsumed) {
769+
StartWaitingInput();
770+
}
770771
break;
771772
case ERunStatus::PendingOutput:
772773
StartWaitingOutput();
@@ -971,6 +972,7 @@ class TDqTaskRunner : public IDqTaskRunner {
971972
TLogFunc LogFunc;
972973
std::unique_ptr<NUdf::ISecureParamsProvider> SecureParamsProvider;
973974
TDqTaskCountersProvider CountersProvider;
975+
bool InputConsumed = false;
974976

975977
struct TInputTransformInfo {
976978
NUdf::TUnboxedValue TransformInput;
@@ -1042,7 +1044,11 @@ class TDqTaskRunner : public IDqTaskRunner {
10421044

10431045
void StopWaiting() {
10441046
if (StartWaitInputTime) {
1045-
Stats->WaitInputTime += (TInstant::Now() - *StartWaitInputTime);
1047+
if (Y_LIKELY(Stats->StartTs)) {
1048+
Stats->WaitInputTime += (TInstant::Now() - *StartWaitInputTime);
1049+
} else {
1050+
Stats->WaitStartTime += (TInstant::Now() - *StartWaitInputTime);
1051+
}
10461052
StartWaitInputTime.reset();
10471053
}
10481054
if (StartWaitOutputTime) {

0 commit comments

Comments
 (0)