]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add memory pools for isc_nmsocket_t structures
authorOndřej Surý <ondrej@isc.org>
Tue, 12 Sep 2023 17:13:45 +0000 (19:13 +0200)
committerOndřej Surý <ondrej@isc.org>
Thu, 8 Feb 2024 14:13:47 +0000 (15:13 +0100)
To reduce memory pressure, we can add light per-loop (netmgr worker)
memory pools for isc_nmsocket_t structures.  This will help in
situations where there's a lot of churn creating and destroying the
nmsockets.

lib/isc/netmgr/http.c
lib/isc/netmgr/netmgr-int.h
lib/isc/netmgr/netmgr.c
lib/isc/netmgr/proxystream.c
lib/isc/netmgr/proxyudp.c
lib/isc/netmgr/streamdns.c
lib/isc/netmgr/tcp.c
lib/isc/netmgr/tlsstream.c
lib/isc/netmgr/udp.c

index fe083667b87cfe2ad7a9f097d9d669696c145be8..d33d778df61c7ab13d42a003c0b1ea9426555f69 100644 (file)
@@ -1482,7 +1482,7 @@ isc_nm_httpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
                local = &local_interface;
        }
 
-       sock = isc_mem_get(worker->mctx, sizeof(*sock));
+       sock = isc_mempool_get(worker->nmsocket_pool);
        isc__nmsocket_init(sock, worker, isc_nm_httpsocket, local, NULL);
        http_initsocket(sock);
 
@@ -1694,7 +1694,7 @@ server_on_begin_headers_callback(nghttp2_session *ngsession,
        INSIST(session->handle->sock->tid == isc_tid());
 
        worker = session->handle->sock->worker;
-       socket = isc_mem_get(worker->mctx, sizeof(isc_nmsocket_t));
+       socket = isc_mempool_get(worker->nmsocket_pool);
        local = isc_nmhandle_localaddr(session->handle);
        isc__nmsocket_init(socket, worker, isc_nm_httpsocket, &local, NULL);
        http_initsocket(socket);
@@ -2515,7 +2515,7 @@ isc_nm_listenhttp(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
        REQUIRE(isc_tid() == 0);
 
        worker = &mgr->workers[isc_tid()];
-       sock = isc_mem_get(worker->mctx, sizeof(*sock));
+       sock = isc_mempool_get(worker->nmsocket_pool);
        isc__nmsocket_init(sock, worker, isc_nm_httplistener, iface, NULL);
        http_initsocket(sock);
        atomic_init(&sock->h2->max_concurrent_streams,
index 1c5da3cbe3b63c17ea39b9f828a63faabc9a6965..13485dfb58d0cb3dae5edc9c50f6fb4f3579ed28 100644 (file)
@@ -109,6 +109,7 @@ STATIC_ASSERT(ISC_NETMGR_TCP_RECVBUF_SIZE <= ISC_NETMGR_RECVBUF_SIZE,
  * How many isc_nmhandles and isc_nm_uvreqs will we be
  * caching for reuse in a socket.
  */
+#define ISC_NM_NMSOCKET_MAX  64
 #define ISC_NM_NMHANDLES_MAX 64
 #define ISC_NM_UVREQS_MAX    64
 
@@ -210,6 +211,7 @@ typedef struct isc__networker {
 
        ISC_LIST(isc_nmsocket_t) active_sockets;
 
+       isc_mempool_t *nmsocket_pool;
        isc_mempool_t *uvreq_pool;
 } isc__networker_t;
 
index 84b7604982cf13e1ed912a0365c9d3f52d7b5c0e..f410c2e7a11c3e509005a892a8b53449b1214996 100644 (file)
@@ -222,6 +222,11 @@ isc_netmgr_create(isc_mem_t *mctx, isc_loopmgr_t *loopmgr, isc_nm_t **netmgrp) {
 
                isc_mem_attach(loop->mctx, &worker->mctx);
 
+               isc_mempool_create(worker->mctx, sizeof(isc_nmsocket_t),
+                                  &worker->nmsocket_pool);
+               isc_mempool_setfreemax(worker->nmsocket_pool,
+                                      ISC_NM_NMSOCKET_MAX);
+
                isc_mempool_create(worker->mctx, sizeof(isc__nm_uvreq_t),
                                   &worker->uvreq_pool);
                isc_mempool_setfreemax(worker->uvreq_pool, ISC_NM_UVREQS_MAX);
@@ -492,7 +497,7 @@ nmsocket_cleanup(void *arg) {
 
                ISC_LIST_UNLINK(worker->active_sockets, sock, active_link);
 
-               isc_mem_put(worker->mctx, sock, sizeof(*sock));
+               isc_mempool_put(worker->nmsocket_pool, sock);
        }
 
        isc__networker_detach(&worker);
@@ -2571,6 +2576,7 @@ isc__networker_destroy(isc__networker_t *worker) {
        isc_loop_detach(&worker->loop);
 
        isc_mempool_destroy(&worker->uvreq_pool);
+       isc_mempool_destroy(&worker->nmsocket_pool);
 
        isc_mem_putanddetach(&worker->mctx, worker->recvbuf,
                             ISC_NETMGR_RECVBUF_SIZE);
index 893f1ccf0db6840b0b828373d31d96b0551217ec..c24ed26278ace37bcc4223382cfd989edccb98b0 100644 (file)
@@ -236,7 +236,7 @@ proxystream_sock_new(isc__networker_t *worker, const isc_nmsocket_type_t type,
        INSIST(type == isc_nm_proxystreamsocket ||
               type == isc_nm_proxystreamlistener);
 
-       sock = isc_mem_get(worker->mctx, sizeof(*sock));
+       sock = isc_mempool_get(worker->nmsocket_pool);
        isc__nmsocket_init(sock, worker, type, addr, NULL);
        sock->result = ISC_R_UNSET;
        if (type == isc_nm_proxystreamsocket) {
index 99acc579bc705477f2bfa16c81b155de02313449..49a372563d8c8fb15fc91cf7a57e130c8df65817 100644 (file)
@@ -209,7 +209,7 @@ proxyudp_sock_new(isc__networker_t *worker, const isc_nmsocket_type_t type,
        INSIST(type == isc_nm_proxyudpsocket ||
               type == isc_nm_proxyudplistener);
 
-       sock = isc_mem_get(worker->mctx, sizeof(*sock));
+       sock = isc_mempool_get(worker->nmsocket_pool);
        isc__nmsocket_init(sock, worker, type, addr, NULL);
        sock->result = ISC_R_UNSET;
        if (type == isc_nm_proxyudpsocket) {
index 9460121e0298c35d54396ac673bed98077772424..cab9c22f62cbe4b757d92e416c4f8cf2b8db57e4 100644 (file)
@@ -250,7 +250,7 @@ streamdns_sock_new(isc__networker_t *worker, const isc_nmsocket_type_t type,
        INSIST(type == isc_nm_streamdnssocket ||
               type == isc_nm_streamdnslistener);
 
-       sock = isc_mem_get(worker->mctx, sizeof(*sock));
+       sock = isc_mempool_get(worker->nmsocket_pool);
        isc__nmsocket_init(sock, worker, type, addr, NULL);
        sock->result = ISC_R_UNSET;
        if (type == isc_nm_streamdnssocket) {
index b6545a912d1cc7e06a3269de291a58d16d040abc..63612bf1309cb2bae5c17d385ded27d74831e545 100644 (file)
@@ -245,7 +245,7 @@ isc_nm_tcpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
                return;
        }
 
-       sock = isc_mem_get(worker->mctx, sizeof(*sock));
+       sock = isc_mempool_get(worker->nmsocket_pool);
        isc__nmsocket_init(sock, worker, isc_nm_tcpsocket, local, NULL);
 
        sock->connect_timeout = timeout;
@@ -459,7 +459,7 @@ isc_nm_listentcp(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
        REQUIRE(workers <= mgr->nloops);
 
        worker = &mgr->workers[0];
-       sock = isc_mem_get(worker->mctx, sizeof(*sock));
+       sock = isc_mempool_get(worker->nmsocket_pool);
        isc__nmsocket_init(sock, worker, isc_nm_tcplistener, iface, NULL);
 
        sock->nchildren = (workers == ISC_NM_LISTEN_ALL) ? (uint32_t)mgr->nloops
@@ -539,8 +539,7 @@ tcp_connection_cb(uv_stream_t *server, int status) {
        }
 
        /* Prepare the child socket */
-       isc_nmsocket_t *csock = isc_mem_get(ssock->worker->mctx,
-                                           sizeof(isc_nmsocket_t));
+       isc_nmsocket_t *csock = isc_mempool_get(ssock->worker->nmsocket_pool);
        isc__nmsocket_init(csock, ssock->worker, isc_nm_tcpsocket,
                           &ssock->iface, NULL);
        isc__nmsocket_attach(ssock, &csock->server);
index 654e1921e69bb477900260393aba8f4117a6dd4c..7990351217c1b8d72a88099ae4d68c0ed5789e67 100644 (file)
@@ -913,7 +913,7 @@ tlslisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
        /*
         * We need to create a 'wrapper' tlssocket for this connection.
         */
-       tlssock = isc_mem_get(handle->sock->worker->mctx, sizeof(*tlssock));
+       tlssock = isc_mempool_get(handle->sock->worker->nmsocket_pool);
        isc__nmsocket_init(tlssock, handle->sock->worker, isc_nm_tlssocket,
                           &local, NULL);
 
@@ -978,8 +978,7 @@ isc_nm_listentls(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
        }
        REQUIRE(workers <= mgr->nloops);
 
-       tlssock = isc_mem_get(worker->mctx, sizeof(*tlssock));
-
+       tlssock = isc_mempool_get(worker->nmsocket_pool);
        isc__nmsocket_init(tlssock, worker, isc_nm_tlslistener, iface, NULL);
        tlssock->accept_cb = accept_cb;
        tlssock->accept_cbarg = accept_cbarg;
@@ -1213,7 +1212,7 @@ isc_nm_tlsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
                return;
        }
 
-       sock = isc_mem_get(worker->mctx, sizeof(*sock));
+       sock = isc_mempool_get(worker->nmsocket_pool);
        isc__nmsocket_init(sock, worker, isc_nm_tlssocket, local, NULL);
        sock->connect_cb = connect_cb;
        sock->connect_cbarg = connect_cbarg;
index d9aa3f7716987a4a78d13f1a81e83178c73849da..1bcff168b285146ab25281321d6d676719e762f7 100644 (file)
@@ -227,7 +227,7 @@ isc_nm_listenudp(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
        }
        REQUIRE(workers <= mgr->nloops);
 
-       sock = isc_mem_get(worker->mctx, sizeof(isc_nmsocket_t));
+       sock = isc_mempool_get(worker->nmsocket_pool);
        isc__nmsocket_init(sock, worker, isc_nm_udplistener, iface, NULL);
 
        sock->nchildren = (workers == ISC_NM_LISTEN_ALL) ? (uint32_t)mgr->nloops
@@ -376,7 +376,7 @@ isc_nm_routeconnect(isc_nm_t *mgr, isc_nm_cb_t cb, void *cbarg) {
                return (result);
        }
 
-       sock = isc_mem_get(worker->mctx, sizeof(*sock));
+       sock = isc_mempool_get(worker->nmsocket_pool);
        isc__nmsocket_init(sock, worker, isc_nm_udpsocket, NULL, NULL);
 
        sock->connect_cb = cb;
@@ -796,8 +796,7 @@ isc_nm_udpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
        }
 
        /* Initialize the new socket */
-       /* FIXME: Use per-worker mempool for new sockets */
-       sock = isc_mem_get(worker->mctx, sizeof(isc_nmsocket_t));
+       sock = isc_mempool_get(worker->nmsocket_pool);
        isc__nmsocket_init(sock, worker, isc_nm_udpsocket, local, NULL);
 
        sock->connect_cb = cb;