Skip to content

Commit

Permalink
added stats for local & total latencies
Browse files Browse the repository at this point in the history
NOTE: that we assume that first server in downstream server list is
'local'. Corresponding change will be made to ns_server.

Change-Id: I8dd5c61828f6cdcc3c75a0e4f8d2559731701341
Reviewed-on: http://review.membase.org/4499
Tested-by: Aliaksey Kandratsenka <alkondratenko@gmail.com>
Reviewed-by: Steve Yen <steve.yen@gmail.com>
  • Loading branch information
Aliaksey Kandratsenka authored and steveyen committed Feb 10, 2011
1 parent 5ff2be7 commit 2dc6f3e
Show file tree
Hide file tree
Showing 9 changed files with 80 additions and 12 deletions.
24 changes: 24 additions & 0 deletions agent_stats.c
Expand Up @@ -647,6 +647,15 @@ static void proxy_stats_dump_pstd_stats(ADD_STAT add_stats,
"%llu", (long long unsigned int) pstats->err_upstream_write_prep);
APPEND_PREFIX_STAT("err_downstream_write_prep",
"%llu", (long long unsigned int) pstats->err_downstream_write_prep);
APPEND_PREFIX_STAT("tot_cmd_time",
"%llu", (long long unsigned int) pstats->tot_cmd_time);
APPEND_PREFIX_STAT("tot_cmd_count",
"%llu", (long long unsigned int) pstats->tot_cmd_count);
APPEND_PREFIX_STAT("tot_local_cmd_time",
"%llu", (long long unsigned int) pstats->tot_local_cmd_time);
APPEND_PREFIX_STAT("tot_local_cmd_count",
"%llu", (long long unsigned int) pstats->tot_local_cmd_count);

}

static void proxy_stats_dump_stats_cmd(ADD_STAT add_stats, conn *c,
Expand Down Expand Up @@ -1267,6 +1276,11 @@ static void add_proxy_stats(proxy_stats *agg, proxy_stats *x) {
agg->err_oom += x->err_oom;
agg->err_upstream_write_prep += x->err_upstream_write_prep;
agg->err_downstream_write_prep += x->err_downstream_write_prep;

agg->tot_cmd_time += x->tot_cmd_time;
agg->tot_cmd_count += x->tot_cmd_count;
agg->tot_local_cmd_time += x->tot_local_cmd_time;
agg->tot_local_cmd_count += x->tot_local_cmd_count;
}

static void add_stats_cmd(proxy_stats_cmd *agg,
Expand Down Expand Up @@ -1545,6 +1559,16 @@ void map_pstd_foreach_emit(const void *k,
more_stat("err_downstream_write_prep",
pstd->stats.err_downstream_write_prep);

more_stat("tot_cmd_time",
pstd->stats.tot_cmd_time);
more_stat("tot_cmd_count",
pstd->stats.tot_cmd_count);

more_stat("tot_local_cmd_time",
pstd->stats.tot_local_cmd_time);
more_stat("tot_local_cmd_count",
pstd->stats.tot_local_cmd_count);

snprintf(buf_key, sizeof(buf_key), "%s:stats_cmd_", name);
emit_proxy_stats_cmd(emit->result, buf_key, "%s_%s_%s", pstd->stats_cmd);
}
Expand Down
6 changes: 5 additions & 1 deletion check_moxi_agent.c
Expand Up @@ -173,7 +173,11 @@ struct field_description proxy_stats_description[] = {
describe_field(struct proxy_stats, tot_optimize_sets),
describe_field(struct proxy_stats, err_oom),
describe_field(struct proxy_stats, err_upstream_write_prep),
describe_field(struct proxy_stats, err_downstream_write_prep)
describe_field(struct proxy_stats, err_downstream_write_prep),
describe_field(struct proxy_stats, tot_cmd_time),
describe_field(struct proxy_stats, tot_cmd_count),
describe_field(struct proxy_stats, tot_local_cmd_time),
describe_field(struct proxy_stats, tot_local_cmd_count)
};

struct field_description proxy_stats_cmd_description[] = {
Expand Down
23 changes: 23 additions & 0 deletions cproxy.c
Expand Up @@ -2942,10 +2942,33 @@ void cproxy_upstream_state_change(conn *c, enum conn_states next_state) {
if (ptd != NULL) {
if (c->state == conn_pause) {
ptd->stats.stats.tot_upstream_unpaused++;
c->cmd_unpaused = true;
}
if (next_state == conn_pause) {
ptd->stats.stats.tot_upstream_paused++;
}

if (next_state == conn_parse_cmd && c->cmd_arrive_time == 0) {
c->cmd_unpaused = false;
c->hit_local = false;
c->cmd_arrive_time = usec_now();
}

if (next_state == conn_closing || next_state == conn_new_cmd) {
uint64_t arrive_time = c->cmd_arrive_time;
if (c->cmd_unpaused && arrive_time != 0) {
uint64_t latency = usec_now() - c->cmd_arrive_time;

if (c->hit_local) {
ptd->stats.stats.tot_local_cmd_time += latency;
ptd->stats.stats.tot_local_cmd_count++;
}

ptd->stats.stats.tot_cmd_time += latency;
ptd->stats.stats.tot_cmd_count++;
c->cmd_arrive_time = 0;
}
}
}
}

Expand Down
4 changes: 4 additions & 0 deletions cproxy.h
Expand Up @@ -324,6 +324,10 @@ struct proxy_stats {
uint64_t err_oom;
uint64_t err_upstream_write_prep;
uint64_t err_downstream_write_prep;
uint64_t tot_cmd_time;
uint64_t tot_cmd_count;
uint64_t tot_local_cmd_time;
uint64_t tot_local_cmd_count;
};

typedef struct {
Expand Down
12 changes: 10 additions & 2 deletions cproxy_protocol_a2b.c
Expand Up @@ -1217,16 +1217,20 @@ bool cproxy_forward_a2b_simple_downstream(downstream *d,
// Handle all other simple commands.
//
int vbucket = -1;
bool local;

conn *c = cproxy_find_downstream_conn_ex(d, key, key_len,
NULL, &vbucket);
&local, &vbucket);

if (uc->cmd_curr == PROTOCOL_BINARY_CMD_VERSION) {
key = NULL;
key_len = 0;
}

if (c != NULL) {
if (local) {
uc->hit_local = true;
}
if (cproxy_prep_conn_for_write(c)) {
assert(c->state == conn_pause);
assert(c->wbuf);
Expand Down Expand Up @@ -1512,10 +1516,14 @@ bool cproxy_forward_a2b_item_downstream(downstream *d, short cmd,
// Assuming we're already connected to downstream.
//
int vbucket = -1;
bool local;

conn *c = cproxy_find_downstream_conn_ex(d, ITEM_key(it), it->nkey,
NULL, &vbucket);
&local, &vbucket);
if (c != NULL) {
if (local) {
uc->hit_local = true;
}
if (cproxy_prep_conn_for_write(c)) {
if (settings.verbose > 2) {
moxi_log_write("%d: a2b_item_forward, state: %s\n",
Expand Down
6 changes: 5 additions & 1 deletion cproxy_protocol_b2b.c
Expand Up @@ -164,10 +164,14 @@ bool b2b_forward_item(conn *uc, downstream *d, item *it) {
}

int vbucket = -1;
bool local;

conn *c = cproxy_find_downstream_conn_ex(d, key, keylen,
NULL, &vbucket);
&local, &vbucket);
if (c != NULL) {
if (local) {
uc->hit_local = true;
}
if (b2b_forward_item_vbucket(uc, d, it, c, vbucket) == true) {
d->downstream_used_start = 1;
d->downstream_used = 1;
Expand Down
2 changes: 2 additions & 0 deletions cproxy_stats.c
Expand Up @@ -440,6 +440,8 @@ void cproxy_reset_stats(proxy_stats *ps) {
ps->err_oom = 0;
ps->err_upstream_write_prep = 0;
ps->err_downstream_write_prep = 0;
ps->tot_cmd_time = 0;
ps->tot_cmd_count = 0;
}

void cproxy_reset_stats_cmd(proxy_stats_cmd *sc) {
Expand Down
11 changes: 3 additions & 8 deletions mcs.c
Expand Up @@ -657,15 +657,10 @@ char *mcs_server_st_ident(mcs_server_st *msst, bool is_ascii) {

char *buf = is_ascii ? msst->ident_a : msst->ident_b;
if (buf[0] == '\0') {
const char *usr = mcs_server_st_usr(msst) != NULL ?
mcs_server_st_usr(msst) :
NULL;
const char *usr = mcs_server_st_usr(msst);
const char *pwd = mcs_server_st_pwd(msst);

const char *pwd = mcs_server_st_pwd(msst) != NULL ?
mcs_server_st_pwd(msst) :
NULL;

snprintf(buf, MCS_IDENT_SIZE - 1,
snprintf(buf, MCS_IDENT_SIZE,
"%s:%d:%s:%s:%d",
mcs_server_st_hostname(msst),
mcs_server_st_port(msst),
Expand Down
4 changes: 4 additions & 0 deletions memcached.h
Expand Up @@ -486,6 +486,10 @@ struct conn {
uint64_t cmd_start_time; // Snapshot of usec_now or msec_current_time.
int cmd_retries;

bool hit_local;
bool cmd_unpaused;
uint64_t cmd_arrive_time;

bin_cmd *corked;

char *host_ident; // Uniquely identifies a memcached server, including
Expand Down

0 comments on commit 2dc6f3e

Please sign in to comment.