MXS-1777 Tune code for cases with slow, or new servers.

Changes that allow slow or new servers to quickly apply samples towards the
server average. The most important changes are to not ignore the first N samples,
and apply an average to the server as soon as there is one available.
The new ResponseStat::make_valid() will use filter samples to add an average,
if no averages have yet been added, even if the number of  filter samples is less
than the filter limit.
This commit is contained in:
Niclas Antti
2018-09-06 08:39:11 +03:00
parent 0e5d827f7a
commit fa7ec95069
5 changed files with 41 additions and 23 deletions

View File

@ -16,10 +16,11 @@
namespace maxscale
{
ResponseStat::ResponseStat(int ignore_first_n, int num_filter_samples,
maxbase::Duration sync_duration) :
m_ignore_first_n{ignore_first_n},
m_num_filter_samples {num_filter_samples},
ResponseStat::ResponseStat(int num_filter_samples,
int num_synch_medians,
maxbase::Duration sync_duration)
: m_num_filter_samples {num_filter_samples},
m_num_synch_medians{num_synch_medians},
m_sync_duration{sync_duration},
m_sample_count{0},
m_samples(num_filter_samples),
@ -30,11 +31,6 @@ ResponseStat::ResponseStat(int ignore_first_n, int num_filter_samples,
void ResponseStat::query_started()
{
if (m_ignore_first_n)
{
--m_ignore_first_n;
return;
}
m_last_start = maxbase::Clock::now();
}
@ -57,6 +53,18 @@ void ResponseStat::query_ended()
m_last_start = maxbase::TimePoint();
}
bool ResponseStat::make_valid()
{
if (!m_average.num_samples() && m_sample_count)
{
maxbase::Duration new_sample = m_samples[m_sample_count / 2];
m_average.add(std::chrono::duration<double>(new_sample).count());
m_sample_count = 0;
}
return is_valid();
}
bool ResponseStat::is_valid() const
{
return m_average.num_samples();
@ -72,10 +80,12 @@ maxbase::Duration ResponseStat::average() const
return maxbase::Duration(m_average.average());
}
bool ResponseStat::sync_time_reached(int num_synch_medians)
bool ResponseStat::sync_time_reached()
{
auto now = maxbase::Clock::now();
bool reached = m_next_sync < now || m_average.num_samples() >= num_synch_medians;
bool reached = m_next_sync < now
|| m_average.num_samples() >= m_num_synch_medians;
if (reached)
{
m_next_sync = now + m_sync_duration;