From d32c399747f77d62dc107854b549d40ac94b835b Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 21 Nov 2013 15:30:45 +0100 Subject: [PATCH] MINOR: stats: report correct throttling percentage for servers in slowstart The column used to report the throttle percentage when a server is in slowstart is based on the time only. This is wrong, because server weights in slowstart are updated at most once a second, so the reported value is wrong at least fo rone second during each step, which means all the time when using short delays (< 20s). The second point is that it's disturbing to see a weight < 100% without any throttle at the end of the period (during the last second), because the effective weight has not yet been updated. Instead, we now compute the exact ratio between eweight and uweight and report it. It's always accurate and describes the value being used instead of using only the date. It can be backported to 1.4 though it's not particularly important. --- include/proto/server.h | 14 ++++++++++++++ src/dumpstats.c | 14 ++++---------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/include/proto/server.h b/include/proto/server.h index d19c6ac9f..9c1dbf7fb 100644 --- a/include/proto/server.h +++ b/include/proto/server.h @@ -64,6 +64,20 @@ void srv_dump_kws(char **out); */ void server_recalc_eweight(struct server *sv); +/* returns the current server throttle rate between 0 and 100% */ +static inline unsigned int server_throttle_rate(struct server *sv) +{ + struct proxy *px = sv->proxy; + + /* when uweight is 0, we're in soft-stop so that cannot be a slowstart, + * thus the throttle is 100%. + */ + if (!sv->uweight) + return 100; + + return 100U * (px->lbprm.wmult * sv->eweight + px->lbprm.wdiv - 1) / (px->lbprm.wdiv * sv->uweight); +} + /* * Parses weight_str and configures sv accordingly. * Returns NULL on success, error message string otherwise. diff --git a/src/dumpstats.c b/src/dumpstats.c index e23a766aa..99d16d7d8 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -2326,12 +2326,8 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in chunk_appendf(&trash, ""); /* throttle */ - if ((sv->state & SRV_WARMINGUP) && - now.tv_sec < sv->last_change + sv->slowstart && - now.tv_sec >= sv->last_change) { - chunk_appendf(&trash, "%d %%\n", - (int)MAX(1, 100 * (now.tv_sec - sv->last_change) / sv->slowstart)); - } + if (sv->state & SRV_WARMINGUP) + chunk_appendf(&trash, "%d %%\n", server_throttle_rate(sv)); else chunk_appendf(&trash, "-\n"); } @@ -2406,10 +2402,8 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in relative_pid, px->uuid, sv->puid); /* throttle */ - if ((sv->state & SRV_WARMINGUP) && - now.tv_sec < sv->last_change + sv->slowstart && - now.tv_sec >= sv->last_change) - chunk_appendf(&trash, "%d", (int)MAX(1, 100 * (now.tv_sec - sv->last_change) / sv->slowstart)); + if (sv->state & SRV_WARMINGUP) + chunk_appendf(&trash, "%d", server_throttle_rate(sv)); /* sessions: lbtot */ chunk_appendf(&trash, ",%lld,", sv->counters.cum_lbconn);