summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorSridhar Samudrala <sridhar.samudrala@intel.com>2020-08-18 23:53:07 -0700
committerdormando <dormando@rydia.net>2020-11-02 15:00:36 -0800
commit4de258ed891c0e5048192be1626fff6fabb10438 (patch)
tree72d641c7d3cf7fe74817f229fed164342cfa41ff /doc
parent0b374c63ab7e63c0098983d0a68cefedfd94557a (diff)
downloadmemcached-4de258ed891c0e5048192be1626fff6fabb10438.tar.gz
Introduce NAPI ID based worker thread selection
By default memcached assigns connections to worker threads in a round-robin manner. This patch introduces an option to select a worker thread based on the incoming connection's NAPI ID if SO_INCOMING_NAPI_ID socket option is supported by the OS. This allows a memcached worker thread to be associated with a NIC HW receive queue and service all the connection requests received on a specific RX queue. This mapping between a memcached thread and a HW NIC queue streamlines the flow of data from the NIC to the application. In addition, an optimal path with reduced context switches is possible, if epoll based busy polling (sysctl -w net.core.busy_poll = <non-zero value>) is also enabled. This feature is enabled via a new command line parameter -N <num> or "--napi_ids=<num>", where <num> is the number of available/assigned NIC hardware RX queues through which the connections can be received. The number of napi_ids specified cannot be greater than the number of worker threads specified using -t/--threads option. If the option is not specified, or the conditions not met, the code defaults to round robin thread selection. Signed-off-by: Kiran Patil <kiran.patil@intel.com> Signed-off-by: Sridhar Samudrala <sridhar.samudrala@intel.com>
Diffstat (limited to 'doc')
-rw-r--r--doc/napi_ids.txt41
-rw-r--r--doc/protocol.txt5
2 files changed, 46 insertions, 0 deletions
diff --git a/doc/napi_ids.txt b/doc/napi_ids.txt
new file mode 100644
index 0000000..5f497dc
--- /dev/null
+++ b/doc/napi_ids.txt
@@ -0,0 +1,41 @@
+NAPI ID based worker thread selection
+ -N <num_napi_ids> | --napi_ids=<num_napi_ids>
+
+By default memcached assigns connections to worker threads in a round-robin
+manner. NAPI ID based worker thread selection enables worker threads to be
+selected based on the NIC HW RX queue on which the incoming request is
+received.
+
+This is enabled using SO_INCOMING_NAPI_ID socket option that is supported
+in linux kernels 4.12 or higher. This socket option returns a system level
+unique ID called NAPI ID that is associated with a RX queue on which the
+last packet associated with that socket is received.
+
+This allows memcached to split the incoming flows among threads based on
+the RX queue on which they are received. Each worker thread is associated
+with a NIC HW receive queue and services all the connection requests
+received on a specific RX queue. This mapping between a memcached thread
+and a HW NIC queue streamlines the flow of data from the NIC to the
+application. In addition, an optimal path with reduced context switches is
+possible, if epoll based busy polling
+(sysctl -w net.core.busy_poll = <non-zero value>) is also enabled.
+
+This feature is enabled via a new command line parameter -N <num> or
+"--napi_ids=<num>", where <num> is the number of available/assigned NIC
+hardware RX queues through which requests associated with a connection are
+received. The number of napi_ids specified cannot be greater than the number
+of worker threads specified using -t/--threads option. If the option is
+not specified, or the conditions not met, the code defaults to round robin
+thread selection.
+
+During a normal run, each worker thread gets associated with a napi_id and
+this will establish a 1:1 mapping between the thread and queues. If a new
+napi_id is received after each thread is associated with its own napi_id
+(this can happen if num_napi_ids argument doesn't exactly match with the
+number of RX queues OR if the NIC driver goes through a reload), a stats
+error counter called 'unexpected_napi_ids' is incremented and all the
+napi_id's associated with the threads are reset.
+
+If -N option is used, but the connection requests are received from a
+virtual interface like loopback, napi_id returned can be 0. This condition
+is tracked via a stats counter called 'round_robin_fallback'.
diff --git a/doc/protocol.txt b/doc/protocol.txt
index 737937c..c4cca71 100644
--- a/doc/protocol.txt
+++ b/doc/protocol.txt
@@ -1310,6 +1310,11 @@ integers separated by a colon (treat this as a floating point number).
| log_worker_written | 64u | Logs written by a worker, to be picked up |
| log_watcher_skipped | 64u | Logs not sent to slow watchers. |
| log_watcher_sent | 64u | Logs written to watchers. |
+| unexected_napi_ids | 64u | Number of times an unexpected napi id is |
+| | | is received. See doc/napi_ids.txt |
+| round_robin_fallback | 64u | Number of times napi id of 0 is received |
+| | | resulting in fallback to round robin |
+| | | thread selection. See doc/napi_ids.txt |
|-----------------------+---------+-------------------------------------------|
Settings statistics