diff options
-rw-r--r-- | src/plugins/hs_apps/vcl/vcl_test.h | 60 | ||||
-rw-r--r-- | src/plugins/hs_apps/vcl/vcl_test_client.c | 2 | ||||
-rw-r--r-- | src/plugins/hs_apps/vcl/vcl_test_server.c | 44 |
3 files changed, 71 insertions, 35 deletions
diff --git a/src/plugins/hs_apps/vcl/vcl_test.h b/src/plugins/hs_apps/vcl/vcl_test.h index f1e6bc4eb6c..c22eccc629b 100644 --- a/src/plugins/hs_apps/vcl/vcl_test.h +++ b/src/plugins/hs_apps/vcl/vcl_test.h @@ -65,7 +65,7 @@ #define VCL_TEST_CFG_TXBUF_SIZE_DEF 8192 #define VCL_TEST_CFG_RXBUF_SIZE_DEF (64*VCL_TEST_CFG_TXBUF_SIZE_DEF) #define VCL_TEST_CFG_BUF_SIZE_MIN 128 -#define VCL_TEST_CFG_MAX_TEST_SESS 32 +#define VCL_TEST_CFG_MAX_TEST_SESS 512 #define VCL_TEST_CFG_MAX_EPOLL_EVENTS 16 #define VCL_TEST_CTRL_LISTENER (~0 - 1) @@ -415,16 +415,30 @@ vcl_test_time_diff (struct timespec *old, struct timespec *new) } static inline void -vcl_test_stats_dump_inc (vcl_test_stats_t *old, vcl_test_stats_t *new) +vcl_test_stats_dump_inc (vcl_test_session_t *ts, int is_rx) { + vcl_test_stats_t *old, *new; double duration, rate; uint64_t total_bytes; + char *dir_str; + old = &ts->old_stats; + new = &ts->stats; duration = vcl_test_time_diff (&old->stop, &new->stop); - total_bytes = new->tx_bytes - old->tx_bytes; + if (is_rx) + { + total_bytes = new->rx_bytes - old->rx_bytes; + dir_str = "Received"; + } + else + { + total_bytes = new->tx_bytes - old->tx_bytes; + dir_str = "Sent"; + } + rate = (double) total_bytes * 8 / duration / 1e9; - printf ("Sent %lu Mbytes in %.2lf seconds %.2lf Gbps\n", + printf ("%d: %s %lu Mbytes in %.2lf seconds %.2lf Gbps\n", ts->fd, dir_str, (uint64_t) (total_bytes / 1e6), duration, rate); } @@ -447,33 +461,32 @@ static inline int vcl_test_read (vcl_test_session_t *ts, void *buf, uint32_t nbytes) { vcl_test_stats_t *stats = &ts->stats; - int rx_bytes; + int rv, rx_bytes = 0; do { stats->rx_xacts++; - rx_bytes = vppcom_session_read (ts->fd, buf, nbytes); - - if (rx_bytes < 0) + rv = vppcom_session_read (ts->fd, buf, nbytes); + if (rv <= 0) { - errno = -rx_bytes; - rx_bytes = -1; + errno = -rv; + if (errno == EAGAIN || errno == EWOULDBLOCK) + { + stats->rx_eagain++; + continue; + } + + vterr ("vppcom_session_read()", -errno); + break; } - if ((rx_bytes == 0) || - ((rx_bytes < 0) && ((errno == EAGAIN) || (errno == EWOULDBLOCK)))) - stats->rx_eagain++; - else if (rx_bytes < nbytes) + + rx_bytes = rv; + if (rv < nbytes) stats->rx_incomp++; } - while ((rx_bytes == 0) || - ((rx_bytes < 0) && ((errno == EAGAIN) || (errno == EWOULDBLOCK)))); + while (!rx_bytes); - if (rx_bytes < 0) - { - vterr ("vppcom_session_read()", -errno); - } - else - stats->rx_bytes += rx_bytes; + stats->rx_bytes += rx_bytes; return (rx_bytes); } @@ -533,7 +546,8 @@ vcl_test_write (vcl_test_session_t *ts, void *buf, uint32_t nbytes) nbytes_left = nbytes_left - rv; buf += rv; - stats->tx_incomp++; + if (rv < nbytes_left) + stats->tx_incomp++; } while (tx_bytes != nbytes); diff --git a/src/plugins/hs_apps/vcl/vcl_test_client.c b/src/plugins/hs_apps/vcl/vcl_test_client.c index d16d62ce63c..4a9fb46e5b8 100644 --- a/src/plugins/hs_apps/vcl/vcl_test_client.c +++ b/src/plugins/hs_apps/vcl/vcl_test_client.c @@ -303,7 +303,7 @@ vtc_inc_stats_check (vcl_test_session_t *ts) clock_gettime (CLOCK_REALTIME, &ts->stats.stop); if (vcl_test_time_diff (&ts->old_stats.stop, &ts->stats.stop) > 1) { - vcl_test_stats_dump_inc (&ts->old_stats, &ts->stats); + vcl_test_stats_dump_inc (ts, 0 /* is_rx */); ts->old_stats = ts->stats; } } diff --git a/src/plugins/hs_apps/vcl/vcl_test_server.c b/src/plugins/hs_apps/vcl/vcl_test_server.c index a36801b0691..ca21a4bfe08 100644 --- a/src/plugins/hs_apps/vcl/vcl_test_server.c +++ b/src/plugins/hs_apps/vcl/vcl_test_server.c @@ -58,6 +58,7 @@ typedef struct volatile int worker_fails; volatile int active_workers; u8 use_ds; + u8 incremental_stats; } vcl_test_server_main_t; vcl_test_main_t vcl_test_main; @@ -101,10 +102,10 @@ again: if (!wrk->conn_pool[i].is_alloc) { conn = &wrk->conn_pool[i]; + memset (conn, 0, sizeof (*conn)); conn->endpt.ip = wrk->conn_pool[i].ip; conn->is_alloc = 1; conn->session_index = i; - memset (&conn->stats, 0, sizeof (vcl_test_stats_t)); vcl_test_cfg_init (&conn->cfg); return (&wrk->conn_pool[i]); } @@ -324,6 +325,7 @@ vts_accept_client (vcl_test_server_worker_t *wrk, int listen_fd) if (vsm->ctrl) conn->cfg = vsm->ctrl->cfg; vcl_test_session_buf_alloc (conn); + clock_gettime (CLOCK_REALTIME, &conn->old_stats.stop); tp = vcl_test_main.protos[vsm->server_cfg.proto]; if (tp->accept (listen_fd, conn)) @@ -348,15 +350,15 @@ vts_accept_client (vcl_test_server_worker_t *wrk, int listen_fd) static void print_usage_and_exit (void) { - fprintf (stderr, - "vcl_test_server [OPTIONS] <port>\n" - " OPTIONS\n" - " -h Print this message and exit.\n" - " -6 Use IPv6\n" - " -w <num> Number of workers\n" - " -p <PROTO> Use <PROTO> transport layer\n" - " -D Use UDP transport layer\n" - " -L Use TLS transport layer\n"); + fprintf (stderr, "vcl_test_server [OPTIONS] <port>\n" + " OPTIONS\n" + " -h Print this message and exit.\n" + " -6 Use IPv6\n" + " -w <num> Number of workers\n" + " -p <PROTO> Use <PROTO> transport layer\n" + " -D Use UDP transport layer\n" + " -L Use TLS transport layer\n" + " -S Incremental stats\n"); exit (1); } @@ -406,7 +408,7 @@ vcl_test_server_process_opts (vcl_test_server_main_t * vsm, int argc, vsm->server_cfg.proto = VPPCOM_PROTO_TCP; opterr = 0; - while ((c = getopt (argc, argv, "6DLsw:hp:")) != -1) + while ((c = getopt (argc, argv, "6DLsw:hp:S")) != -1) switch (c) { case '6': @@ -436,6 +438,9 @@ vcl_test_server_process_opts (vcl_test_server_main_t * vsm, int argc, case 's': vsm->use_ds = 1; break; + case 'S': + vsm->incremental_stats = 1; + break; case '?': switch (optopt) { @@ -578,6 +583,21 @@ vts_conn_read (vcl_test_session_t *conn) return conn->read (conn, conn->rxbuf, conn->rxbuf_size); } +static void +vts_inc_stats_check (vcl_test_session_t *ts) +{ + /* Avoid checking time too often because of syscall cost */ + if (ts->stats.rx_bytes - ts->old_stats.rx_bytes < 1 << 20) + return; + + clock_gettime (CLOCK_REALTIME, &ts->stats.stop); + if (vcl_test_time_diff (&ts->old_stats.stop, &ts->stats.stop) > 1) + { + vcl_test_stats_dump_inc (ts, 1 /* is_rx */); + ts->old_stats = ts->stats; + } +} + static void * vts_worker_loop (void *arg) { @@ -700,6 +720,8 @@ vts_worker_loop (void *arg) if (vppcom_session_attr (conn->fd, VPPCOM_ATTR_GET_NREAD, 0, 0) > 0) goto read_again; + if (vsm->incremental_stats) + vts_inc_stats_check (conn); continue; } else |