2013-08-28 19:24:34 -04:00
|
|
|
[[modules-threadpool]]
|
|
|
|
== Thread Pool
|
|
|
|
|
2014-11-11 17:35:55 -05:00
|
|
|
A node holds several thread pools in order to improve how threads memory consumption
|
|
|
|
are managed within a node. Many of these pools also have queues associated with them,
|
|
|
|
which allow pending requests to be held instead
|
|
|
|
of discarded.
|
|
|
|
|
|
|
|
|
|
|
|
There are several thread pools, but the important ones include:
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2015-10-28 10:16:54 -04:00
|
|
|
`generic`::
|
|
|
|
For generic operations (e.g., background node discovery).
|
2016-03-08 13:39:43 -05:00
|
|
|
Thread pool type is `scaling`.
|
2015-10-28 10:16:54 -04:00
|
|
|
|
2014-11-11 17:35:55 -05:00
|
|
|
`index`::
|
2015-10-28 10:16:54 -04:00
|
|
|
For index/delete operations. Thread pool type is `fixed`
|
2014-11-11 17:35:55 -05:00
|
|
|
with a size of `# of available processors`,
|
2016-05-26 09:40:22 -04:00
|
|
|
queue_size of `200`. The maximum size for this pool
|
2016-06-06 22:09:12 -04:00
|
|
|
is `1 + # of available processors`.
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2014-11-11 17:35:55 -05:00
|
|
|
`search`::
|
2017-03-20 13:07:32 -04:00
|
|
|
For count/search/suggest operations. Thread pool type is
|
|
|
|
`fixed_auto_queue_size` with a size of
|
|
|
|
`int((# of available_processors * 3) / 2) + 1`, and initial queue_size of
|
|
|
|
`1000`.
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2014-11-11 17:35:55 -05:00
|
|
|
`get`::
|
2015-10-28 10:16:54 -04:00
|
|
|
For get operations. Thread pool type is `fixed`
|
2014-11-11 17:35:55 -05:00
|
|
|
with a size of `# of available processors`,
|
|
|
|
queue_size of `1000`.
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2013-10-12 15:51:37 -04:00
|
|
|
`bulk`::
|
2015-10-28 10:16:54 -04:00
|
|
|
For bulk operations. Thread pool type is `fixed`
|
2014-11-11 17:35:55 -05:00
|
|
|
with a size of `# of available processors`,
|
2017-04-03 22:39:24 -04:00
|
|
|
queue_size of `200`. The maximum size for this pool
|
2016-06-06 22:09:12 -04:00
|
|
|
is `1 + # of available processors`.
|
2013-10-12 15:51:37 -04:00
|
|
|
|
2014-05-14 20:06:27 -04:00
|
|
|
`snapshot`::
|
2015-10-28 10:16:54 -04:00
|
|
|
For snapshot/restore operations. Thread pool type is `scaling` with a
|
2016-06-06 22:09:12 -04:00
|
|
|
keep-alive of `5m` and a max of `min(5, (# of available processors)/2)`.
|
2014-05-14 20:06:27 -04:00
|
|
|
|
|
|
|
`warmer`::
|
2015-10-28 10:16:54 -04:00
|
|
|
For segment warm-up operations. Thread pool type is `scaling` with a
|
2016-06-06 22:09:12 -04:00
|
|
|
keep-alive of `5m` and a max of `min(5, (# of available processors)/2)`.
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2014-11-11 17:35:55 -05:00
|
|
|
`refresh`::
|
2015-10-28 10:16:54 -04:00
|
|
|
For refresh operations. Thread pool type is `scaling` with a
|
2016-06-06 22:09:12 -04:00
|
|
|
keep-alive of `5m` and a max of `min(10, (# of available processors)/2)`.
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2014-09-23 10:26:33 -04:00
|
|
|
`listener`::
|
2014-11-11 17:35:55 -05:00
|
|
|
Mainly for java client executing of action when listener threaded is set to true.
|
2016-06-06 22:09:12 -04:00
|
|
|
Thread pool type is `scaling` with a default max of `min(10, (# of available processors)/2)`.
|
2014-09-23 10:26:33 -04:00
|
|
|
|
2015-10-28 10:16:54 -04:00
|
|
|
Changing a specific thread pool can be done by setting its type-specific parameters; for example, changing the `index`
|
|
|
|
thread pool to have more threads:
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2016-07-27 11:54:52 -04:00
|
|
|
[source,yaml]
|
2013-08-28 19:24:34 -04:00
|
|
|
--------------------------------------------------
|
2016-06-06 22:09:12 -04:00
|
|
|
thread_pool:
|
2013-08-28 19:24:34 -04:00
|
|
|
index:
|
|
|
|
size: 30
|
|
|
|
--------------------------------------------------
|
|
|
|
|
|
|
|
[float]
|
2013-09-25 12:17:40 -04:00
|
|
|
[[types]]
|
2013-08-28 19:24:34 -04:00
|
|
|
=== Thread pool types
|
|
|
|
|
2015-10-28 10:16:54 -04:00
|
|
|
The following are the types of thread pools and their respective parameters:
|
2013-08-28 19:24:34 -04:00
|
|
|
|
|
|
|
[float]
|
|
|
|
==== `fixed`
|
|
|
|
|
|
|
|
The `fixed` thread pool holds a fixed size of threads to handle the
|
|
|
|
requests with a queue (optionally bounded) for pending requests that
|
|
|
|
have no threads to service them.
|
|
|
|
|
|
|
|
The `size` parameter controls the number of threads, and defaults to the
|
|
|
|
number of cores times 5.
|
|
|
|
|
|
|
|
The `queue_size` allows to control the size of the queue of pending
|
|
|
|
requests that have no threads to execute them. By default, it is set to
|
|
|
|
`-1` which means its unbounded. When a request comes in and the queue is
|
2013-09-20 06:31:17 -04:00
|
|
|
full, it will abort the request.
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2016-07-27 11:54:52 -04:00
|
|
|
[source,yaml]
|
2013-08-28 19:24:34 -04:00
|
|
|
--------------------------------------------------
|
2016-06-06 22:09:12 -04:00
|
|
|
thread_pool:
|
2013-08-28 19:24:34 -04:00
|
|
|
index:
|
|
|
|
size: 30
|
|
|
|
queue_size: 1000
|
|
|
|
--------------------------------------------------
|
2013-09-20 06:35:27 -04:00
|
|
|
|
2017-03-20 13:07:32 -04:00
|
|
|
[float]
|
|
|
|
==== `fixed_auto_queue_size`
|
|
|
|
|
2017-05-22 04:03:31 -04:00
|
|
|
experimental[]
|
|
|
|
|
2017-03-20 13:07:32 -04:00
|
|
|
The `fixed_auto_queue_size` thread pool holds a fixed size of threads to handle
|
|
|
|
the requests with a bounded queue for pending requests that have no threads to
|
|
|
|
service them. It's similar to the `fixed` threadpool, however, the `queue_size`
|
|
|
|
automatically adjusts according to calculations based on
|
|
|
|
https://en.wikipedia.org/wiki/Little%27s_law[Little's Law]. These calculations
|
|
|
|
will potentially adjust the `queue_size` up or down by 50 every time
|
|
|
|
`auto_queue_frame_size` operations have been completed.
|
|
|
|
|
|
|
|
The `size` parameter controls the number of threads, and defaults to the
|
|
|
|
number of cores times 5.
|
|
|
|
|
|
|
|
The `queue_size` allows to control the initial size of the queue of pending
|
|
|
|
requests that have no threads to execute them.
|
|
|
|
|
|
|
|
The `min_queue_size` setting controls the minimum amount the `queue_size` can be
|
|
|
|
adjusted to.
|
|
|
|
|
|
|
|
The `max_queue_size` setting controls the maximum amount the `queue_size` can be
|
|
|
|
adjusted to.
|
|
|
|
|
|
|
|
The `auto_queue_frame_size` setting controls the number of operations during
|
|
|
|
which measurement is taken before the queue is adjusted. It should be large
|
|
|
|
enough that a single operation cannot unduly bias the calculation.
|
|
|
|
|
|
|
|
The `target_response_rate` is a time value setting that indicates the targeted
|
|
|
|
average response time for tasks in the thread pool queue. If tasks are routinely
|
|
|
|
above this time, the thread pool queue will be adjusted down so that tasks are
|
|
|
|
rejected.
|
|
|
|
|
|
|
|
[source,yaml]
|
|
|
|
--------------------------------------------------
|
|
|
|
thread_pool:
|
|
|
|
search:
|
|
|
|
size: 30
|
|
|
|
queue_size: 500
|
|
|
|
min_queue_size: 10
|
|
|
|
max_queue_size: 1000
|
|
|
|
auto_queue_frame_size: 2000
|
|
|
|
target_response_rate: 1s
|
|
|
|
--------------------------------------------------
|
|
|
|
|
2015-07-15 08:11:06 -04:00
|
|
|
[float]
|
|
|
|
==== `scaling`
|
|
|
|
|
2016-03-08 13:39:43 -05:00
|
|
|
The `scaling` thread pool holds a dynamic number of threads. This
|
|
|
|
number is proportional to the workload and varies between the value of
|
2016-06-06 22:09:12 -04:00
|
|
|
the `core` and `max` parameters.
|
2015-07-15 08:11:06 -04:00
|
|
|
|
|
|
|
The `keep_alive` parameter determines how long a thread should be kept
|
|
|
|
around in the thread pool without it doing any work.
|
|
|
|
|
2016-07-27 11:54:52 -04:00
|
|
|
[source,yaml]
|
2015-07-15 08:11:06 -04:00
|
|
|
--------------------------------------------------
|
2016-06-06 22:09:12 -04:00
|
|
|
thread_pool:
|
2015-07-15 08:11:06 -04:00
|
|
|
warmer:
|
2016-06-06 22:09:12 -04:00
|
|
|
core: 1
|
|
|
|
max: 8
|
2015-07-15 08:11:06 -04:00
|
|
|
keep_alive: 2m
|
|
|
|
--------------------------------------------------
|
|
|
|
|
2013-10-09 03:54:58 -04:00
|
|
|
[float]
|
2013-09-25 12:17:40 -04:00
|
|
|
[[processors]]
|
2013-09-20 06:35:27 -04:00
|
|
|
=== Processors setting
|
|
|
|
The number of processors is automatically detected, and the thread pool
|
2016-10-14 05:48:41 -04:00
|
|
|
settings are automatically set based on it. In some cases it can be
|
|
|
|
useful to override the number of detected processors. This can be done
|
|
|
|
by explicitly setting the `processors` setting.
|
2013-09-20 06:35:27 -04:00
|
|
|
|
2016-07-27 11:54:52 -04:00
|
|
|
[source,yaml]
|
|
|
|
--------------------------------------------------
|
|
|
|
processors: 2
|
|
|
|
--------------------------------------------------
|
|
|
|
|
2016-10-14 05:48:41 -04:00
|
|
|
There are a few use-cases for explicitly overriding the `processors`
|
|
|
|
setting:
|
|
|
|
|
|
|
|
. If you are running multiple instances of Elasticsearch on the same
|
|
|
|
host but want Elasticsearch to size its thread pools as if it only has a
|
|
|
|
fraction of the CPU, you should override the `processors` setting to the
|
|
|
|
desired fraction (e.g., if you're running two instances of Elasticsearch
|
|
|
|
on a 16-core machine, set `processors` to 8). Note that this is an
|
|
|
|
expert-level use-case and there's a lot more involved than just setting
|
|
|
|
the `processors` setting as there are other considerations like changing
|
|
|
|
the number of garbage collector threads, pinning processes to cores,
|
|
|
|
etc.
|
|
|
|
. Sometimes the number of processors is wrongly detected and in such
|
|
|
|
cases explicitly setting the `processors` setting will workaround such
|
|
|
|
issues.
|
|
|
|
|
2013-09-20 06:35:27 -04:00
|
|
|
In order to check the number of processors detected, use the nodes info
|
2013-10-09 03:54:58 -04:00
|
|
|
API with the `os` flag.
|