coredns/plugin/multisocket
Viktor 6c39f4bae7
multisocket plugin (#6882)
* multisocket plugin improves performance in multiprocessor systems

Signed-off-by: Viktor Rodionov <33463837+Shmillerov@users.noreply.github.com>

* - refactoring
- update doc

Signed-off-by: Viktor Rodionov <33463837+Shmillerov@users.noreply.github.com>

* remove port from reuseport plugin README

Signed-off-by: Viktor Rodionov <33463837+Shmillerov@users.noreply.github.com>

* rename reuseport plugin to numsockets plugin

Signed-off-by: Viktor Rodionov <33463837+Shmillerov@users.noreply.github.com>

* Add Recommendations to numsockets README

Signed-off-by: Viktor Rodionov <33463837+Shmillerov@users.noreply.github.com>

* added numsockets test; made NUM_SOCKETS mandatory in doc

Signed-off-by: Viktor Rodionov <33463837+Shmillerov@users.noreply.github.com>

* restart and whoami tests for numsockets plugin

Signed-off-by: Viktor Rodionov <33463837+Shmillerov@users.noreply.github.com>

* default value for numsockets

Signed-off-by: Viktor Rodionov <33463837+Shmillerov@users.noreply.github.com>

* caddy up

Signed-off-by: Viktor Rodionov <33463837+Shmillerov@users.noreply.github.com>

* add numsockets to plugin.cfg

Signed-off-by: Viktor Rodionov <33463837+Shmillerov@users.noreply.github.com>

* - rename numsockets plugin to multisocket
- default as GOMAXPROCS
- update README

Signed-off-by: Viktor Rodionov <33463837+Shmillerov@users.noreply.github.com>

* resolve conflicts

Signed-off-by: Viktor Rodionov <33463837+Shmillerov@users.noreply.github.com>

---------

Signed-off-by: Viktor Rodionov <33463837+Shmillerov@users.noreply.github.com>
2024-11-13 09:40:25 -08:00
..
multisocket.go multisocket plugin (#6882) 2024-11-13 09:40:25 -08:00
multisocket_test.go multisocket plugin (#6882) 2024-11-13 09:40:25 -08:00
README.md multisocket plugin (#6882) 2024-11-13 09:40:25 -08:00

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.

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:

  1. Determine the maximum CPU consumption of CoreDNS server without multisocket plugin. Estimate how much CPU CoreDNS actually consumes in specific environment under maximum load.
  2. Align NUM_SOCKETS with 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_SOCKETS to 2.
    • If CoreDNS consumes 8 CPUs and 64 CPUs are available, set NUM_SOCKETS to 8.

Limitations

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.