aboutsummaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
Diffstat (limited to 'ui')
-rw-r--r--ui/build/build.go5
-rw-r--r--ui/build/config.go36
-rw-r--r--ui/build/config_darwin.go4
-rw-r--r--ui/build/config_linux.go5
-rw-r--r--ui/build/environment.go12
5 files changed, 52 insertions, 10 deletions
diff --git a/ui/build/build.go b/ui/build/build.go
index 1c2d8648..de36dce9 100644
--- a/ui/build/build.go
+++ b/ui/build/build.go
@@ -46,8 +46,11 @@ func SetupOutDir(ctx Context, config Config) {
var combinedBuildNinjaTemplate = template.Must(template.New("combined").Parse(`
builddir = {{.OutDir}}
-pool local_pool
+{{if .UseRemoteBuild }}pool local_pool
depth = {{.Parallel}}
+{{end -}}
+pool highmem_pool
+ depth = {{.HighmemParallel}}
build _kati_always_build_: phony
{{if .HasKatiSuffix}}subninja {{.KatiBuildNinjaFile}}
subninja {{.KatiPackageNinjaFile}}
diff --git a/ui/build/config.go b/ui/build/config.go
index c0841713..9b19ede3 100644
--- a/ui/build/config.go
+++ b/ui/build/config.go
@@ -722,6 +722,33 @@ func (c *configImpl) Parallel() int {
return c.parallel
}
+func (c *configImpl) HighmemParallel() int {
+ if i, ok := c.environ.GetInt("NINJA_HIGHMEM_NUM_JOBS"); ok {
+ return i
+ }
+
+ const minMemPerHighmemProcess = 8 * 1024 * 1024 * 1024
+ parallel := c.Parallel()
+ if c.UseRemoteBuild() {
+ // Ninja doesn't support nested pools, and when remote builds are enabled the total ninja parallelism
+ // is set very high (i.e. 500). Using a large value here would cause the total number of running jobs
+ // to be the sum of the sizes of the local and highmem pools, which will cause extra CPU contention.
+ // Return 1/16th of the size of the local pool, rounding up.
+ return (parallel + 15) / 16
+ } else if c.totalRAM == 0 {
+ // Couldn't detect the total RAM, don't restrict highmem processes.
+ return parallel
+ } else if c.totalRAM <= 32*1024*1024*1024 {
+ // Less than 32GB of ram, restrict to 2 highmem processes
+ return 2
+ } else if p := int(c.totalRAM / minMemPerHighmemProcess); p < parallel {
+ // If less than 8GB total RAM per process, reduce the number of highmem processes
+ return p
+ }
+ // No restriction on highmem processes
+ return parallel
+}
+
func (c *configImpl) TotalRAM() uint64 {
return c.totalRAM
}
@@ -782,10 +809,11 @@ func (c *configImpl) UseRemoteBuild() bool {
// gomacc) are run in parallel. Note the parallelism of all other jobs is
// still limited by Parallel()
func (c *configImpl) RemoteParallel() int {
- if v, ok := c.environ.Get("NINJA_REMOTE_NUM_JOBS"); ok {
- if i, err := strconv.Atoi(v); err == nil {
- return i
- }
+ if !c.UseRemoteBuild() {
+ return 0
+ }
+ if i, ok := c.environ.GetInt("NINJA_REMOTE_NUM_JOBS"); ok {
+ return i
}
return 500
}
diff --git a/ui/build/config_darwin.go b/ui/build/config_darwin.go
index 480d8d1f..fe74e31d 100644
--- a/ui/build/config_darwin.go
+++ b/ui/build/config_darwin.go
@@ -22,7 +22,7 @@ import (
func detectTotalRAM(ctx Context) uint64 {
s, err := syscall.Sysctl("hw.memsize")
if err != nil {
- ctx.Printf("Failed to get system memory size: %s")
+ ctx.Printf("Failed to get system memory size: %v", err)
return 0
}
@@ -32,7 +32,7 @@ func detectTotalRAM(ctx Context) uint64 {
}
if len(s) != 8 {
- ctx.Printf("Failed to get system memory size, returned %d bytes, 8", len(s))
+ ctx.Printf("Failed to get system memory size, returned %d bytes, expecting 8 bytes", len(s))
return 0
}
diff --git a/ui/build/config_linux.go b/ui/build/config_linux.go
index 9e1bdc7f..162d372d 100644
--- a/ui/build/config_linux.go
+++ b/ui/build/config_linux.go
@@ -20,9 +20,8 @@ func detectTotalRAM(ctx Context) uint64 {
var info syscall.Sysinfo_t
err := syscall.Sysinfo(&info)
if err != nil {
- ctx.Printf("Failed to get system memory size: %s")
+ ctx.Printf("Failed to get system memory size: %v", err)
return 0
}
- memBytes := uint64(info.Totalram) * uint64(info.Unit)
- return memBytes
+ return uint64(info.Totalram) * uint64(info.Unit)
}
diff --git a/ui/build/environment.go b/ui/build/environment.go
index d8ff7f20..9bca7c06 100644
--- a/ui/build/environment.go
+++ b/ui/build/environment.go
@@ -19,6 +19,7 @@ import (
"fmt"
"io"
"os"
+ "strconv"
"strings"
)
@@ -44,6 +45,17 @@ func (e *Environment) Get(key string) (string, bool) {
return "", false
}
+// Get returns the int value associated with the key, and whether it exists
+// and is a valid int.
+func (e *Environment) GetInt(key string) (int, bool) {
+ if v, ok := e.Get(key); ok {
+ if i, err := strconv.Atoi(v); err == nil {
+ return i, true
+ }
+ }
+ return 0, false
+}
+
// Set sets the value associated with the key, overwriting the current value
// if it exists.
func (e *Environment) Set(key, value string) {