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
diff --git a/ui/build/build.go b/ui/build/build.go
index 1122733..89c3fad 100644
--- a/ui/build/build.go
+++ b/ui/build/build.go
@@ -141,7 +141,26 @@
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()