From: Witold Kręcicki Date: Tue, 28 Jan 2020 11:39:41 +0000 (+0100) Subject: Make client resolver tasks pooled and CPU-bound X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ded06dc3c5d43329bbf8fa84e5f6085a284ef5c8;p=thirdparty%2Fbind9.git Make client resolver tasks pooled and CPU-bound --- diff --git a/lib/ns/client.c b/lib/ns/client.c index 3f60bcee6e2..e20347a7258 100644 --- a/lib/ns/client.c +++ b/lib/ns/client.c @@ -132,6 +132,8 @@ static void compute_cookie(ns_client_t *client, uint32_t when, isc_buffer_t *buf); static void get_clientmctx(ns_clientmgr_t *manager, isc_mem_t **mctxp); +static void +get_clienttask(ns_clientmgr_t *manager, isc_task_t **taskp); void ns_client_recursing(ns_client_t *client) { @@ -2214,7 +2216,6 @@ ns__client_tcpconn(isc_nmhandle_t *handle, isc_result_t result, void *arg) { static void get_clientmctx(ns_clientmgr_t *manager, isc_mem_t **mctxp) { isc_mem_t *clientmctx; - unsigned int nextmctx; MTRACE("clientmctx"); int tid = isc_nm_tid(); @@ -2222,12 +2223,26 @@ get_clientmctx(ns_clientmgr_t *manager, isc_mem_t **mctxp) { tid = isc_random_uniform(manager->ncpus); } int rand = isc_random_uniform(CLIENT_NMCTXS_PERCPU); - nextmctx = (rand * manager->ncpus) + tid; + int nextmctx = (rand * manager->ncpus) + tid; clientmctx = manager->mctxpool[nextmctx]; isc_mem_attach(clientmctx, mctxp); } +static void +get_clienttask(ns_clientmgr_t *manager, isc_task_t **taskp) { + MTRACE("clienttask"); + + int tid = isc_nm_tid(); + if (tid < 0) { + tid = isc_random_uniform(manager->ncpus); + } + + int rand = isc_random_uniform(CLIENT_NMCTXS_PERCPU); + int nexttask = (rand * manager->ncpus) + tid; + isc_task_attach(manager->taskpool[nexttask], taskp); +} + isc_result_t ns__client_setup(ns_client_t *client, ns_clientmgr_t *mgr, bool new) { isc_result_t result; @@ -2251,10 +2266,8 @@ ns__client_setup(ns_client_t *client, ns_clientmgr_t *mgr, bool new) { get_clientmctx(mgr, &client->mctx); clientmgr_attach(mgr, &client->manager); ns_server_attach(mgr->sctx, &client->sctx); - result = isc_task_create(mgr->taskmgr, 20, &client->task); - if (result != ISC_R_SUCCESS) { - goto cleanup; - } + get_clienttask(mgr, &client->task); + result = dns_message_create(client->mctx, DNS_MESSAGE_INTENTPARSE, &client->message); @@ -2404,13 +2417,14 @@ clientmgr_destroy(ns_clientmgr_t *manager) { if (manager->excl != NULL) isc_task_detach(&manager->excl); - for (i = 0; i < CLIENT_NTASKS; i++) { + for (i = 0; i < manager->ncpus * CLIENT_NTASKS_PERCPU; i++) { if (manager->taskpool[i] != NULL) { isc_task_detach(&manager->taskpool[i]); } } isc_mem_put(manager->mctx, manager->taskpool, - CLIENT_NTASKS * sizeof(isc_task_t *)); + manager->ncpus * CLIENT_NTASKS_PERCPU * + sizeof(isc_task_t *)); ns_server_detach(&manager->sctx); isc_mem_put(manager->mctx, manager, sizeof(*manager)); @@ -2441,15 +2455,19 @@ ns_clientmgr_create(isc_mem_t *mctx, ns_server_t *sctx, isc_taskmgr_t *taskmgr, manager->mctx = mctx; manager->taskmgr = taskmgr; manager->timermgr = timermgr; + manager->ncpus = ncpus; ns_interface_attach(interface, &manager->interface); manager->exiting = false; - manager->taskpool = - isc_mem_get(mctx, CLIENT_NTASKS*sizeof(isc_task_t *)); - for (i = 0; i < CLIENT_NTASKS; i++) { + int ntasks = CLIENT_NTASKS_PERCPU * manager->ncpus; + manager->taskpool = isc_mem_get(mctx, ntasks * sizeof(isc_task_t *)); + for (i = 0; i < ntasks; i++) { manager->taskpool[i] = NULL; - isc_task_create(manager->taskmgr, 20, &manager->taskpool[i]); + result = isc_task_create_bound(manager->taskmgr, 20, + &manager->taskpool[i], + i % CLIENT_NTASKS_PERCPU); + RUNTIME_CHECK(result == ISC_R_SUCCESS); } isc_refcount_init(&manager->references, 1); manager->sctx = NULL; @@ -2457,7 +2475,6 @@ ns_clientmgr_create(isc_mem_t *mctx, ns_server_t *sctx, isc_taskmgr_t *taskmgr, ISC_LIST_INIT(manager->recursing); - manager->ncpus = ncpus; npools = CLIENT_NMCTXS_PERCPU * manager->ncpus; manager->mctxpool = isc_mem_get(manager->mctx, npools * sizeof(isc_mem_t*)); diff --git a/lib/ns/include/ns/client.h b/lib/ns/include/ns/client.h index ce58ed3d4db..5e4622a0927 100644 --- a/lib/ns/include/ns/client.h +++ b/lib/ns/include/ns/client.h @@ -95,7 +95,7 @@ * server. */ -#define CLIENT_NTASKS 100 +#define CLIENT_NTASKS_PERCPU 32 /*%< * Number of tasks to be used by clients - those are used only when recursing */