remove initial linear growth, increase avg period to 3 sec

This commit is contained in:
Sergei Trifonov 2022-07-16 02:17:18 +02:00
parent 8a5286ea4c
commit 82f98cfe6b
3 changed files with 18 additions and 8 deletions

View File

@ -1,8 +1,10 @@
#pragma once #pragma once
#include <base/defines.h>
#include <base/types.h> #include <base/types.h>
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
#include <cassert>
namespace DB namespace DB
{ {
@ -20,12 +22,14 @@ public:
/// Previous events that are older than `period` from `now` will be forgotten /// Previous events that are older than `period` from `now` will be forgotten
/// in a way to keep average event rate the same, using exponential smoothing. /// in a way to keep average event rate the same, using exponential smoothing.
/// NOTE: Adding events into distant past (further than `period`) must be avoided. /// NOTE: Adding events into distant past (further than `period`) must be avoided.
void add(UInt64 now, UInt64 count) void add(UInt64 now, UInt64 count = 1)
{ {
if (unlikely(end == 0)) if (unlikely(end == 0))
{ {
// Initialization during the first call // Initialization during the first call
end = now + period; if (start == 0)
start = now;
end = start + period;
} }
else if (now > end) else if (now > end)
{ {
@ -47,15 +51,20 @@ public:
} }
/// Compute average event rate thoughout `[now - period, now]` period. /// Compute average event rate thoughout `[now - period, now]` period.
/// If measurements are just started (`now - period < start`), then average
/// is computed based on shorter `[start; now]` period to avoid initial linear growth.
double rate(UInt64 now) double rate(UInt64 now)
{ {
add(now, 0); add(now, 0);
return double(events) / period; if (unlikely(now <= start))
return 0;
return double(events) / std::min(period, now - start);
} }
void reset() void reset(UInt64 now)
{ {
events = 0; events = 0;
start = now;
end = 0; end = 0;
} }
@ -63,8 +72,9 @@ private:
const UInt64 period; const UInt64 period;
const UInt64 step; const UInt64 step;
const double decay; const double decay;
double events = 0; // Estimated number of events in [now - period, now] range double events = 0; // Estimated number of events in [end - period, end] range
UInt64 end = 0; UInt64 start = 0; // Instant in past without events before it; when measurement started or reset
UInt64 end = 0; // Instant in future to start decay; moving in steps
}; };
} }

View File

@ -56,7 +56,7 @@ void ProgressIndication::resetProgress()
write_progress_on_update = false; write_progress_on_update = false;
{ {
std::lock_guard lock(profile_events_mutex); std::lock_guard lock(profile_events_mutex);
cpu_usage_meter.reset(); cpu_usage_meter.reset(clock_gettime_ns());
thread_data.clear(); thread_data.clear();
} }
} }

View File

@ -91,7 +91,7 @@ private:
bool write_progress_on_update = false; bool write_progress_on_update = false;
EventRateMeter cpu_usage_meter{1'000'000'000 /*ns*/}; // average cpu utilization per 1 second EventRateMeter cpu_usage_meter{3'000'000'000 /*ns*/}; // average cpu utilization last 3 second
HostToThreadTimesMap thread_data; HostToThreadTimesMap thread_data;
/// In case of all of the above: /// In case of all of the above:
/// - clickhouse-local /// - clickhouse-local