]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Make client resolver tasks pooled and CPU-bound
authorWitold Kręcicki <wpk@isc.org>
Tue, 28 Jan 2020 11:39:41 +0000 (12:39 +0100)
committerWitold Kręcicki <wpk@isc.org>
Fri, 7 Feb 2020 09:26:41 +0000 (10:26 +0100)
lib/ns/client.c
lib/ns/include/ns/client.h

index 3f60bcee6e2a88c5cd4fac96fcdb0be8b8b5714d..e20347a7258d1587b380fc66f1249e366deffd24 100644 (file)
@@ -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*));
index ce58ed3d4db6c6335e254ade28e2a4d4f185348c..5e4622a0927834c33710ff81ff036bd0164dd96f 100644 (file)
@@ -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
  */