From 9635be2650ea49dc6553ce28fbde8fdb6281d3c6 Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Mon, 14 Aug 2017 17:19:54 +0300 Subject: [PATCH] odissey: rework server recv/sent stats; calculate avg --- sources/backend.c | 1 - sources/console.c | 10 ++++++---- sources/frontend.c | 13 ++++--------- sources/periodic.c | 43 ++++++++++++++++++++++++++++++++++++++++--- sources/route_pool.c | 12 +++++++++--- sources/server.h | 17 ++++++----------- 6 files changed, 65 insertions(+), 31 deletions(-) diff --git a/sources/backend.c b/sources/backend.c index f800e6ae..e02214ed 100644 --- a/sources/backend.c +++ b/sources/backend.c @@ -405,7 +405,6 @@ od_backend_query(od_server_t *server, char *context, char *query, int len) /* update server sync state and stats */ od_server_sync_request(server); od_server_stat_request(server); - od_server_stat_sent(server, shapito_stream_used(stream)); rc = od_backend_ready_wait(server, context, UINT32_MAX); if (rc == -1) diff --git a/sources/console.c b/sources/console.c index 6ac3754a..b09f7bab 100644 --- a/sources/console.c +++ b/sources/console.c @@ -142,13 +142,13 @@ od_console_show_stats_add(shapito_stream_t *stream, return -1; /* total_received */ - data_len = snprintf(data, sizeof(data), "%" PRIu64, total->bytes_recv); + data_len = snprintf(data, sizeof(data), "%" PRIu64, total->recv_client); rc = shapito_be_write_data_row_add(stream, offset, data, data_len); if (rc == -1) return -1; /* total_sent */ - data_len = snprintf(data, sizeof(data), "%" PRIu64, total->bytes_sent); + data_len = snprintf(data, sizeof(data), "%" PRIu64, total->recv_server); rc = shapito_be_write_data_row_add(stream, offset, data, data_len); if (rc == -1) return -1; @@ -166,12 +166,14 @@ od_console_show_stats_add(shapito_stream_t *stream, return -1; /* avg_recv */ - rc = shapito_be_write_data_row_add(stream, offset, "0", 1); + data_len = snprintf(data, sizeof(data), "%" PRIu64, avg->recv_client); + rc = shapito_be_write_data_row_add(stream, offset, data, data_len); if (rc == -1) return -1; /* avg_sent */ - rc = shapito_be_write_data_row_add(stream, offset, "0", 1); + data_len = snprintf(data, sizeof(data), "%" PRIu64, avg->recv_server); + rc = shapito_be_write_data_row_add(stream, offset, data, data_len); if (rc == -1) return -1; diff --git a/sources/frontend.c b/sources/frontend.c index d9409a5d..c5a1640c 100644 --- a/sources/frontend.c +++ b/sources/frontend.c @@ -266,7 +266,7 @@ od_frontend_copy_in(od_client_t *client) if (rc == -1) return OD_RS_ECLIENT_READ; - od_server_stat_recv(server, shapito_stream_used(stream)); + od_server_stat_recv_client(server, shapito_stream_used(stream)); type = *stream->start; od_debug_client(&instance->logger, &client->id, "copy", @@ -275,8 +275,6 @@ od_frontend_copy_in(od_client_t *client) if (rc == -1) return OD_RS_ESERVER_WRITE; - od_server_stat_sent(server, shapito_stream_used(stream)); - /* copy complete or fail */ if (type == 'c' || type == 'f') break; @@ -356,7 +354,7 @@ od_frontend_remote(od_client_t *client) /* update request and recv stat */ od_server_stat_request(server); - od_server_stat_recv(server, shapito_stream_used(stream)); + od_server_stat_recv_client(server, shapito_stream_used(stream)); rc = od_write(server->io, stream); if (rc == -1) @@ -389,6 +387,8 @@ od_frontend_remote(od_client_t *client) od_debug_server(&instance->logger, &server->id, NULL, "%c", type); + /* update server recv stats */ + od_server_stat_recv_server(server, shapito_stream_used(stream)); /* ErrorResponse */ if (type == 'E') { @@ -431,9 +431,6 @@ od_frontend_remote(od_client_t *client) if (rc == -1) return OD_RS_ECLIENT_WRITE; - /* update stats */ - od_server_stat_sent(server, shapito_stream_used(stream)); - /* switch to CopyIn mode */ rc = od_frontend_copy_in(client); if (rc != OD_RS_OK) @@ -456,8 +453,6 @@ od_frontend_remote(od_client_t *client) rc = od_write(client->io, stream); if (rc == -1) return OD_RS_ECLIENT_WRITE; - /* update stats */ - od_server_stat_sent(server, shapito_stream_used(stream)); shapito_stream_reset(stream); } } diff --git a/sources/periodic.c b/sources/periodic.c index a9c23f33..77987fa8 100644 --- a/sources/periodic.c +++ b/sources/periodic.c @@ -53,6 +53,8 @@ od_periodic_stats_server(od_server_t *server, void *arg) od_serverstat_t *stats = arg; stats->query_time += od_atomic_u64_of(&server->stats.query_time); stats->count_request += od_atomic_u64_of(&server->stats.count_request); + stats->recv_client += od_atomic_u64_of(&server->stats.recv_client); + stats->recv_server += od_atomic_u64_of(&server->stats.recv_server); return 0; } @@ -75,6 +77,7 @@ od_periodic_stats(od_router_t *router) /* gather statistics per route server pool */ od_serverstat_t stats; memset(&stats, 0, sizeof(stats)); + od_serverpool_foreach(&route->server_pool, OD_SACTIVE, od_periodic_stats_server, &stats); @@ -87,10 +90,13 @@ od_periodic_stats(od_router_t *router) int64_t reqs_diff; reqs_diff = stats.count_request - route->periodic_stats.count_request; + uint64_t recv_client = 0; + uint64_t recv_server = 0; uint64_t reqs = 0; uint64_t query_time = 0; if (reqs_diff >= 0) { + /* request count */ uint64_t reqs_prev = 0; reqs_prev = route->periodic_stats.count_request / instance->scheme.stats_interval; @@ -102,6 +108,31 @@ od_periodic_stats(od_router_t *router) reqs = (reqs_current - reqs_prev) / instance->scheme.stats_interval; + /* recv client */ + uint64_t recv_client_prev = 0; + recv_client_prev = route->periodic_stats.recv_client / + instance->scheme.stats_interval; + + uint64_t recv_client_current = 0; + recv_client_current = stats.recv_client / + instance->scheme.stats_interval; + + recv_client = (recv_client_current - recv_client_prev) / + instance->scheme.stats_interval; + + /* recv server */ + uint64_t recv_server_prev = 0; + recv_server_prev = route->periodic_stats.recv_server / + instance->scheme.stats_interval; + + uint64_t recv_server_current = 0; + recv_server_current = stats.recv_server / + instance->scheme.stats_interval; + + recv_server = (recv_server_current - recv_server_prev) / + instance->scheme.stats_interval; + + /* query time */ if (reqs_diff > 0) query_time = (stats.query_time - route->periodic_stats.query_time) / (reqs_current - reqs_prev); @@ -111,7 +142,9 @@ od_periodic_stats(od_router_t *router) route->periodic_stats = stats; route->periodic_stats_avg.count_request = reqs; - route->periodic_stats_avg.query_time = query_time; + route->periodic_stats_avg.recv_client = recv_client; + route->periodic_stats_avg.recv_server = recv_server; + route->periodic_stats_avg.query_time = query_time; if (instance->scheme.log_stats) { od_log(&instance->logger, @@ -119,7 +152,9 @@ od_periodic_stats(od_router_t *router) "pool_active %d, " "pool_idle %d " "rps %" PRIu64 " " - "query_time_us %" PRIu64, + "query_time_us %" PRIu64 " " + "recv_client_bytes %" PRIu64 " " + "recv_server_bytes %" PRIu64, route->id.database_len, route->id.database, route->id.user_len, @@ -130,7 +165,9 @@ od_periodic_stats(od_router_t *router) route->server_pool.count_active, route->server_pool.count_idle, reqs, - query_time); + query_time, + recv_client, + recv_server); } } } diff --git a/sources/route_pool.c b/sources/route_pool.c index 369a3728..bba18450 100644 --- a/sources/route_pool.c +++ b/sources/route_pool.c @@ -171,10 +171,14 @@ od_routepool_stats_mark(od_routepool_t *pool, continue; total->count_request += route->periodic_stats.count_request; - total->query_time += route->periodic_stats.query_time; + total->query_time += route->periodic_stats.query_time; + total->recv_client += route->periodic_stats.recv_client; + total->recv_server += route->periodic_stats.recv_server; - avg->count_request += route->periodic_stats_avg.count_request; - avg->query_time += route->periodic_stats_avg.query_time; + avg->count_request += route->periodic_stats_avg.count_request; + avg->query_time += route->periodic_stats_avg.query_time; + avg->recv_client += route->periodic_stats_avg.recv_client; + avg->recv_server += route->periodic_stats_avg.recv_server; route->stats_mark++; match++; @@ -216,6 +220,8 @@ od_routepool_stats(od_routepool_t *pool, assert(match > 0); avg.count_request /= match; avg.query_time /= match; + avg.recv_client /= match; + avg.recv_server /= match; int rc; rc = callback(route->id.database, route->id.database_len, &total, &avg, arg); if (rc == -1) { diff --git a/sources/server.h b/sources/server.h index 5d2f196f..e89abc41 100644 --- a/sources/server.h +++ b/sources/server.h @@ -20,15 +20,10 @@ typedef enum struct od_serverstat { - /* total request count */ od_atomic_u64_t count_request; - /* bytes sent to server */ - od_atomic_u64_t bytes_sent; - /* bytes received from clients */ - od_atomic_u64_t bytes_recv; - /* total query time */ + od_atomic_u64_t recv_server; + od_atomic_u64_t recv_client; od_atomic_u64_t query_time; - /* start time of last request */ uint64_t query_time_start; }; @@ -130,15 +125,15 @@ od_server_stat_reply(od_server_t *server) } static inline void -od_server_stat_sent(od_server_t *server, uint64_t bytes) +od_server_stat_recv_server(od_server_t *server, uint64_t bytes) { - od_atomic_u64_add(&server->stats.bytes_sent, bytes); + od_atomic_u64_add(&server->stats.recv_server, bytes); } static inline void -od_server_stat_recv(od_server_t *server, uint64_t bytes) +od_server_stat_recv_client(od_server_t *server, uint64_t bytes) { - od_atomic_u64_add(&server->stats.bytes_recv, bytes); + od_atomic_u64_add(&server->stats.recv_client, bytes); } #endif /* OD_SERVER_H */