diff options
Diffstat (limited to 'ui')
-rw-r--r-- | ui/build/build.go | 5 | ||||
-rw-r--r-- | ui/build/config.go | 36 | ||||
-rw-r--r-- | ui/build/config_darwin.go | 4 | ||||
-rw-r--r-- | ui/build/config_linux.go | 5 | ||||
-rw-r--r-- | ui/build/environment.go | 12 |
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) { |