hsa: echo client connects as rpc 94/35794/3
authorFlorin Coras <fcoras@cisco.com>
Sat, 26 Mar 2022 01:53:09 +0000 (18:53 -0700)
committerFlorin Coras <fcoras@cisco.com>
Sat, 26 Mar 2022 02:11:46 +0000 (19:11 -0700)
Do connects in an session layer rpc instead of doing cli process sleeps.
Performance with 4 workers goes from ~120k/180k first run/warmed up to
~135k/240k

Type: improvement

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: Id184913e9898f8db099e29a605f3a9b1fc67be63

src/plugins/hs_apps/echo_client.c
src/plugins/hs_apps/echo_client.h

index 0329751..d2ae252 100644 (file)
@@ -334,6 +334,7 @@ ec_reset_runtime_config (echo_client_main_t *ecm)
   ecm->no_copy = 0;
   ecm->run_test = ECHO_CLIENTS_STARTING;
   ecm->ready_connections = 0;
+  ecm->connect_conn_index = 0;
   ecm->rx_total = 0;
   ecm->tx_total = 0;
   ecm->barrier_acq_needed = 0;
@@ -816,24 +817,33 @@ ec_transport_needs_crypto (transport_proto_t proto)
         proto == TRANSPORT_PROTO_QUIC;
 }
 
-clib_error_t *
-echo_clients_connect (vlib_main_t *vm)
+int
+echo_clients_connect_rpc (void *args)
 {
   echo_client_main_t *ecm = &echo_client_main;
   vnet_connect_args_t _a = {}, *a = &_a;
-  int ci = 0, rv, needs_crypto;
-  clib_error_t *error = 0;
-  u32 n_clients;
+  vlib_main_t *vm = vlib_get_main ();
+  int rv, needs_crypto;
+  u32 n_clients, ci;
 
   n_clients = ecm->n_clients;
   needs_crypto = ec_transport_needs_crypto (ecm->transport_proto);
   clib_memcpy (&a->sep_ext, &ecm->connect_sep, sizeof (ecm->connect_sep));
   a->app_index = ecm->app_index;
 
+  ci = ecm->connect_conn_index;
+
   vlib_worker_thread_barrier_sync (vm);
 
   while (ci < n_clients)
     {
+      /* Crude pacing for call setups  */
+      if (ci - ecm->ready_connections > 128)
+       {
+         ecm->connect_conn_index = ci;
+         break;
+       }
+
       a->api_context = ci;
       if (needs_crypto)
        {
@@ -849,35 +859,26 @@ echo_clients_connect (vlib_main_t *vm)
 
       if (rv)
        {
-         error = clib_error_return (0, "connect returned: %d", rv);
+         clib_warning ("connect returned: %U", format_session_error, rv);
+         signal_evt_to_cli (2);
          break;
        }
 
       ci += 1;
-
-      /* Crude pacing for call setups  */
-      if ((ci % 16) == 0)
-       {
-         vlib_worker_thread_barrier_release (vm);
-
-         ASSERT (ci >= ecm->ready_connections);
-         if (ci - ecm->ready_connections > 128)
-           {
-             while (ci - ecm->ready_connections > 128)
-               vlib_process_suspend (vm, 100e-6);
-           }
-         else
-           {
-             vlib_process_suspend (vm, 50e-6);
-           }
-
-         vlib_worker_thread_barrier_sync (vm);
-       }
     }
 
   vlib_worker_thread_barrier_release (vm);
 
-  return error;
+  if (ci < ecm->expected_connections)
+    echo_clients_program_connects ();
+
+  return 0;
+}
+
+void
+echo_clients_program_connects (void)
+{
+  session_send_rpc_evt_to_thread_force (0, echo_clients_connect_rpc, 0);
 }
 
 #define ec_cli(_fmt, _args...)                                                \
@@ -1005,10 +1006,7 @@ parse_config:
    */
 
   ecm->syn_start_time = vlib_time_now (vm);
-  if ((error = echo_clients_connect (vm)))
-    {
-      goto cleanup;
-    }
+  echo_clients_program_connects ();
 
   /*
    * Park until the sessions come up, or syn_timeout seconds pass
@@ -1032,6 +1030,9 @@ parse_config:
                ecm->n_clients, delta, ((f64) ecm->n_clients) / delta);
       break;
 
+    case 2:
+      error = clib_error_return (0, "failed: connect returned");
+      goto cleanup;
     default:
       ec_cli ("unexpected event(1): %d", event_type);
       error = clib_error_return (0, "failed: unexpected event(1): %d",
index 9b8dbcb..a0e844d 100644 (file)
@@ -64,6 +64,8 @@ typedef struct
   u32 prev_conns;
   u32 repeats;
 
+  u32 connect_conn_index; /**< Conencts attempted progress */
+
   /*
    * Application setup parameters
    */
@@ -122,10 +124,12 @@ enum
   ECHO_CLIENTS_RUNNING,
   ECHO_CLIENTS_EXITING
 } echo_clients_test_state_e;
-extern echo_client_main_t echo_client_main;
 
+extern echo_client_main_t echo_client_main;
 vlib_node_registration_t echo_clients_node;
 
+void echo_clients_program_connects (void);
+
 #endif /* __included_echo_client_h__ */
 
 /*