* Update multisocket README.md
I was a bit confused why `multisocket` wasn't working for me, but I eventually found 38c020941b/core/dnsserver/register.go (L308):
```
// create one server by default if no NumSockets specified
numSockets := 1
if group[0].NumSockets > 0 {
numSockets = group[0].NumSockets
}
```
I tried to summarize my understanding in the README
Signed-off-by: Ryan Brewster <rpb@anthropic.com>
* Update plugin/multisocket/README.md
Co-authored-by: Ville Vesilehto <ville@vesilehto.fi>
Signed-off-by: Ryan Brewster <rpb@anthropic.com>
---------
Signed-off-by: Ryan Brewster <rpb@anthropic.com>
Co-authored-by: Ville Vesilehto <ville@vesilehto.fi>
multisocket
Name
multisocket - allows to start multiple servers that will listen on one port.
Description
With multisocket, you can define the number of servers that will listen on the same port. The SO_REUSEPORT socket option allows to open multiple listening sockets at the same address and port. In this case, kernel distributes incoming connections between sockets.
Enabling this option allows to start multiple servers, which increases the throughput of CoreDNS in environments with a large number of CPU cores.
Syntax
multisocket [NUM_SOCKETS]
- NUM_SOCKETS - the number of servers that will listen on one port. Default value is equal to GOMAXPROCS. Maximum value is 1024.
Examples
Start 5 TCP/UDP servers on the same port.
. {
multisocket 5
forward . /etc/resolv.conf
}
Do not define NUM_SOCKETS, in this case it will take a value equal to GOMAXPROCS.
. {
multisocket
forward . /etc/resolv.conf
}
Recommendations
The tests of the multisocket plugin, which were conducted for NUM_SOCKETS from 1 to 10, did not reveal any side
effects or performance degradation.
This means that the multisocket plugin can be used with a default value that is equal to GOMAXPROCS.
However, to achieve the best results, it is recommended to consider the specific environment and plugins used in
CoreDNS. To determine the optimal configuration, it is advisable to conduct performance tests with different
NUM_SOCKETS, measuring Queries Per Second (QPS) and system load.
If conducting such tests is difficult, follow these recommendations:
- Determine the maximum CPU consumption of CoreDNS server without
multisocketplugin. Estimate how much CPU CoreDNS actually consumes in specific environment under maximum load. - Align
NUM_SOCKETSwith the estimated CPU usage and CPU limits or system's available resources. Examples:- If CoreDNS consumes 4 CPUs and 8 CPUs are available, set
NUM_SOCKETSto 2. - If CoreDNS consumes 8 CPUs and 64 CPUs are available, set
NUM_SOCKETSto 8.
- If CoreDNS consumes 4 CPUs and 8 CPUs are available, set
Limitations
The multisocket value used for a given listen address is taken from the first server block that binds to that address
in the Corefile. Subsequent server blocks using the same address will not change it. Different addresses may use
different values.
The SO_REUSEPORT socket option is not available for some operating systems. It is available since Linux Kernel 3.9 and not available for Windows at all.
Using this plugin with a system that does not support SO_REUSEPORT will cause an address already in use error.