diff --git a/include/neuron/adapter.h b/include/neuron/adapter.h index e93359c4..d52e536f 100644 --- a/include/neuron/adapter.h +++ b/include/neuron/adapter.h @@ -30,6 +30,8 @@ extern "C" { #include "tag.h" #include "type.h" +#define NEU_NODE_STAT_RTT_MAX 9999 + /** Kinds of node statistics counters. * * Some counters are maintained by the neuron core, while others should be @@ -41,6 +43,7 @@ typedef enum { NEU_NODE_STAT_BYTES_RECV, // number of bytes received NEU_NODE_STAT_MSGS_SENT, // number of messages sent NEU_NODE_STAT_MSGS_RECV, // number of messages received + NEU_NODE_STAT_AVG_RTT, // average round trip time (ms) // kinds of counters maintained by the driver core NEU_NODE_STAT_TAG_TOT_CNT, // number of tag read including errors @@ -56,6 +59,7 @@ static inline const char *neu_node_stat_string(neu_node_stat_e s) [NEU_NODE_STAT_BYTES_RECV] = "bytes_received", [NEU_NODE_STAT_MSGS_SENT] = "messages_sent", [NEU_NODE_STAT_MSGS_RECV] = "messages_received", + [NEU_NODE_STAT_AVG_RTT] = "average_rtt", [NEU_NODE_STAT_TAG_TOT_CNT] = "tag_total_count", [NEU_NODE_STAT_TAG_ERR_CNT] = "tag_error_count", [NEU_NODE_STAT_MAX] = NULL, diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index 6c8cb28b..743eb51e 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -88,6 +88,8 @@ neu_adapter_t *neu_adapter_create(neu_adapter_info_t *info) adapter->persister = neu_persister_create("persistence"); assert(adapter->persister != NULL); + adapter->stat.avg_rtt = NEU_NODE_STAT_RTT_MAX; + rv = nng_pair1_open(&adapter->sock); assert(rv == 0); nng_socket_set_int(adapter->sock, NNG_OPT_RECVBUF, 128); @@ -184,6 +186,18 @@ static void adapter_stat_acc(neu_adapter_t *adapter, neu_node_stat_e s, case NEU_NODE_STAT_MSGS_RECV: adapter->stat.msgs_recv += n; break; + case NEU_NODE_STAT_AVG_RTT: { + if (NEU_NODE_STAT_RTT_MAX <= n || + adapter->stat.avg_rtt == NEU_NODE_STAT_RTT_MAX) { + adapter->stat.avg_rtt = n; + break; + } + + // exponential moving average with alpha = 0.3 + const double a = 0.3; + adapter->stat.avg_rtt = adapter->stat.avg_rtt * (1 - a) + n * a; + break; + } // these are maintained by neuron core case NEU_NODE_STAT_TAG_TOT_CNT: diff --git a/src/adapter/adapter_internal.h b/src/adapter/adapter_internal.h index 831c500a..778cdfb4 100644 --- a/src/adapter/adapter_internal.h +++ b/src/adapter/adapter_internal.h @@ -60,6 +60,7 @@ struct neu_adapter { uint64_t bytes_recv; // number of bytes received over network uint64_t msgs_sent; // number of messages sent uint64_t msgs_recv; // number of messages received + uint64_t avg_rtt; // average round trip time in milliseconds uint64_t tag_tot_cnt; // number of tag read including errors uint64_t tag_err_cnt; // number of tag read errors };