From abc0a9005e65d297a22c616e687ea32df958d8f3 Mon Sep 17 00:00:00 2001 From: Gaurav Bafna Date: Wed, 5 Feb 2025 13:14:16 +0530 Subject: [PATCH] Making force merge threadpool 1/8th of total cores Signed-off-by: Gaurav Bafna --- CHANGELOG.md | 1 + .../main/java/org/opensearch/threadpool/ThreadPool.java | 9 ++++++++- .../java/org/opensearch/threadpool/ThreadPoolTests.java | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d1f544f2f03a..b70c7898ac077 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -88,6 +88,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Use the correct type to widen the sort fields when merging top docs ([#16881](https://github.com/opensearch-project/OpenSearch/pull/16881)) - Limit reader writer separation to remote store enabled clusters [#16760](https://github.com/opensearch-project/OpenSearch/pull/16760) - Optimize innerhits query performance [#16937](https://github.com/opensearch-project/OpenSearch/pull/16937) +- Increase force merge threads to 1/8th of cores [#17255](https://github.com/opensearch-project/OpenSearch/pull/17255) ### Deprecated - Performing update operation with default pipeline or final pipeline is deprecated ([#16712](https://github.com/opensearch-project/OpenSearch/pull/16712)) diff --git a/server/src/main/java/org/opensearch/threadpool/ThreadPool.java b/server/src/main/java/org/opensearch/threadpool/ThreadPool.java index 59d3b110aeca8..b67b00bb42054 100644 --- a/server/src/main/java/org/opensearch/threadpool/ThreadPool.java +++ b/server/src/main/java/org/opensearch/threadpool/ThreadPool.java @@ -278,7 +278,10 @@ public ThreadPool( Names.FETCH_SHARD_STARTED, new ScalingExecutorBuilder(Names.FETCH_SHARD_STARTED, 1, 2 * allocatedProcessors, TimeValue.timeValueMinutes(5)) ); - builders.put(Names.FORCE_MERGE, new FixedExecutorBuilder(settings, Names.FORCE_MERGE, 1, -1)); + builders.put( + Names.FORCE_MERGE, + new FixedExecutorBuilder(settings, Names.FORCE_MERGE, oneEighthAllocatedProcessors(allocatedProcessors), -1) + ); builders.put( Names.FETCH_SHARD_STORE, new ScalingExecutorBuilder(Names.FETCH_SHARD_STORE, 1, 2 * allocatedProcessors, TimeValue.timeValueMinutes(5)) @@ -678,6 +681,10 @@ static int boundedBy(int value, int min, int max) { return Math.min(max, Math.max(min, value)); } + static int oneEighthAllocatedProcessors(final int allocatedProcessors) { + return boundedBy(allocatedProcessors / 8, 1, Integer.MAX_VALUE); + } + static int halfAllocatedProcessors(int allocatedProcessors) { return (allocatedProcessors + 1) / 2; } diff --git a/server/src/test/java/org/opensearch/threadpool/ThreadPoolTests.java b/server/src/test/java/org/opensearch/threadpool/ThreadPoolTests.java index 205bf7621c576..fd79115ad5872 100644 --- a/server/src/test/java/org/opensearch/threadpool/ThreadPoolTests.java +++ b/server/src/test/java/org/opensearch/threadpool/ThreadPoolTests.java @@ -196,4 +196,12 @@ public void testThreadPoolResizeFail() { terminate(threadPool); } } + + public void testOneEighthAllocatedProcessors() { + assertThat(ThreadPool.oneEighthAllocatedProcessors(1), equalTo(1)); + assertThat(ThreadPool.oneEighthAllocatedProcessors(4), equalTo(1)); + assertThat(ThreadPool.oneEighthAllocatedProcessors(8), equalTo(1)); + assertThat(ThreadPool.oneEighthAllocatedProcessors(32), equalTo(4)); + assertThat(ThreadPool.oneEighthAllocatedProcessors(128), equalTo(16)); + } }