123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- [[modules-threadpool]]
- == Thread Pool
- 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:
- `generic`::
- For generic operations (e.g., background node discovery).
- Thread pool type is `scaling`.
- `index`::
- For index/delete operations. Thread pool type is `fixed`
- with a size of `# of available processors`,
- queue_size of `200`. The maximum size for this pool
- is `1 + # of available processors`.
- `search`::
- For count/search/suggest operations. Thread pool type is `fixed`
- with a size of `int((# of available_processors * 3) / 2) + 1`,
- queue_size of `1000`.
- `get`::
- For get operations. Thread pool type is `fixed`
- with a size of `# of available processors`,
- queue_size of `1000`.
- `bulk`::
- For bulk operations. Thread pool type is `fixed`
- with a size of `# of available processors`,
- queue_size of `50`. The maximum size for this pool
- is `1 + # of available processors`.
- `snapshot`::
- For snapshot/restore operations. Thread pool type is `scaling` with a
- keep-alive of `5m` and a max of `min(5, (# of available processors)/2)`.
- `warmer`::
- For segment warm-up operations. Thread pool type is `scaling` with a
- keep-alive of `5m` and a max of `min(5, (# of available processors)/2)`.
- `refresh`::
- For refresh operations. Thread pool type is `scaling` with a
- keep-alive of `5m` and a max of `min(10, (# of available processors)/2)`.
- `listener`::
- Mainly for java client executing of action when listener threaded is set to true.
- Thread pool type is `scaling` with a default max of `min(10, (# of available processors)/2)`.
- 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:
- [source,yaml]
- --------------------------------------------------
- thread_pool:
- index:
- size: 30
- --------------------------------------------------
- [float]
- [[types]]
- === Thread pool types
- The following are the types of thread pools and their respective parameters:
- [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
- full, it will abort the request.
- [source,yaml]
- --------------------------------------------------
- thread_pool:
- index:
- size: 30
- queue_size: 1000
- --------------------------------------------------
- [float]
- ==== `scaling`
- The `scaling` thread pool holds a dynamic number of threads. This
- number is proportional to the workload and varies between the value of
- the `core` and `max` parameters.
- The `keep_alive` parameter determines how long a thread should be kept
- around in the thread pool without it doing any work.
- [source,yaml]
- --------------------------------------------------
- thread_pool:
- warmer:
- core: 1
- max: 8
- keep_alive: 2m
- --------------------------------------------------
- [float]
- [[processors]]
- === Processors setting
- The number of processors is automatically detected, and the thread pool
- 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.
- [source,yaml]
- --------------------------------------------------
- processors: 2
- --------------------------------------------------
- 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.
- In order to check the number of processors detected, use the nodes info
- API with the `os` flag.
|