diff options
author | 2017-07-11 11:56:22 +0200 | |
---|---|---|
committer | 2017-07-11 14:43:03 +0200 | |
commit | 49e2e0d912c5da7077af37f4e9f5c4c4fc81d989 (patch) | |
tree | 45b153d767e7c28182796270b2482efde7bc407a /src/tools | |
parent | 4634ff903d1aaec59d545bd28a139d6cf2b95e0d (diff) |
Make the number of jobs in the worker configurable via an option
PiperOrigin-RevId: 161505952
Diffstat (limited to 'src/tools')
3 files changed, 50 insertions, 3 deletions
diff --git a/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/BUILD b/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/BUILD index 7e85b240e0..60d443338a 100644 --- a/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/BUILD +++ b/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/BUILD @@ -25,6 +25,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib:unix", "//src/main/java/com/google/devtools/build/lib:util", "//src/main/java/com/google/devtools/build/lib:vfs", + "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/remote", "//src/main/java/com/google/devtools/common/options", "//src/main/protobuf:option_filters_java_proto", diff --git a/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/ExecutionServer.java b/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/ExecutionServer.java index 034ff9ddc5..ec8dc956d0 100644 --- a/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/ExecutionServer.java +++ b/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/ExecutionServer.java @@ -85,9 +85,7 @@ final class ExecutionServer extends ExecutionImplBase { private final RemoteWorkerOptions workerOptions; private final SimpleBlobStoreActionCache cache; private final ConcurrentHashMap<String, ListenableFuture<ActionResult>> operationsCache; - private final ListeningExecutorService executorService = - MoreExecutors.listeningDecorator( - new ThreadPoolExecutor(0, 8, 1000, TimeUnit.SECONDS, new LinkedBlockingQueue<>())); + private final ListeningExecutorService executorService; public ExecutionServer( Path workPath, @@ -100,6 +98,13 @@ final class ExecutionServer extends ExecutionImplBase { this.workerOptions = workerOptions; this.cache = cache; this.operationsCache = operationsCache; + this.executorService = + MoreExecutors.listeningDecorator( + new ThreadPoolExecutor( + 1, workerOptions.jobs, // always have one thread available, and use at most jobs + 1000, TimeUnit.SECONDS, // shut down idle threads after 1000 seconds + // TODO(ulfjack): We need to reject work eventually. + new LinkedBlockingQueue<>())); // no blocking, we can always take more } @Override diff --git a/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/RemoteWorkerOptions.java b/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/RemoteWorkerOptions.java index e8bc12a781..b66e07b11b 100644 --- a/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/RemoteWorkerOptions.java +++ b/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/RemoteWorkerOptions.java @@ -14,9 +14,12 @@ package com.google.devtools.build.remote; +import com.google.devtools.build.lib.actions.LocalHostCapacity; +import com.google.devtools.common.options.Converters.RangeConverter; import com.google.devtools.common.options.Option; import com.google.devtools.common.options.OptionDocumentationCategory; import com.google.devtools.common.options.OptionsBase; +import com.google.devtools.common.options.OptionsParsingException; import com.google.devtools.common.options.proto.OptionFilters.OptionEffectTag; import java.util.List; @@ -116,4 +119,42 @@ public class RemoteWorkerOptions extends OptionsBase { help = "When using sandboxing, block network access for running actions." ) public boolean sandboxingBlockNetwork; + + @Option( + name = "jobs", + defaultValue = "auto", + converter = JobsConverter.class, + category = "build_worker", + documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, + effectTags = {OptionEffectTag.UNKNOWN}, + help = + "The maximum number of concurrent jobs to run. \"auto\" means to use a reasonable value" + + " derived from the machine's hardware profile (e.g. the number of processors)." + + " Values above " + MAX_JOBS + " are not allowed." + ) + public int jobs; + + private static final int MAX_JOBS = 16384; + + /** Converter for jobs: [0, MAX_JOBS] or "auto". */ + public static class JobsConverter extends RangeConverter { + public JobsConverter() { + super(0, MAX_JOBS); + } + + @Override + public Integer convert(String input) throws OptionsParsingException { + if (input.equals("auto")) { + int autoJobs = (int) Math.ceil(LocalHostCapacity.getLocalHostCapacity().getCpuUsage()); + return Math.min(autoJobs, MAX_JOBS); + } else { + return super.convert(input); + } + } + + @Override + public String getTypeDescription() { + return "\"auto\" or " + super.getTypeDescription(); + } + } } |