Better handling of low memory situations

Drop down to a single high-mem task when we've got <=16GB, as the system
probably isn't completely free RAM, ninja will be using a couple gigs,
along with whatever "normal" actions will be running concurrently. So
it's unlikely that we can handle two 6-8GB actions along with everything
else.

Also print warnings when we detect <=16GB total RAM, or when we're
running more parallel jobs than than we have GB RAM. These both notify
the user and suggest lowering the `-j` value if they run into problems.

Test: fake totalRAM to [0.5,8,16]GB, checking warning
Test: fake totalRAM to 17GB, `m -j4 nothing` has no warning
Test: `m -j187 nothing` on a 188GB system
Test: `m -j188 nothing` on a 188GB system
Change-Id: Ieb008e9f462d5f40fb65781d94cf116b1caf8446
This commit is contained in:
Dan Willemsen 2020-05-26 23:02:29 -07:00
parent 3f82e2426e
commit 570a292bab
2 changed files with 23 additions and 1 deletions

View file

@ -141,7 +141,26 @@ func help(ctx Context, config Config, what int) {
func Build(ctx Context, config Config, what int) {
ctx.Verboseln("Starting build with args:", config.Arguments())
ctx.Verboseln("Environment:", config.Environment().Environ())
ctx.Verbosef("Total RAM: %dGB", config.TotalRAM()/1024/1024/1024)
if totalRAM := config.TotalRAM(); totalRAM != 0 {
ram := float32(totalRAM) / (1024 * 1024 * 1024)
ctx.Verbosef("Total RAM: %.3vGB", ram)
if ram <= 16 {
ctx.Println("************************************************************")
ctx.Printf("You are building on a machine with %.3vGB of RAM\n", ram)
ctx.Println("")
ctx.Println("The minimum required amount of free memory is around 16GB,")
ctx.Println("and even with that, some configurations may not work.")
ctx.Println("")
ctx.Println("If you run into segfaults or other errors, try reducing your")
ctx.Println("-j value.")
ctx.Println("************************************************************")
} else if ram <= float32(config.Parallel()) {
ctx.Printf("Warning: high -j%d count compared to %.3vGB of RAM", config.Parallel(), ram)
ctx.Println("If you run into segfaults or other errors, try a lower -j value")
}
}
ctx.BeginTrace(metrics.Total, "total")
defer ctx.EndTrace()

View file

@ -737,6 +737,9 @@ func (c *configImpl) HighmemParallel() int {
} else if c.totalRAM == 0 {
// Couldn't detect the total RAM, don't restrict highmem processes.
return parallel
} else if c.totalRAM <= 16*1024*1024*1024 {
// Less than 16GB of ram, restrict to 1 highmem processes
return 1
} else if c.totalRAM <= 32*1024*1024*1024 {
// Less than 32GB of ram, restrict to 2 highmem processes
return 2