Skip to content

Commit

Permalink
Adds flag --experimental_dynamic_execution_cpu_limited that prevent…
Browse files Browse the repository at this point in the history
…s doing more dynamic execution threads than we have CPUs for.

Spinning up many threads and their various actions can take serious time, we have seen up to 18% slowdown. This limits the number of threads, improving cold build time while keeping the improvements for incremental builds. The downside is that with this, remote timeouts are much less likely to be avoided by the local finishing first.

PiperOrigin-RevId: 415474342
  • Loading branch information
larsrc-google authored and copybara-github committed Dec 10, 2021
1 parent c5da3c9 commit 043d729
Show file tree
Hide file tree
Showing 6 changed files with 217 additions and 166 deletions.
2 changes: 2 additions & 0 deletions src/main/java/com/google/devtools/build/lib/dynamic/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,13 @@ java_library(
name = "dynamic",
srcs = glob(["*.java"]),
deps = [
"//src/main/java/com/google/devtools/build/lib:build-request-options",
"//src/main/java/com/google/devtools/build/lib:runtime",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/actions:execution_requirements",
"//src/main/java/com/google/devtools/build/lib/concurrent",
"//src/main/java/com/google/devtools/build/lib/events",
"//src/main/java/com/google/devtools/build/lib/exec:execution_options",
"//src/main/java/com/google/devtools/build/lib/exec:execution_policy",
"//src/main/java/com/google/devtools/build/lib/exec:spawn_strategy_registry",
"//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.google.devtools.build.lib.actions.Spawn;
import com.google.devtools.build.lib.actions.SpawnStrategy;
import com.google.devtools.build.lib.actions.Spawns;
import com.google.devtools.build.lib.buildtool.BuildRequestOptions;
import com.google.devtools.build.lib.buildtool.BuildResult;
import com.google.devtools.build.lib.buildtool.buildevent.BuildCompleteEvent;
import com.google.devtools.build.lib.concurrent.ExecutorUtil;
Expand Down Expand Up @@ -133,18 +134,25 @@ private ImmutableMap<String, List<String>> getRemoteStrategies(DynamicExecutionO
public void registerSpawnStrategies(
SpawnStrategyRegistry.Builder registryBuilder, CommandEnvironment env)
throws AbruptExitException {
DynamicExecutionOptions options = env.getOptions().getOptions(DynamicExecutionOptions.class);
com.google.devtools.build.lib.exec.ExecutionOptions execOptions =
env.getOptions().getOptions(com.google.devtools.build.lib.exec.ExecutionOptions.class);
registerSpawnStrategies(
registryBuilder,
env.getOptions().getOptions(DynamicExecutionOptions.class),
env.getReporter());
options,
env.getReporter(),
options.cpuLimited
? (int) execOptions.localCpuResources
: env.getOptions().getOptions(BuildRequestOptions.class).jobs);
}

// CommandEnvironment is difficult to access in tests, so use this method for testing.
@VisibleForTesting
final void registerSpawnStrategies(
SpawnStrategyRegistry.Builder registryBuilder,
DynamicExecutionOptions options,
Reporter reporter)
Reporter reporter,
int numCpus)
throws AbruptExitException {
if (!options.internalSpawnScheduler) {
return;
Expand All @@ -156,7 +164,8 @@ final void registerSpawnStrategies(
options,
this::getExecutionPolicy,
this::getPostProcessingSpawnForLocalExecution,
firstBuild);
firstBuild,
numCpus);
registryBuilder.registerStrategy(strategy, "dynamic", "dynamic_worker");
registryBuilder.addDynamicLocalStrategies(getLocalStrategies(options));
registryBuilder.addDynamicRemoteStrategies(getRemoteStrategies(options));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,16 @@ public class DynamicExecutionOptions extends OptionsBase {
+ "enabled.")
public boolean internalSpawnScheduler;

@Option(
name = "experimental_dynamic_execution_cpu_limited",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
defaultValue = "false",
help =
"If true, the number of parallel dynamic executions is limited to the number of CPUs. "
+ "The number of CPUs available can be set with the --local_cpu_resources flag.")
public boolean cpuLimited;

@Option(
name = "dynamic_local_strategy",
converter = Converters.StringToStringListConverter.class,
Expand Down
Loading

0 comments on commit 043d729

Please sign in to comment.