-
Notifications
You must be signed in to change notification settings - Fork 25.6k
Adjust indices.recovery.max_bytes_per_sec according to external settings #82819
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
henningandersen
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Leaving a bit of initial feedback.
| * Scaling factor applied to {@link #INDICES_RECOVERY_MAX_BYTES_PER_SEC_SETTING} when it is derived from external settings like disk | ||
| * and network bandwidths. See {@link #recoveryMaxBytesPerSecBasedOnExternalSettings(Settings)}. | ||
| */ | ||
| public static final Setting<Double> NODE_RECOVERY_MAX_BYTES_PER_SEC_FACTOR_SETTING = Setting.doubleSetting( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it would be nice to have two settings, one that is operator controlled and one that the user can set. These should be dynamic too.
Also, I think we should define a max value of 1, at least for the user controlled one (but both seems fine to me).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I added a user defined and an operator defined setting for this.
|
|
||
| } else { | ||
| // computes max_bytes_per_sec from memory (for dedicated cold/frozen nodes) | ||
| value = recoveryMaxBytesPerSecBasedOnMemory(settings); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we should calculate this also in the case of external settings and use the max value of the two. The existing "from memory settings" is our minimum value since we would not want to lower it at least initially.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a tricky one. I think I'd rather stick with this override behaviour and build the existing from-memory behaviour into the numbers provided by the environment. If we took the max here then we wouldn't be able to properly support slower/cheaper cold nodes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As discussed I updated the code to use the highest limit among the one computed from the available bandwidths information and the one from indices.recovery.max_bytes_per_sec or derived from the node memory. I also added a maximum allowed overcommit to avoid situation where a user configured an too high value.
| assert NODE_ROLES_SETTING.get(settings).stream().anyMatch(DiscoveryNodeRole::canContainData); | ||
|
|
||
| final long diskBandwidth = NODE_DISK_AVAILABLE_BANDWIDTH_SETTING.get(settings).getBytes(); | ||
| assert diskBandwidth > 0L : diskBandwidth; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This assert does not match the minimum value in the setting, I wonder if we can add validation there to avoid it being set to 0? Or maybe for now just assert >= 0 here?
| * Disk's write bandwidth allocated for this node. When both this setting and {@link #NODE_NETWORK_AVAILABLE_BANDWIDTH_SETTING} | ||
| * are defined they are used to adjust the default value for {@link #INDICES_RECOVERY_MAX_BYTES_PER_SEC_SETTING} per node. | ||
| */ | ||
| public static final Setting<ByteSizeValue> NODE_DISK_AVAILABLE_BANDWIDTH_SETTING = Setting.byteSizeSetting( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wonder if we want both read and write bandwidth here?
It does complicate things a bit, since we may then need more factors (a generic, a read and a write factor), but if we have those available, we can better change our defaults moving forward.
Also, I think we could clarify that this number should be for 1/2MB reads or writes, matching our default chunk size. I think we may want to add more of those in the future, but I think it is fine to stick to one for now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I added read & write bandwidths along with their corresponding factors. Let me know if that's ok.
DaveCTurner
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If the operator has defined our available bandwidth I think we should not let an explicit indices.recovery.max_bytes_per_sec value completely override it, but that's my understanding of what happens with this implementation. I think we should at least respect both limits (i.e. take the min) but we could even just ignore indices.recovery.max_bytes_per_sec if we're in a bandwidth-defined environment.
Given that this first version will be conservative and somewhat incomplete (e.g., not boost vacates), I think we should (for now) let the |
…lastic#83261) `indices.recovery.max_bytes_per_sec` has a default value that depends on multiple criteria that are well documented but not unit tested. This pull request introduces unit tests that verifies the current behavior so that future changes like elastic#82819 are less likely to break things.
…lastic#83261) `indices.recovery.max_bytes_per_sec` has a default value that depends on multiple criteria that are well documented but not unit tested. This pull request introduces unit tests that verifies the current behavior so that future changes like elastic#82819 are less likely to break things.
…83261) (#83283) `indices.recovery.max_bytes_per_sec` has a default value that depends on multiple criteria that are well documented but not unit tested. This pull request introduces unit tests that verifies the current behavior so that future changes like #82819 are less likely to break things. Backport of #83261
…83261) (#83289) `indices.recovery.max_bytes_per_sec` has a default value that depends on multiple criteria that are well documented but not unit tested. This pull request introduces unit tests that verifies the current behavior so that future changes like #82819 are less likely to break things. Backport of #83261
|
Hi @tlrx, I've created a changelog YAML for you. |
|
Pinging @elastic/es-distributed (Team:Distributed) |
|
@DaveCTurner @henningandersen Thanks for your valuable feedback. I've updated the code, hopefully it better matches your expectations. It lacks some unit tests but I think it's good enough to be reviewed. Thanks! |
DaveCTurner
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I left some thoughts and comments inline. I also have a different suggestion for the naming of the settings:
node.bandwidth.recovery.disk.read
node.bandwidth.recovery.disk.write
node.bandwidth.recovery.network
node.bandwidth.recovery.factor
node.bandwidth.recovery.factor.read
node.bandwidth.recovery.factor.write
node.bandwidth.recovery.operator.factor
node.bandwidth.recovery.operator.factor.read
node.bandwidth.recovery.operator.factor.write
node.bandwidth.recovery.operator.factor.max_overcommit
I think it's worthwhile to put all this stuff in its own namespace and suggest node.bandwidth here. Then because we will be benchmarking just a recovery workload (fairly sequential reads/writes in 512kiB chunks) I suggest putting the node specs in n.b.recovery. Also dropping the user from the non-operator settings.
| * Operator-defined factors have a value in (0.0, 1.0] | ||
| */ | ||
| private static Setting<Double> operatorFactorSetting(String key, double defaultValue) { | ||
| return new Setting<>(key, Double.toString(defaultValue), s -> Setting.parseDouble(s, 0d, 1d, key), v -> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we may want to permit the operator to set this above 1.0.
NB this is not a blocking comment, we can relax this later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is not a blocking comment, we can relax this later.
Yes, I don't have a strong opinion on this.
Henning suggested that the user setting should have a max. of 1.0 and maybe the operator one too, that's what I picked up for simplicity... we already introduce a bunch of settings that fall back to each others and increasing here require to check against the max overcommit one too.
| * User-defined factors have a value in (0.0, 1.0] and fall back to a corresponding operator factor setting. | ||
| */ | ||
| private static Setting<Double> userFactorSetting(String key, Setting<Double> operatorFallback) { | ||
| return new Setting<>(key, operatorFallback, s -> Setting.parseDouble(s, 0d, 1d, key), v -> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
... ah but this one should have a max of 1.0 so perhaps we can't just fall back to the operator setting here?
|
|
||
| public static final Setting<ByteSizeValue> INDICES_RECOVERY_MAX_BYTES_PER_SEC_SETTING = Setting.byteSizeSetting( | ||
| "indices.recovery.max_bytes_per_sec", | ||
| settings -> recoveryMaxBytesPerSecBasedOnMemory(settings).getStringRep(), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could we revert this change to indices.recovery.max_bytes_per_sec here? I think this setting is now unchanged right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sure, I reverted in ad2604d
| } | ||
|
|
||
| private void computeMaxBytesPerSec(Settings settings) { | ||
| validateBandwidthsSettings(settings); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We'll run this as a cluster state applier so we can't throw exceptions if we're in an invalid state somehow. We can definitely assert that they're valid, but in production we must apply whatever we have.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch 🤦🏻
I renamed to validateNodeBandwidthRecoverySettings and moved the method in the constructor in 8d71b8b.
| } else { | ||
| finalMaxBytesPerSec = maxBytesPerSec; | ||
| } | ||
| logger.fatal("{} ad {}", MAX_BYTES_PER_SEC_USER_FACTOR_SETTING.get(settings), NODE_ROLES_SETTING.get(settings)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Leftover?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, I removed this c0ff25d. Thanks.
| } | ||
|
|
||
| final long availableBytesPerSec = Math.round( | ||
| Math.min(diskBandwidthBytesPerSec, networkBandwidthBytesPerSec) * MAX_BYTES_PER_SEC_USER_FACTOR_SETTING.get(settings) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think applying the read/write factor and then the overall factor might lead to surprise, given that we have other settings like cluster.routing.allocation.node_concurrent{,_incoming,_outgoing}_recoveries where the unqualified setting sets both of the qualified ones.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agreed, can we instead make node.recovery.max_bytes_per_sec.user_factor.writes default to the default one.
I think we should then make the calculation by calculating the read speed as min(availableDiskReadBandwidth, networkBandwidthBytesPerSec) * read_factor (likewise for write speed).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right, I agree it makes more sense like you both suggested. I pushed a change in 6f7c47d.
The max. overcommit is calculated from Math.min(read, write) * overcommitFactor (ie what would have been the limit if bandwidths were applied ajusted to the overcommit ratio we allow). Let me know if you want it calculated differently.
henningandersen
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A couple of comments, need a bit more time but wanted to relay comments early.
| "node.network.allocated_bandwidth" | ||
| ); | ||
|
|
||
| static final double DEFAULT_FACTOR_VALUE = 0.8d; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we should lower this to say 0.4. 0.8 seems like it could disturb ongoing operations?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree, I set it to 0.4 in d9ac148.
| } | ||
|
|
||
| final long availableBytesPerSec = Math.round( | ||
| Math.min(diskBandwidthBytesPerSec, networkBandwidthBytesPerSec) * MAX_BYTES_PER_SEC_USER_FACTOR_SETTING.get(settings) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agreed, can we instead make node.recovery.max_bytes_per_sec.user_factor.writes default to the default one.
I think we should then make the calculation by calculating the read speed as min(availableDiskReadBandwidth, networkBandwidthBytesPerSec) * read_factor (likewise for write speed).
Today the setting indices.recovery.max_bytes_per_sec defaults to different
values depending on the node roles, the JVM version and the system total
memory that can be detected.
The current logic to set the default value can be summarized as:
40 MB for non-data nodes
40 MB for data nodes that runs on a JVM version < 14
40 MB for data nodes that have one of the data_hot, data_warm, data_content or data roles
Nodes with only data_cold and/or data_frozen roles as data roles have a
default value that depends of the available memory:
with ≤ 4 GB of available memory, the default is 40 MB
with more than 4 GB and less or equal to 8 GB, the default is 60 MB
with more than 8 GB and less or equal to 16 GB, the default is 90 MB
with more than 16 GB and less or equal to 32 GB, the default is 125 MB
and above 32 GB, the default is 250 MB
While those defaults served us well, we want to evaluate if we can define
more appropriate defaults if Elasticsearch were to know better the limits
(or properties) of the hardware it is running on - something that Elasticsearch
cannot extract by itself but can derive from settings that are provided at startup.
This pull request introduces the following new node settings:
node.bandwidth.recovery.network
node.bandwidth.recovery.disk.read
node.bandwidth.recovery.disk.write
Those settings are not dynamic and must be set before the node starts.
When they are set Elasticsearch detects the minimum available bandwidth
among the network, disk read and disk write available bandwidths and computes
a maximum bytes per seconds limit that will be a fraction of the min. available
bandwidth. By default 40% of the min. bandwidth is used but that can be
dynamically configured by an operator
(using the node.bandwidth.recovery.operator.factor setting) or by the user
directly (using a different setting node.bandwidth.recovery.factor).
The limit computed from available bandwidths is then compared to pre existing
limitations like the one set through the indices.recovery.max_bytes_per_sec setting
or the one that is computed by Elasticsearch from the node's physical memory
on dedicated cold/frozen nodes. Elasticsearch will try to use the highest possible
limit among those values, while not exceeding an overcommit ratio that is also
defined through a node setting
(see node.bandwidth.recovery.operator.factor.max_overcommit).
This overcommit ratio is here to prevent the rate limit to be set to a value that is
greater than 100 times (by default) the minimum available bandwidth.
Backport of elastic#82819 for 7.17.1
…tic#83350) The setting node.bandwidth.recovery.operator.factor.max_overcommit wasn't added to the list of cluster settings and to the list of settings to consume for updates. Relates elastic#82819
…ngs (elastic#82819) Today the setting indices.recovery.max_bytes_per_sec defaults to different values depending on the node roles, the JVM version and the system total memory that can be detected. The current logic to set the default value can be summarized as: 40 MB for non-data nodes 40 MB for data nodes that runs on a JVM version < 14 40 MB for data nodes that have one of the data_hot, data_warm, data_content or data roles Nodes with only data_cold and/or data_frozen roles as data roles have a default value that depends of the available memory: with ≤ 4 GB of available memory, the default is 40 MB with more than 4 GB and less or equal to 8 GB, the default is 60 MB with more than 8 GB and less or equal to 16 GB, the default is 90 MB with more than 16 GB and less or equal to 32 GB, the default is 125 MB and above 32 GB, the default is 250 MB While those defaults served us well, we want to evaluate if we can define more appropriate defaults if Elasticsearch were to know better the limits (or properties) of the hardware it is running on - something that Elasticsearch cannot extract by itself but can derive from settings that are provided at startup. This pull request introduces the following new node settings: node.bandwidth.recovery.network node.bandwidth.recovery.disk.read node.bandwidth.recovery.disk.write Those settings are not dynamic and must be set before the node starts. When they are set Elasticsearch detects the minimum available bandwidth among the network, disk read and disk write available bandwidths and computes a maximum bytes per seconds limit that will be a fraction of the min. available bandwidth. By default 40% of the min. bandwidth is used but that can be dynamically configured by an operator (using the node.bandwidth.recovery.operator.factor setting) or by the user directly (using a different setting node.bandwidth.recovery.factor). The limit computed from available bandwidths is then compared to pre existing limitations like the one set through the indices.recovery.max_bytes_per_sec setting or the one that is computed by Elasticsearch from the node's physical memory on dedicated cold/frozen nodes. Elasticsearch will try to use the highest possible limit among those values, while not exceeding an overcommit ratio that is also defined through a node setting (see node.bandwidth.recovery.operator.factor.max_overcommit). This overcommit ratio is here to prevent the rate limit to be set to a value that is greater than 100 times (by default) the minimum available bandwidth.
…tic#83350) The setting node.bandwidth.recovery.operator.factor.max_overcommit wasn't added to the list of cluster settings and to the list of settings to consume for updates. Relates elastic#82819
…stic#83372) This commit updates the Operator-only functionality doc to mention the operator only settings introduced in elastic#82819. It also adds an integration test for those operator only settings that would have caught elastic#83359.
…nal settings (#83413) * Adjust indices.recovery.max_bytes_per_sec according to external settings Today the setting indices.recovery.max_bytes_per_sec defaults to different values depending on the node roles, the JVM version and the system total memory that can be detected. The current logic to set the default value can be summarized as: 40 MB for non-data nodes 40 MB for data nodes that runs on a JVM version < 14 40 MB for data nodes that have one of the data_hot, data_warm, data_content or data roles Nodes with only data_cold and/or data_frozen roles as data roles have a default value that depends of the available memory: with ≤ 4 GB of available memory, the default is 40 MB with more than 4 GB and less or equal to 8 GB, the default is 60 MB with more than 8 GB and less or equal to 16 GB, the default is 90 MB with more than 16 GB and less or equal to 32 GB, the default is 125 MB and above 32 GB, the default is 250 MB While those defaults served us well, we want to evaluate if we can define more appropriate defaults if Elasticsearch were to know better the limits (or properties) of the hardware it is running on - something that Elasticsearch cannot extract by itself but can derive from settings that are provided at startup. This pull request introduces the following new node settings: node.bandwidth.recovery.network node.bandwidth.recovery.disk.read node.bandwidth.recovery.disk.write Those settings are not dynamic and must be set before the node starts. When they are set Elasticsearch detects the minimum available bandwidth among the network, disk read and disk write available bandwidths and computes a maximum bytes per seconds limit that will be a fraction of the min. available bandwidth. By default 40% of the min. bandwidth is used but that can be dynamically configured by an operator (using the node.bandwidth.recovery.operator.factor setting) or by the user directly (using a different setting node.bandwidth.recovery.factor). The limit computed from available bandwidths is then compared to pre existing limitations like the one set through the indices.recovery.max_bytes_per_sec setting or the one that is computed by Elasticsearch from the node's physical memory on dedicated cold/frozen nodes. Elasticsearch will try to use the highest possible limit among those values, while not exceeding an overcommit ratio that is also defined through a node setting (see node.bandwidth.recovery.operator.factor.max_overcommit). This overcommit ratio is here to prevent the rate limit to be set to a value that is greater than 100 times (by default) the minimum available bandwidth. Backport of #82819 for 7.17.1 * Add missing max overcommit factor to list of (dynamic) settings (#83350) The setting node.bandwidth.recovery.operator.factor.max_overcommit wasn't added to the list of cluster settings and to the list of settings to consume for updates. Relates #82819 * Operator factor settings should have the OperatorDynamic setting property (#83359) Relates #82819 * Add docs for node bandwith settings (#83361) Relates #82819 * Adjust for 7.17.1 * remove draft * remove docs/changelog/83350.yaml Co-authored-by: David Turner <[email protected]>
…al settings (#83414) * Adjust indices.recovery.max_bytes_per_sec according to external settings (#82819) Today the setting indices.recovery.max_bytes_per_sec defaults to different values depending on the node roles, the JVM version and the system total memory that can be detected. The current logic to set the default value can be summarized as: 40 MB for non-data nodes 40 MB for data nodes that runs on a JVM version < 14 40 MB for data nodes that have one of the data_hot, data_warm, data_content or data roles Nodes with only data_cold and/or data_frozen roles as data roles have a default value that depends of the available memory: with ≤ 4 GB of available memory, the default is 40 MB with more than 4 GB and less or equal to 8 GB, the default is 60 MB with more than 8 GB and less or equal to 16 GB, the default is 90 MB with more than 16 GB and less or equal to 32 GB, the default is 125 MB and above 32 GB, the default is 250 MB While those defaults served us well, we want to evaluate if we can define more appropriate defaults if Elasticsearch were to know better the limits (or properties) of the hardware it is running on - something that Elasticsearch cannot extract by itself but can derive from settings that are provided at startup. This pull request introduces the following new node settings: node.bandwidth.recovery.network node.bandwidth.recovery.disk.read node.bandwidth.recovery.disk.write Those settings are not dynamic and must be set before the node starts. When they are set Elasticsearch detects the minimum available bandwidth among the network, disk read and disk write available bandwidths and computes a maximum bytes per seconds limit that will be a fraction of the min. available bandwidth. By default 40% of the min. bandwidth is used but that can be dynamically configured by an operator (using the node.bandwidth.recovery.operator.factor setting) or by the user directly (using a different setting node.bandwidth.recovery.factor). The limit computed from available bandwidths is then compared to pre existing limitations like the one set through the indices.recovery.max_bytes_per_sec setting or the one that is computed by Elasticsearch from the node's physical memory on dedicated cold/frozen nodes. Elasticsearch will try to use the highest possible limit among those values, while not exceeding an overcommit ratio that is also defined through a node setting (see node.bandwidth.recovery.operator.factor.max_overcommit). This overcommit ratio is here to prevent the rate limit to be set to a value that is greater than 100 times (by default) the minimum available bandwidth. * Add missing max overcommit factor to list of (dynamic) settings (#83350) The setting node.bandwidth.recovery.operator.factor.max_overcommit wasn't added to the list of cluster settings and to the list of settings to consume for updates. Relates #82819 * Add docs for node bandwith settings (#83361) Relates #82819 * Operator factor settings should have the OperatorDynamic setting property (#83359) Relates #82819 * Document and test operator-only node bandwidth recovery settings (#83372) This commit updates the Operator-only functionality doc to mention the operator only settings introduced in #82819. It also adds an integration test for those operator only settings that would have caught #83359. * remove draft * remove docs/changelog/83350.yaml Co-authored-by: David Turner <[email protected]>
Today the setting
indices.recovery.max_bytes_per_secdefaults to different values depending on the node roles, the JVM version and the system total memory that can be detected.The current logic to set the default value can be summarized as:
40 MBfor non-data nodes40 MBfor data nodes that runs on a JVM version < 1440 MBfor data nodes that have one of thedata_hot,data_warm,data_contentordatarolesNodes with only
data_coldand/ordata_frozenroles as data roles have a default value that depends of the available memory:250 MBWhile those defaults served us well, we want to evaluate if we can define more appropriate defaults if Elasticsearch were to know better the limits (or properties) of the hardware it is running on - something that Elasticsearch cannot extract by itself but can derive from settings that are provided at startup.
This pull request introduces the following new node settings:
Those settings are not dynamic and must be set before the node starts. When they are set Elasticsearch detects the minimum available bandwidth among the network, disk read and disk write available bandwidths and computes a maximum bytes per seconds limit that will be a fraction of the min. available bandwidth. By default 40% of the min. bandwidth is used but that can be dynamically configured by an operator (using the
node.bandwidth.recovery.operator.factorsetting) or by the user directly (using a different settingnode.bandwidth.recovery.factor).The limit computed from available bandwidths is then compared to pre existing limitations like the one set through the
indices.recovery.max_bytes_per_secsetting or the one that is computed by Elasticsearch from the node's physical memory on dedicated cold/frozen nodes. Elasticsearch will try to use the highest possible limit among those values, while not exceeding an overcommit ratio that is also defined through a node setting (seenode.bandwidth.recovery.operator.factor.max_overcommit).This overcommit ratio is here to prevent the rate limit to be set to a value that is greater than 100 times (by default) the minimum available bandwidth.
For example, a node with the following bandwidths:
Elasticsearch picks up the minimum available bandwidth (250 MB/s) and applies the default ratio of
0.4to compute an available bandwidth of100 MB/s. This value is then compare with pre existing limit, for example the default40MB/s, and Elasticsearch uses the highest possible one, in this case100 MB/s. In any case the limit cannot exceed250 MB/s*100.