[MINOR] compute the max of sessions/s on fe/be/srv
Some users want to keep the max sessions/s seen on servers, frontends
and backends for capacity planning. It's easy to grab it while the
session count is updated, so let's keep it.
diff --git a/include/proto/proxy.h b/include/proto/proxy.h
index e56de12..adb16ce 100644
--- a/include/proto/proxy.h
+++ b/include/proto/proxy.h
@@ -69,6 +69,8 @@
{
fe->cum_feconn++;
update_freq_ctr(&fe->fe_sess_per_sec, 1);
+ if (fe->fe_sess_per_sec.curr_ctr > fe->fe_sps_max)
+ fe->fe_sps_max = fe->fe_sess_per_sec.curr_ctr;
}
/* increase the number of cumulated connections on the designated backend */
@@ -76,6 +78,8 @@
{
be->cum_beconn++;
update_freq_ctr(&be->be_sess_per_sec, 1);
+ if (be->be_sess_per_sec.curr_ctr > be->be_sps_max)
+ be->be_sps_max = be->be_sess_per_sec.curr_ctr;
}
#endif /* _PROTO_PROXY_H */
diff --git a/include/proto/server.h b/include/proto/server.h
index e05a4ac..7479c2e 100644
--- a/include/proto/server.h
+++ b/include/proto/server.h
@@ -40,6 +40,8 @@
{
s->cum_sess++;
update_freq_ctr(&s->sess_per_sec, 1);
+ if (s->sess_per_sec.curr_ctr > s->sps_max)
+ s->sps_max = s->sess_per_sec.curr_ctr;
}
#endif /* _PROTO_SERVER_H */
diff --git a/include/types/proxy.h b/include/types/proxy.h
index 7ef5fc8..9e49bd8 100644
--- a/include/types/proxy.h
+++ b/include/types/proxy.h
@@ -230,11 +230,13 @@
unsigned int feconn, feconn_max; /* # of active frontend sessions */
unsigned int beconn, beconn_max; /* # of active backend sessions */
struct freq_ctr fe_sess_per_sec; /* sessions per second on the frontend */
+ unsigned int fe_sps_max; /* maximum of new sessions per second seen on the frontend */
struct freq_ctr be_sess_per_sec; /* sessions per second on the backend */
+ unsigned int be_sps_max; /* maximum of new sessions per second seen on the backend */
long long cum_feconn, cum_beconn; /* cumulated number of processed sessions */
long long cum_lbconn; /* cumulated number of sessions processed by load balancing */
unsigned int maxconn; /* max # of active sessions on the frontend */
- unsigned int fe_maxsps; /* max # of new sessions per second on the frontend */
+ unsigned int fe_sps_lim; /* limit on new sessions per second on the frontend */
unsigned int fullconn; /* #conns on backend above which servers are used at full load */
struct in_addr except_net, except_mask; /* don't x-forward-for for this address. FIXME: should support IPv6 */
struct in_addr except_to; /* don't x-original-to for this address. */
diff --git a/include/types/server.h b/include/types/server.h
index a52a9d8..7c7a54e 100644
--- a/include/types/server.h
+++ b/include/types/server.h
@@ -124,6 +124,7 @@
long long retries, redispatches; /* retried and redispatched connections */
long long failed_secu; /* blocked responses because of security concerns */
struct freq_ctr sess_per_sec; /* sessions per second on this server */
+ unsigned int sps_max; /* maximum of new sessions per second seen on this server */
long long cum_sess; /* cumulated number of sessions really sent to this server */
long long cum_lbconn; /* cumulated number of sessions directed by load balancing */
diff --git a/src/cfgparse.c b/src/cfgparse.c
index e3c8b62..bfcccf2 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -787,7 +787,7 @@
if (curproxy->cap & PR_CAP_FE) {
curproxy->maxconn = defproxy.maxconn;
curproxy->backlog = defproxy.backlog;
- curproxy->fe_maxsps = defproxy.fe_maxsps;
+ curproxy->fe_sps_lim = defproxy.fe_sps_lim;
/* initialize error relocations */
for (rc = 0; rc < HTTP_ERR_SIZE; rc++) {
diff --git a/src/client.c b/src/client.c
index eb61da5..3e156eb 100644
--- a/src/client.c
+++ b/src/client.c
@@ -70,8 +70,8 @@
int cfd;
int max_accept = global.tune.maxaccept;
- if (p->fe_maxsps) {
- int max = freq_ctr_remain(&p->fe_sess_per_sec, p->fe_maxsps, 0);
+ if (p->fe_sps_lim) {
+ int max = freq_ctr_remain(&p->fe_sess_per_sec, p->fe_sps_lim, 0);
if (max_accept > max)
max_accept = max;
}
diff --git a/src/proxy.c b/src/proxy.c
index a64bd0c..b3b33d4 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -195,8 +195,8 @@
name = args[0];
if (!strcmp(args[0], "sessions")) {
name = "sessions";
- tv = &proxy->fe_maxsps;
- td = &defpx->fe_maxsps;
+ tv = &proxy->fe_sps_lim;
+ td = &defpx->fe_sps_lim;
cap = PR_CAP_FE;
} else {
snprintf(err, errlen,
@@ -414,8 +414,8 @@
if (p->feconn >= p->maxconn)
goto do_block;
- if (p->fe_maxsps &&
- (wait = next_event_delay(&p->fe_sess_per_sec, p->fe_maxsps, 0))) {
+ if (p->fe_sps_lim &&
+ (wait = next_event_delay(&p->fe_sess_per_sec, p->fe_sps_lim, 0))) {
/* we're blocking because a limit was reached on the number of
* requests/s on the frontend. We want to re-check ASAP, which
* means in 1 ms before estimated expiration date, because the