mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-30 22:15:20 +00:00
Add configuration option to set send/recv buffers on the nm sockets
This commit adds a new configuration option to set the receive and send buffer sizes on the TCP and UDP netmgr sockets. The default is `0` which doesn't set any value and just uses the value set by the operating system. There's no magic value here - set it too small and the performance will drop, set it too large, the buffers can fill-up with queries that have already timeouted on the client side and nobody is interested for the answer and this would just make the server clog up even more by making it produce useless work. The `netstat -su` can be used on POSIX systems to monitor the receive and send buffer errors.
This commit is contained in:
@@ -615,6 +615,17 @@ isc_nm_settimeouts(isc_nm_t *mgr, uint32_t init, uint32_t idle,
|
||||
atomic_store(&mgr->advertised, advertised);
|
||||
}
|
||||
|
||||
void
|
||||
isc_nm_setnetbuffers(isc_nm_t *mgr, int32_t recv_tcp, int32_t send_tcp,
|
||||
int32_t recv_udp, int32_t send_udp) {
|
||||
REQUIRE(VALID_NM(mgr));
|
||||
|
||||
atomic_store(&mgr->recv_tcp_buffer_size, recv_tcp);
|
||||
atomic_store(&mgr->send_tcp_buffer_size, send_tcp);
|
||||
atomic_store(&mgr->recv_udp_buffer_size, recv_udp);
|
||||
atomic_store(&mgr->send_udp_buffer_size, send_udp);
|
||||
}
|
||||
|
||||
void
|
||||
isc_nm_gettimeouts(isc_nm_t *mgr, uint32_t *initial, uint32_t *idle,
|
||||
uint32_t *keepalive, uint32_t *advertised) {
|
||||
@@ -3141,6 +3152,40 @@ isc__nm_socket_tcp_nodelay(uv_os_sock_t fd) {
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
isc__nm_set_network_buffers(isc_nm_t *nm, uv_handle_t *handle) {
|
||||
int32_t recv_buffer_size = 0;
|
||||
int32_t send_buffer_size = 0;
|
||||
|
||||
switch (handle->type) {
|
||||
case UV_TCP:
|
||||
recv_buffer_size =
|
||||
atomic_load_relaxed(&nm->recv_tcp_buffer_size);
|
||||
send_buffer_size =
|
||||
atomic_load_relaxed(&nm->send_tcp_buffer_size);
|
||||
break;
|
||||
case UV_UDP:
|
||||
recv_buffer_size =
|
||||
atomic_load_relaxed(&nm->recv_udp_buffer_size);
|
||||
send_buffer_size =
|
||||
atomic_load_relaxed(&nm->send_udp_buffer_size);
|
||||
break;
|
||||
default:
|
||||
INSIST(0);
|
||||
ISC_UNREACHABLE();
|
||||
}
|
||||
|
||||
if (recv_buffer_size > 0) {
|
||||
int r = uv_recv_buffer_size(handle, &recv_buffer_size);
|
||||
INSIST(r == 0);
|
||||
}
|
||||
|
||||
if (send_buffer_size > 0) {
|
||||
int r = uv_send_buffer_size(handle, &send_buffer_size);
|
||||
INSIST(r == 0);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef NETMGR_TRACE
|
||||
/*
|
||||
* Dump all active sockets in netmgr. We output to stderr
|
||||
|
Reference in New Issue
Block a user