diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-10-20 16:30:14 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-10-20 16:30:14 +0100 |
commit | b146b1cc7c4aae6445695026ff282d3f13076272 (patch) | |
tree | 572ef9f97df39f2a48099e9f8d38b0e19debb760 | |
parent | e4336fe612d4e95cd6fb76b9ced6a9599ebe1990 (diff) | |
download | rspamd-b146b1cc7c4aae6445695026ff282d3f13076272.tar.gz rspamd-b146b1cc7c4aae6445695026ff282d3f13076272.zip |
Rework benchmark to processes from threads
-rw-r--r-- | utils/rspamd_http_bench.c | 163 | ||||
-rw-r--r-- | utils/rspamd_http_server.c | 2 |
2 files changed, 109 insertions, 56 deletions
diff --git a/utils/rspamd_http_bench.c b/utils/rspamd_http_bench.c index f30c2bfe6..06f347013 100644 --- a/utils/rspamd_http_bench.c +++ b/utils/rspamd_http_bench.c @@ -42,19 +42,13 @@ static gchar *server_key = NULL; static guint cache_size = 10; static guint nworkers = 1; static gboolean openssl_mode = FALSE; -static struct rspamd_keypair_cache *c; -static gpointer client_key; -static gpointer peer_key; -static struct timeval io_tv = { - .tv_sec = 20, - .tv_usec = 0 -}; -double diff, total_diff = 0.0, *latency, mean, std; +double *latency, mean, std; +static guint32 *pdiff; static guint file_size = 500; static guint pconns = 100; static guint ntests = 3000; static rspamd_inet_addr_t *addr; -static rspamd_mutex_t *mtx_event; +static guint32 workers_left = 0; static GOptionEntry entries[] = { {"port", 'p', 0, G_OPTION_ARG_INT, &port, @@ -119,7 +113,8 @@ rspamd_client_finish (struct rspamd_http_connection *conn, } static void -rspamd_http_client_func (struct event_base *ev_base, double *latency) +rspamd_http_client_func (struct event_base *ev_base, double *latency, + gpointer peer_key, gpointer client_key, struct rspamd_keypair_cache *c) { struct rspamd_http_message *msg; struct rspamd_http_connection *conn; @@ -149,29 +144,43 @@ rspamd_http_client_func (struct event_base *ev_base, double *latency) cb->ts = rspamd_get_ticks (); cb->lat = latency; rspamd_http_connection_write_message (conn, msg, NULL, NULL, cb, - fd, &io_tv, ev_base); + fd, NULL, ev_base); } -static void * -rspamd_bench_thread_func (gpointer d) +static void +rspamd_worker_func (gpointer d) { guint i, j; struct event_base *ev_base; gint *nt = d; + struct rspamd_keypair_cache *c = NULL; + gpointer client_key = NULL; + gpointer peer_key = NULL; + gdouble ts1, ts2; - rspamd_mutex_lock (mtx_event); + if (server_key) { + peer_key = rspamd_http_connection_make_peer_key (server_key); + g_assert (peer_key != NULL); + client_key = rspamd_http_connection_gen_key (); + + if (cache_size > 0) { + c = rspamd_keypair_cache_new (cache_size); + } + } ev_base = event_init (); - rspamd_mutex_unlock (mtx_event); for (i = 0; i < ntests; i++) { for (j = 0; j < pconns; j++) { rspamd_http_client_func (ev_base, &latency[(*nt) * pconns * ntests - + i * pconns + j]); + + i * pconns + j], peer_key, client_key, c); } + + ts1 = rspamd_get_ticks (); event_base_loop (ev_base, 0); - } + ts2 = rspamd_get_ticks (); - return NULL; + g_atomic_int_add (pdiff, (guint32)((ts2 - ts1) * 1000000.)); + } } static int @@ -206,14 +215,72 @@ rspamd_http_calculate_mean (double *lats, double *std) return mean; } +static void +rspamd_http_start_workers (pid_t *sfd) +{ + guint i; + for (i = 0; i < nworkers; i++) { + sfd[i] = fork (); + g_assert (sfd[i] != -1); + + if (sfd[i] == 0) { + gint *nt = g_malloc (sizeof (gint)); + + *nt = i; + gperf_profiler_init (NULL, "http-bench"); + rspamd_worker_func (nt); + gperf_profiler_stop (); + exit (EXIT_SUCCESS); + } + + workers_left ++; + } +} + +static void +rspamd_http_stop_workers (pid_t *sfd) +{ + guint i; + gint res; + + for (i = 0; i < nworkers; i++) { + kill (sfd[i], SIGTERM); + wait (&res); + } +} + +static void +rspamd_http_bench_term (int fd, short what, void *arg) +{ + pid_t *sfd = arg; + + rspamd_http_stop_workers (sfd); + event_loopexit (NULL); +} + +static void +rspamd_http_bench_cld (int fd, short what, void *arg) +{ + gint res; + + wait (&res); + + if (--workers_left == 0) { + event_loopexit (NULL); + } +} + + int main (int argc, char **argv) { GOptionContext *context; GError *error = NULL; - GThread **workers; - guint i; - gdouble ts1, ts2; + pid_t *sfd; + struct event_base *ev_base; + rspamd_mempool_t *pool = rspamd_mempool_new (8192, "http-bench"); + struct event term_ev, int_ev, cld_ev; + gdouble total_diff; rspamd_init_libs (); @@ -236,48 +303,34 @@ main (int argc, char **argv) g_assert (rspamd_cryptobox_openssl_mode (TRUE)); } - if (server_key) { - peer_key = rspamd_http_connection_make_peer_key (server_key); - g_assert (peer_key != NULL); - client_key = rspamd_http_connection_gen_key (); - - if (cache_size > 0) { - c = rspamd_keypair_cache_new (cache_size); - } - } - - mtx_event = rspamd_mutex_new (); rspamd_parse_inet_address (&addr, host, 0); g_assert (addr != NULL); rspamd_inet_address_set_port (addr, port); - latency = g_malloc0 (nworkers * pconns * ntests * sizeof (gdouble)); - workers = g_malloc (sizeof (*workers) * nworkers); - - gperf_profiler_init (NULL, "http-bench"); - - rspamd_mutex_lock (mtx_event); - for (i = 0; i < nworkers; i ++) { - gint *nt = g_malloc (sizeof (gint)); - *nt = i; - workers[i] = rspamd_create_thread ("bench-worker", - rspamd_bench_thread_func, - nt, - NULL); - } - rspamd_mutex_unlock (mtx_event); + latency = rspamd_mempool_alloc_shared (pool, + nworkers * pconns * ntests * sizeof (gdouble)); + sfd = g_malloc (sizeof (*sfd) * nworkers); + pdiff = rspamd_mempool_alloc_shared (pool, sizeof (guint32)); + *pdiff = 0; - ts1 = rspamd_get_ticks (); + rspamd_http_start_workers (sfd); - for (i = 0; i < nworkers; i++) { - g_thread_join (workers[i]); - } + ev_base = event_init (); - ts2 = rspamd_get_ticks (); + event_set (&term_ev, SIGTERM, EV_SIGNAL, rspamd_http_bench_term, sfd); + event_base_set (ev_base, &term_ev); + event_add (&term_ev, NULL); + event_set (&int_ev, SIGINT, EV_SIGNAL, rspamd_http_bench_term, sfd); + event_base_set (ev_base, &int_ev); + event_add (&int_ev, NULL); + event_set (&cld_ev, SIGCHLD, EV_SIGNAL|EV_PERSIST, + rspamd_http_bench_cld, NULL); + event_base_set (ev_base, &cld_ev); + event_add (&cld_ev, NULL); - gperf_profiler_stop (); + event_base_loop (ev_base, 0); - total_diff = ts2 - ts1; + total_diff = *pdiff / nworkers / 1000000.0; rspamd_printf ("Made %d connections of size %d in %.6fs, %.6f cps, %.6f MB/sec\n", nworkers * ntests * pconns, @@ -289,5 +342,7 @@ main (int argc, char **argv) rspamd_printf ("Latency: %.6f ms mean, %.6f dev\n", mean * 1000.0, std * 1000.0); + rspamd_mempool_delete (pool); + return 0; } diff --git a/utils/rspamd_http_server.c b/utils/rspamd_http_server.c index 3aefe6b9f..12d2a49c2 100644 --- a/utils/rspamd_http_server.c +++ b/utils/rspamd_http_server.c @@ -47,8 +47,6 @@ static struct timeval io_tv = { .tv_usec = 0 }; - - static GOptionEntry entries[] = { {"port", 'p', 0, G_OPTION_ARG_INT, &port, "Port number (default: 43000)", NULL}, |